如何在RadGrid中的每一行上创建单独的DetailTable?

时间:2016-08-23 13:41:06

标签: telerik radgrid radgridview

我有一个telerik radgrid,其中列和详细信息表声明如下:

<telerik:RadGrid>
  <Columns>
    <telerik:GridBoundColumn/>
    <telerik:GridBoundColumn/>
  </Columns>
  <DetailTables>
    <telerik:GridTableView
      <Columns>
        <telerik:GridBoundColumn/>
        <telerik:GridBoundColumn/>
      </Columns>
    </telerik:GridTableView
  </DetailTables>
</telerik:RadGrid>

这给出了这样的嵌套网格:

nested grid

现在,我想要的是能够以编程方式为每行指定一个详细信息表(那些子表)。

(我不能确定扩展行fgvbvb时出现的嵌套表的列与扩展行xcxcv时的列相同。)

我试过,在radgrid的OnDataBound处理程序中没有运气(我省略了<DetailTables>)来访问嵌套表的数据结构,如下所示:

    protected void OnRadGridDataBound(object sender, EventArgs e)
    {
        foreach (GridDataItem item in grdActivitiesToCopy.MasterTableView.Items)
        {
            var dg = item.ChildItem.NestedTableViews[0];

        }
    }

这将覆盖数组NestedTableViews,因为它是空的。另外,item.ChildItem.NestedTableViews没有setter。

如何手动逐个用详细信息表填充每一行?

2 个答案:

答案 0 :(得分:1)

首先,因为asp页面的生命线索。您无法访问详细信息表上的活动。

如果您需要访问详细信息表,项目等。
您需要在 MasterTableView 中的 PreRender 中添加一个方法,如下所示:

<MasterTableView   DataSourceID="myDataSource"
                   AllowMultiColumnSorting="True" 
                   DataKeyNames="Key1,Key2,KeyN" 
                   HierarchyDefaultExpanded="True"
                   OnPreRender="Unnamed_PreRender" >

该方法将递归遍历网格。
你的方式可以根据 HieararchyLoadMode 而改变。

所以这是我的方法,如果您使用的是Client或Serverbind模式,最简单的方法就存在。

telerik doc 遍历和加载模式。

我很确定你不想:

  

&#34;用手动逐个填充详细信息表&#34;

您希望网格中的子级别具有多个表格,并以编程方式显示一个表格。

这可以通过两个简单的步骤完成:

<强> 1 /。在apsx页面中创建每个详细信息表。
有关更多信息,请参阅此文档: Several tables at a level

<强> 2 /。处理显示:

protected void Unnamed_PreRender(object sender, EventArgs e)
{
  if (!IsPostBack) myControler(MASTERGRID.MasterTableView);
}

 private void myControler(GridTableView gridTableView)
{
    GridItem[] nestedViewItems = gridTableView.GetItems(GridItemType.NestedView);

    foreach (GridNestedViewItem nestedViewItem in nestedViewItems)
    {
        foreach (GridTableView nestedView in nestedViewItem.NestedTableViews)
        {

            if (nestedView.Name == "mytable12" && nestedView.Items.Count == 0)
            { HideExpandColumn(nestedView, nestedView.ParentItem["ExpandColumn"]); }

            else if (nestedView.Name == "mytable23")
            {
                if (nestedView.Items.Count == 0)// 
                    HideExpandColumn(nestedView, nestedView.ParentItem["ExpandColumn"]);
                else
                { }
            }
            if (nestedView.HasDetailTables)
                { myControler(nestedView); }
        }
    }
}

private void HideExpandColumn(GridTableView _GNVI, TableCell _cell)
{
    if (_cell.Controls.Count > 0)
    {
        _cell.Controls[0].Visible = false;
        _cell.Text = " ";
    }
    _GNVI.Visible = false;
}

您可以使用以下方式隐藏详细信息表:

HideExpandColumn(nestedView, nestedView.ParentItem["ExpandColumn"]);

或者您可以使用控制器参数中的详细信息表隐藏您测试的详细信息表的父级:

HideExpandColumn(gridTableView, nestedView.ParentItem["ExpandColumn"]);

HideExpandColumn将隐藏有时会保留的扩展控件,即使您隐藏了详细信息表。

奖励:如果您需要访问详细信息表格中的控件。 你可以用这个:

public static class ControlExtensions
{
public static Control FindIt(this Control control, string id)
{
    if (control == null) return null;
    Control ctrl = control.FindControl(id);
    if (ctrl == null)
    {
        foreach (Control child in control.Controls)
        {
            ctrl = FindIt(child, id);
            if (ctrl != null) break;
        }
    }
    return ctrl;
}
}

在你的控制器中调用它:

else if (nestedView.Name == "DetailPV")
                {
                    if (nestedView.Items.Count == 0)
                        HideExpandColumn(gridTableView, nestedView.ParentItem["ExpandColumn"]);
                    else
                    {

                        RadLabel ctrl = (RadLabel)this.FindIt("RadLabel11");
                        ctrl.Text += "<b>" + nestedView.Items.Count.ToString() + "</b>";
                    }

答案 1 :(得分:1)

据Telerik说:

  

RadGrid不支持将声明性网格列与网格混合   在运行时动态添加的列。你应该创建所有   以编程方式在网格中的列,或者在其中全部定义它们   ASPX文件。创建详细信息表时,应在中创建    PageInit 事件。

以编程方式创建分层网格:

  

您应该按照这些基本步骤创建分层结构   RadGrid以编程方式在代码隐藏中(具有数据源)   控制数据内容生成):

     
      
  1. 在页面的 Page_Init 处理程序中动态创建网格   调用它的构造函数。

  2.   
  3. 通过其指定网格实例的首选设置   属性。

  4.   
  5. 动态创建网格列。请记住,你必须这样做   首先设置它们的属性,然后将它们添加到    MasterTableView / GridTableView 集合(在第一篇中讨论过   同一主题的段落)。因此,他们的 ViewState 将是正确的   持久化(在 Init 事件之后引发 LoadViewState   页)。

  6.   
  7. GridTableViews 设置正确的 ParentTableRelations (以及   他们的 MasterKeyField DetailKeyField 属性)和 DataKeyNames   对于页面代码隐藏中的 MasterTableView / GridTableViews

  8.   
  9. 为每个数据源分配数据源(通过DataSourceID属性)   网格层次结构中的表。如果您不想使用声明性   关系,生成 NeedDataSource / DetailTableDataBind 中的数据   网格的处理程序。在 DetailTableDataBind 上,您可以确定哪个   数据源应该与当前绑定的 GridTableView 相关联   检查其名称 / DataSourceID 属性。此处,名称属性必须   为每个明细表都有一个唯一的值(这个值必须是   之前由开发人员定义) DataSourceID 是ID   DataSource控件负责相应的详细信息表   内容生成。

  10.   

代码示例:

    RadGrid RadGrid1 = new RadGrid();
    RadGrid1.DataSourceID = "SqlDataSource1";
    RadGrid1.MasterTableView.DataKeyNames = new string[] { "CustomerID" };
    RadGrid1.Skin = "Default";
    RadGrid1.Width = Unit.Percentage(100);
    RadGrid1.PageSize = 15;
    RadGrid1.AllowPaging = true;
    RadGrid1.AutoGenerateColumns = false;
    //Add columns
    GridBoundColumn boundColumn;
    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "CustomerID";
    boundColumn.HeaderText = "CustomerID";
    RadGrid1.MasterTableView.Columns.Add(boundColumn);
    boundColumn = new GridBoundColumn();
    boundColumn.DataField = "ContactName";
    boundColumn.HeaderText = "Contact Name";
    RadGrid1.MasterTableView.Columns.Add(boundColumn);

    //Detail table - Orders (II in hierarchy level)
    GridTableView tableViewOrders = new GridTableView(RadGrid1);
    tableViewOrders.DataSourceID = "SqlDataSource2";
    tableViewOrders.DataKeyNames = new string[] { "OrderID" };
    GridRelationFields relationFields = new GridRelationFields();
    relationFields.MasterKeyField = "CustomerID";
    relationFields.DetailKeyField = "CustomerID";
    tableViewOrders.ParentTableRelation.Add(relationFields);
    RadGrid1.MasterTableView.DetailTables.Add(tableViewOrders);

有关详细信息,请参阅此帮助文章: http://docs.telerik.com/devtools/aspnet-ajax/controls/grid/defining-structure/creating-a-radgrid-programmatically#creating-a-hierarchical-grid-programmatically