【问题标题】:How can I make RadGrid expand only one detail table based on the command clicked?如何使 RadGrid 根据单击的命令仅展开一个详细信息表?
【发布时间】:2015-08-14 13:46:50
【问题描述】:

我有一个带有两个子视图的主视图。我想在主行上有命令按钮,这会导致一个或其他子表发生扩展。当我处理 ItemCommand 事件时,我将所有详细信息表隐藏设置为 Visible=False,但它们在输出中仍然可见。

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

if (e.CommandName == "ExpandSomething")
{
    item.Expanded = true;
    foreach (var table in MyGrid.MasterTableView.DetailTables)
        if (table.Name != "Something")
            table.Visible = false;
}

这对网格没有影响。

然后我想也许隐藏需要在事件周期的后期完成,所以我这样尝试:

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 之前触发,所以我无法确定是否按下了详细信息按钮.

对于像描述的那样的条件详细视图还有其他想法吗?

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

<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>

【问题讨论】:

  • 如果您能提供网格标记 (aspx) 代码,那就太好了。

标签: asp.net telerik telerik-grid radgrid


【解决方案1】:

请尝试以下代码 sn-p。

ASPX

<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

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:在全网格中只显示1个子网格。

ASPX.CS

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;
            }
        }
    }
}

如果有任何问题,请告诉我。

【讨论】:

  • 完美——这里的关键是劫持 DetailTableDataBind 事件来设置可见性。我让 ItemCommand 用我想要的表名设置了一个实例变量,然后将 item.Expanded 设置为 true,这会触发 DetailTableDataBind,我已经根据实例变量设置了可见性。谢谢!
猜你喜欢
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多