首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使RadGrid仅根据单击的命令展开一个详细表?

如何使RadGrid仅根据单击的命令展开一个详细表?
EN

Stack Overflow用户
提问于 2015-08-14 13:46:50
回答 1查看 5.9K关注 0票数 0

我有一个主视图和两个子视图。我希望主行上有命令按钮,这会使一个或另一个子表发生展开。当我处理ItemCommand事件时,我隐藏了将所有细节表设置为Visible=False,但它们在输出中仍然可见。

我尝试在ItemCommand事件中设置详细表的扩展和可见性,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
if (e.CommandName == "ExpandSomething")
{
    item.Expanded = true;
    foreach (var table in MyGrid.MasterTableView.DetailTables)
        if (table.Name != "Something")
            table.Visible = false;
}

这对电网没有影响。

然后,我想,也许在事件周期的后期需要进行隐藏,所以我尝试了如下:

代码语言:javascript
代码运行次数:0
运行
复制
private string _activeChildView = null;
protected void ShowSingleChildTable(string name) //this is called from item command
{
    _activeChildView = name;
}

private void Page_PreRender(object sender, EventArgs e)
{
    if (_activeChildView != null)
        foreach (var table in AdminGrid.MasterTableView.DetailTables)
            if (table.Name != _activeChildView)
                table.Visible = false;
}

这两种方法都不起作用--两个网格都是可见的。

在处理不同事件时,我发现DataBinding事件是唯一将可见性设置为false工作的地方,但不幸的是,在ItemCommand之前触发,因此我无法确定是否按下了详细信息按钮。

对于有条件的细节视图还有其他的想法,如所描述的吗?

编辑,这是标记,如果您认为它会有帮助的话。我删除了不需要的列定义:

代码语言:javascript
代码运行次数:0
运行
复制
<asp:EntityDataSource ID="EntityDataSourceThinges" runat="server"
    ConnectionString="name=MyProjectEntities"
    EntitySetName="Thinges" DefaultContainerName="MyProjectEntities"
    EnableDelete="true" EnableUpdate="true" EnableInsert="true"
    Include="ThingSomethings"
    OrderBy="it.Title"
    Where="it.Title like '%' + @Title + '%' or @Title is null">
    <WhereParameters>
        <asp:ControlParameter ControlID="txtSearch" DefaultValue="%" Name="Title" PropertyName="Text" Type="String" />
    </WhereParameters>
</asp:EntityDataSource>

<asp:EntityDataSource ID="EntityDataSourceThingSomethings" runat="server"
    ConnectionString="name=MyProjectEntities"
    EntitySetName="ThingSomethings" DefaultContainerName="MyProjectEntities"
    EnableDelete="true" EnableUpdate="true"
    AutoGenerateWhereClause="true">
    <WhereParameters>
        <asp:SessionParameter Name="ThingID" SessionField="ThingID" Type="Int32" />
    </WhereParameters>
</asp:EntityDataSource>

<asp:EntityDataSource ID="EntityDataSourceImages" runat="server"
    ConnectionString="name=MyProjectEntities"
    EntitySetName="MyProjectImages" DefaultContainerName="MyProjectEntities"
    EnableDelete="true" EnableUpdate="true" EnableInsert="true"
    AutoGenerateWhereClause="true"
    OrderBy="it.Sequence">
    <WhereParameters>
        <asp:SessionParameter Name="ThingID" SessionField="ThingID" Type="Int32" />
    </WhereParameters>
</asp:EntityDataSource>

Search by title:
<asp:TextBox runat="server" ID="txtSearch" /><asp:Button runat="server" Text="Search" />

<telerik:RadGrid ID="DnnGrid1" runat="server"
    DataSourceID="EntityDataSourceThinges"
    ImagesPath="~/images"
    AllowPaging="false" AllowSorting="true" 
    AllowAutomaticUpdates="true" AllowAutomaticInserts="true" AllowAutomaticDeletes="true">
    <MasterTableView AutoGenerateColumns="false" CommandItemDisplay="TopAndBottom"
        HierarchyLoadMode="ServerOnDemand" ExpandCollapseColumn-Visible="false"
        DataKeyNames="ThingID">
        <Columns>
            ...
            <telerik:GridButtonColumn Text="Expand Something" CommandName="ExpandSomething" />
            <telerik:GridButtonColumn Text="Expand Something Else" CommandName="ExpandSomethingElse" />
            ...
            <telerik:GridButtonColumn ButtonType="ImageButton" CommandName="Delete" ConfirmText="Are you sure you want to permenently delete this record?" />
        </Columns>
        <DetailTables>
            <telerik:GridTableView runat="server" Name="Images" DataKeyNames="MyProjectImageID" DataSourceID="EntityDataSourceImages"
                AutoGenerateColumns="false"
                AllowAutomaticUpdates="true" AllowAutomaticInserts="true" AllowAutomaticDeletes="true"
                CommandItemDisplay="TopAndBottom">
                <ParentTableRelation>
                    <telerik:GridRelationFields MasterKeyField="ThingID" DetailKeyField="ThingID" />
                </ParentTableRelation>
                <Columns>
                    ...
                </Columns>
            </telerik:GridTableView>
            <telerik:GridTableView runat="server" Name="Something" DataSourceID="EntityDataSourceThingSomethings"
                AutoGenerateColumns="false" 
                AllowAutomaticUpdates="true" AllowAutomaticDeletes="true"
                CommandItemDisplay="TopAndBottom" DataKeyNames="SomethingID,ThingID">
                <ParentTableRelation>
                    <telerik:GridRelationFields MasterKeyField="ThingID" DetailKeyField="ThingID" />
                </ParentTableRelation>
                <Columns>
                    ...
                </Columns>
                <EditFormSettings EditFormType="AutoGenerated" />
                <CommandItemSettings ShowAddNewRecordButton="false" />
            </telerik:GridTableView>
        </DetailTables>
        <EditFormSettings EditFormType="AutoGenerated" />
    </MasterTableView>
</telerik:RadGrid>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-14 17:54:37

请尝试使用下面的代码片段。

ASPX

代码语言:javascript
代码运行次数:0
运行
复制
<telerik:RadGrid ID="RadGrid1" runat="server" OnNeedDataSource="RadGrid1_NeedDataSource" OnDetailTableDataBind="RadGrid1_DetailTableDataBind"
    OnItemCommand="RadGrid1_ItemCommand" AutoGenerateColumns="false">
    <MasterTableView DataKeyNames="ID">
        <Columns>
            <telerik:GridBoundColumn DataField="ID" UniqueName="ID" HeaderText="ID">
            </telerik:GridBoundColumn>
            <telerik:GridButtonColumn Text="Expand Something" CommandName="ExpandSomething" />
            <telerik:GridButtonColumn Text="Expand Something Else" CommandName="ExpandSomethingElse" />
        </Columns>
        <DetailTables>
            <telerik:GridTableView runat="server" Name="Images" AutoGenerateColumns="false" CommandItemDisplay="TopAndBottom">
                <Columns>
                    <telerik:GridBoundColumn DataField="ID" UniqueName="ID" HeaderText="ID">
                    </telerik:GridBoundColumn>
                </Columns>
            </telerik:GridTableView>
                <telerik:GridTableView runat="server" Name="Something" AutoGenerateColumns="false" CommandItemDisplay="TopAndBottom">
                <Columns>
                    <telerik:GridBoundColumn DataField="ID" UniqueName="ID" HeaderText="ID">
                    </telerik:GridBoundColumn>
                </Columns>
            </telerik:GridTableView>
        </DetailTables>
    </MasterTableView>
</telerik:RadGrid>

方法1:在每一行中只显示一个子网格。

ASPX.CS

代码语言:javascript
代码运行次数:0
运行
复制
protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
    dynamic data = new[] {
new { ID = 1, Name ="Name1"},
new { ID = 2, Name ="Name2"} };
    RadGrid1.DataSource = data;
}

protected void RadGrid1_DetailTableDataBind(object sender, GridDetailTableDataBindEventArgs e)
{
    GridDataItem parentItem = e.DetailTableView.ParentItem as GridDataItem;
    if (e.DetailTableView.Name == "Images")
    {
        dynamic data = new[] {
        new { ID = 11, Name ="Name11"},
        new { ID = 12, Name ="Name12"} };
        e.DetailTableView.DataSource = data;
    }
    else if (e.DetailTableView.Name == "Something")
    {
        dynamic data = new[] {
        new { ID = 111, Name ="Name111"},
        new { ID = 112, Name ="Name112"} }; 
        e.DetailTableView.DataSource = data;
    }
}

protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e)
{
    if (e.CommandName == "ExpandSomething")
    {
        GridDataItem item = e.Item as GridDataItem;
        item.Expanded = true;

        if (e.Item.HasChildItems)
        {
            item.ChildItem.NestedTableViews[0].Visible = false;
            item.ChildItem.NestedTableViews[1].Visible = true;
        }
    }
    else if (e.CommandName == "ExpandSomethingElse")
    {
        GridDataItem item = e.Item as GridDataItem;
        item.Expanded = true;

        if (e.Item.HasChildItems)
        {
            item.ChildItem.NestedTableViews[0].Visible = true;
            item.ChildItem.NestedTableViews[1].Visible = false;
        }
    }
}

方法2:在完整网格中只显示一个子网格。

ASPX.CS

代码语言:javascript
代码运行次数:0
运行
复制
protected void RadGrid1_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
    dynamic data = new[] {
new { ID = 1, Name ="Name1"},
new { ID = 2, Name ="Name2"} };
    RadGrid1.DataSource = data;
}

protected void RadGrid1_DetailTableDataBind(object sender, GridDetailTableDataBindEventArgs e)
{
    GridDataItem parentItem = e.DetailTableView.ParentItem as GridDataItem;
    if (e.DetailTableView.Name == "Images")
    {
        dynamic data = new[] {
        new { ID = 11, Name ="Name11"},
        new { ID = 12, Name ="Name12"} };
        e.DetailTableView.DataSource = data;
    }
    else if (e.DetailTableView.Name == "Something")
    {
        dynamic data = new[] {
        new { ID = 111, Name ="Name111"},
        new { ID = 112, Name ="Name112"} }; 
        e.DetailTableView.DataSource = data;
    }
}

protected void RadGrid1_ItemCommand(object sender, GridCommandEventArgs e)
{
    if (e.CommandName == "ExpandSomething")
    {
        GridDataItem item = e.Item as GridDataItem;
        item.Expanded = true;

        if (e.Item.HasChildItems)
        {
            item.ChildItem.NestedTableViews[0].Visible = false;
            item.ChildItem.NestedTableViews[1].Visible = true;
        }

        foreach (GridDataItem otheritem in RadGrid1.MasterTableView.Items)
        {
            if (otheritem.Expanded && item.GetDataKeyValue("ID").ToString() != otheritem.GetDataKeyValue("ID").ToString())
            {
                otheritem.Expanded = false;
            }
        }
    }
    else if (e.CommandName == "ExpandSomethingElse")
    {
        GridDataItem item = e.Item as GridDataItem;
        item.Expanded = true;

        if (e.Item.HasChildItems)
        {
            item.ChildItem.NestedTableViews[0].Visible = true;
            item.ChildItem.NestedTableViews[1].Visible = false;
        }

        foreach (GridDataItem otheritem in RadGrid1.MasterTableView.Items)
        {
            if (otheritem.Expanded && item.GetDataKeyValue("ID").ToString() != otheritem.GetDataKeyValue("ID").ToString())
            {
                otheritem.Expanded = false;
            }
        }
    }
}

如果有任何担心的话请告诉我。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32011698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档