2016-08-23 2 views
0

У меня есть Telerik radgrid, где колонны и подробно таблицы объявляются как:Как создать отдельный DetailTable для каждой строки в 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).

Я попытался, без удачи в обработчике OnDataBound из radgrid (в котором я пропущенной <DetailTables>), чтобы получить доступ к структуре данных для вложенных таблиц, как это:

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

     } 
    } 

Это overindex в NestedTableViews массива потому, что он пусто. Кроме того, item.ChildItem.NestedTableViews не имеет сеттера.

Как заполнить каждую строку таблицей подробностей вручную?

+1

Если я не ошибаюсь, при работе с подчиненной таблиц вы не используете NestedTableViews, поскольку это другой инструмент. У вас есть таблицы деталей и вложенные таблицы, которые не могут обращаться друг к другу. Если вы просто хотите добавить gridview к каждой строке, то вам нужен GridTemplateColumn в вашем radgrid, и вы можете заполнить сетку столбцов шаблона из кода позади. Это то, что вы хотели? – Kramb

ответ

1

Прежде всего, из-за жизни cialle asp-страницы. Вы не можете получить доступ к событию в таблице подробностей.

Если вам необходимо получить доступ к детализации таблицы, элементы и т.д ..
Вам нужно добавить метод к PreRender в MasterTableView так:

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

Метод рекурсивно перебирать через сетку.
Способ, которым вы это делаете, может измениться в зависимости от вашего HieararchyLoadMode.

Так что это мой способ сделать это, самый простой способ существует, если вы находитесь в режиме Client или Serverbind.

Перемещение и режим нагрузки на telerik doc.

Я уверен, что вы не хотите:

«заполнить каждую строку с детальной таблицей по одному вручную»

Вы хотите иметь несколько таблицы на уровне Sub в вашей сетке и отображать программный уровень.

И это может быть сделано в два простых шага:

1 /. Создайте каждую таблицу Detail на странице 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

По Telerik:

RadGrid не поддерживает смешивание декларативных сетки колонн с сеткой колонн динамически добавляется во время выполнения. Вы должны либо создать все столбцы в сетке программно, либо определить их все в файле ASPX . При создании подробных таблиц он должен быть создан в событии PageInit.

Создание иерархической сетки Программная:

Вы должны следовать за этими основными шагами, чтобы создать иерархическую RadGrid программно в коде-за (имея источника данных управления для данных генерации контента):

  1. Создание сетки динамически в Page_Init обработчике страницы по , вызывающий его конструктор.

  2. Укажите предпочтительные настройки для экземпляра сетки через свои свойства .

  3. Создание столбцов для сетки динамически. Имейте в виду, что у вас есть , сначала установили их свойства, а затем добавили их в Коллекция MasterTableView/GridTableView (обсуждается в первом абзаце этой же темы). Таким образом, их ViewState будет правильно сохранялось (как LoadViewState поднят после Init случае страницы).

  4. Установите соответствующие ParentTableRelations для GridTableViews (наряду с их MasterKeyField и DetailKeyField атрибутов) и DataKeyNames для MasterTableView/GridTableViews в код-позади страница.

  5. Присвоить источники данных (с помощью атрибута DataSourceID) для каждого таблицы в сетке hierarchy.If вы не хотите использовать декларативные отношений, генерировать данные в NeedDataSource/DetailTableDataBind обработчики сетка. На DetailTableDataBind вы можете определить, какой источник данных должны быть связаны с текущим связанной GridTableView путем проверки его Имени/DataSourceID недвижимости. Здесь Имени свойства должно иметь уникальное значение для каждой таблицы детализации (это значение должно быть определенно ранее разработчиком) и DataSourceID является идентификатором контрольного источника данных отвечают за соответствующую таблицу подробно создание контента.

Пример кода:

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

+0

'По словам Телерика: Радгрид не поддерживает обоих.' Это ложь. Это старая ложь. –

Смежные вопросы