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

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

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

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

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

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

这对电网没有影响。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
<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 09:54:37

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

ASPX

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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

复制
相关文章

相似问题

详细表展开的RadGrid刷新

21

如何使HTML表在单击时展开?

65

在materia表中。当我单击按钮展开行时,它会展开所有行。如何使仅选定的行将展开?

11

仅展开单击的列。

33

如何通过单击使Cardview展开?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文