Greetings,
I have an odd request. I am making a 3-table hierarchy grid and I need the for the data source of the 3rd grid, to use a List from it's parent grid( the 2nd grid in the hierarchy).
Grid A - datasource is a List<EventDto> called "results"
Grid B - datasource is one or more records of type List<EntityDto> called "details." Details has several fields that are displayed, and it also has another List, of type <EntityRowDto>, and it is possible to have one or more of these (which is why I need a 3rd grid).
So how do I pull out all <EntityRowDto> records for a given detail and set it as the datasource for Grid C?
ASP.NET Markup for the grid:
<telerik:RadGrid ID="radGridNewAuditLog" runat="server" AutoGenerateColumns="False"
GridLines="None" Skin="Office2007" AllowFilteringByColumn="True" AllowPaging="True"
AllowSorting="True" OnNeedDataSource="radGridNewAuditLog_NeedDataSource" EnableLinqExpressions="False"
Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Size="Small"
Font-Strikeout="False" Font-Underline="False"
OnDetailTableDataBind="radGridNewAuditLog_DetailTableDatabind"
OnPreRender="radGridNewAuditLog_PreRender">
<ClientSettings Selecting-AllowRowSelect="false" EnableRowHoverStyle="true">
<ClientEvents />
</ClientSettings>
<PagerStyle Position="TopAndBottom" />
<MasterTableView PageSize="20" EnableNoRecordsTemplate="true" ShowHeadersWhenNoRecords="true"
Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Size="Small"
Font-Strikeout="False" Font-Underline="False" DataKeyNames="SessionId" HierarchyDefaultExpanded="true"
HierarchyLoadMode="ServerOnDemand">
<DetailTables>
<telerik:GridTableView Name="Details" DataKeyNames="EntityId" HierarchyDefaultExpanded="true">
<Columns>
<telerik:GridBoundColumn DataField="EntityId" UniqueName="EntityId" Visible="true"/>
<telerik:GridBoundColumn DataField="EntityName" HeaderText="Entity Name" UniqueName="EntityName"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true"/>
<telerik:GridBoundColumn DataField="EntitySystem" HeaderText="System" UniqueName="EntitySystem"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true"/>
</Columns>
</telerik:GridTableView>
</DetailTables>
<RowIndicatorColumn>
<HeaderStyle Width="20px"></HeaderStyle>
</RowIndicatorColumn>
<ExpandCollapseColumn>
<HeaderStyle Width="20px"></HeaderStyle>
</ExpandCollapseColumn>
<Columns>
<telerik:GridBoundColumn DataField="EventType" HeaderText="Event" UniqueName="EventType"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true"/>
<telerik:GridBoundColumn DataField="Username" HeaderText="User" UniqueName="Username"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true" />
<telerik:GridBoundColumn DataField="Description" HeaderText="Description" UniqueName="Description"
AllowFiltering="false" />
<telerik:GridBoundColumn DataField="InitiatingApp" HeaderText="Initiating App" UniqueName="InitiatingApp"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true" />
<telerik:GridBoundColumn DataField="EventId" UniqueName="EventId" Visible="false"/>
<telerik:GridBoundColumn HeaderText="Created On" ItemStyle-Width="160px" UniqueName="CreatedOn" DataField="CreatedOn"
AllowFiltering="false" DataType="System.DateTime" DataFormatString="{0:MM/dd/yyyy hh:mm tt CT}">
</telerik:GridBoundColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
C# CodeBehind:
protected void radGridNewAuditLog_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
if (!e.IsFromDetailTable)
SetGridDataSource();
}
protected void radGridNewAuditLog_DetailTableDatabind(object sender, Telerik.Web.UI.GridDetailTableDataBindEventArgs e)
{
GridDataItem dataItem = (GridDataItem)e.DetailTableView.ParentItem;
List<EntityDto> details = new List<EntityDto>();
switch (e.DetailTableView.Name)
{
case "Details":
{
LoggingRepository logrepodetails = new LoggingRepository();
TableCell cellEventId = dataItem["EventId"];
string strEventId = cellEventId.Text;
int eventId = -1;
int.TryParse(strEventId, out eventId);
if (eventId <= 0)
return;
details = logrepodetails.GetEventDetails(eventId);
e.DetailTableView.DataSource = details;
break;
}
}
}
protected void SetGridDataSource()
{
LoggingRepository logrepo = new LoggingRepository();
List<string> et = new List<string>();
List<EventDto> results=null;
if (_userid == null)
results = logrepo.GetEvents(new Guid(), et, (DateTime)FromDateText.SelectedDate, (DateTime)ToDateText.SelectedDate); //All are optional. If dates are blank I default to last 5 days
else
{
Guid gUserId = new Guid(_userid);
results = logrepo.GetEvents(gUserId, et, (DateTime)FromDateText.SelectedDate, (DateTime)ToDateText.SelectedDate); //All are optional. If dates are blank I default to last 5 days
}
if (results.Count == 0)
return;
radGridNewAuditLog.DataSource = results;
}
protected void radGridNewAuditLog_PreRender(object sender, EventArgs e)
{
HideExpandColumnRecursive(radGridNewAuditLog.MasterTableView);
}
public void HideExpandColumnRecursive(GridTableView tableView)
{
GridItem[] nestedViewItems = tableView.GetItems(GridItemType.NestedView);
foreach (GridNestedViewItem nestedViewItem in nestedViewItems)
{
foreach (GridTableView nestedView in nestedViewItem.NestedTableViews)
{
if (nestedView.Items.Count == 0)
{
TableCell cell = nestedView.ParentItem["ExpandColumn"];
cell.Controls[0].Visible = false;
nestedViewItem.Visible = false;
}
if (nestedView.HasDetailTables)
{
HideExpandColumnRecursive(nestedView);
}
}
}
}
I have an odd request. I am making a 3-table hierarchy grid and I need the for the data source of the 3rd grid, to use a List from it's parent grid( the 2nd grid in the hierarchy).
Grid A - datasource is a List<EventDto> called "results"
Grid B - datasource is one or more records of type List<EntityDto> called "details." Details has several fields that are displayed, and it also has another List, of type <EntityRowDto>, and it is possible to have one or more of these (which is why I need a 3rd grid).
So how do I pull out all <EntityRowDto> records for a given detail and set it as the datasource for Grid C?
ASP.NET Markup for the grid:
<telerik:RadGrid ID="radGridNewAuditLog" runat="server" AutoGenerateColumns="False"
GridLines="None" Skin="Office2007" AllowFilteringByColumn="True" AllowPaging="True"
AllowSorting="True" OnNeedDataSource="radGridNewAuditLog_NeedDataSource" EnableLinqExpressions="False"
Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Size="Small"
Font-Strikeout="False" Font-Underline="False"
OnDetailTableDataBind="radGridNewAuditLog_DetailTableDatabind"
OnPreRender="radGridNewAuditLog_PreRender">
<ClientSettings Selecting-AllowRowSelect="false" EnableRowHoverStyle="true">
<ClientEvents />
</ClientSettings>
<PagerStyle Position="TopAndBottom" />
<MasterTableView PageSize="20" EnableNoRecordsTemplate="true" ShowHeadersWhenNoRecords="true"
Font-Bold="False" Font-Italic="False" Font-Overline="False" Font-Size="Small"
Font-Strikeout="False" Font-Underline="False" DataKeyNames="SessionId" HierarchyDefaultExpanded="true"
HierarchyLoadMode="ServerOnDemand">
<DetailTables>
<telerik:GridTableView Name="Details" DataKeyNames="EntityId" HierarchyDefaultExpanded="true">
<Columns>
<telerik:GridBoundColumn DataField="EntityId" UniqueName="EntityId" Visible="true"/>
<telerik:GridBoundColumn DataField="EntityName" HeaderText="Entity Name" UniqueName="EntityName"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true"/>
<telerik:GridBoundColumn DataField="EntitySystem" HeaderText="System" UniqueName="EntitySystem"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true"/>
</Columns>
</telerik:GridTableView>
</DetailTables>
<RowIndicatorColumn>
<HeaderStyle Width="20px"></HeaderStyle>
</RowIndicatorColumn>
<ExpandCollapseColumn>
<HeaderStyle Width="20px"></HeaderStyle>
</ExpandCollapseColumn>
<Columns>
<telerik:GridBoundColumn DataField="EventType" HeaderText="Event" UniqueName="EventType"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true"/>
<telerik:GridBoundColumn DataField="Username" HeaderText="User" UniqueName="Username"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true" />
<telerik:GridBoundColumn DataField="Description" HeaderText="Description" UniqueName="Description"
AllowFiltering="false" />
<telerik:GridBoundColumn DataField="InitiatingApp" HeaderText="Initiating App" UniqueName="InitiatingApp"
CurrentFilterFunction="Contains" AutoPostBackOnFilter="true" />
<telerik:GridBoundColumn DataField="EventId" UniqueName="EventId" Visible="false"/>
<telerik:GridBoundColumn HeaderText="Created On" ItemStyle-Width="160px" UniqueName="CreatedOn" DataField="CreatedOn"
AllowFiltering="false" DataType="System.DateTime" DataFormatString="{0:MM/dd/yyyy hh:mm tt CT}">
</telerik:GridBoundColumn>
</Columns>
</MasterTableView>
</telerik:RadGrid>
C# CodeBehind:
protected void radGridNewAuditLog_NeedDataSource(object sender, GridNeedDataSourceEventArgs e)
{
if (!e.IsFromDetailTable)
SetGridDataSource();
}
protected void radGridNewAuditLog_DetailTableDatabind(object sender, Telerik.Web.UI.GridDetailTableDataBindEventArgs e)
{
GridDataItem dataItem = (GridDataItem)e.DetailTableView.ParentItem;
List<EntityDto> details = new List<EntityDto>();
switch (e.DetailTableView.Name)
{
case "Details":
{
LoggingRepository logrepodetails = new LoggingRepository();
TableCell cellEventId = dataItem["EventId"];
string strEventId = cellEventId.Text;
int eventId = -1;
int.TryParse(strEventId, out eventId);
if (eventId <= 0)
return;
details = logrepodetails.GetEventDetails(eventId);
e.DetailTableView.DataSource = details;
break;
}
}
}
protected void SetGridDataSource()
{
LoggingRepository logrepo = new LoggingRepository();
List<string> et = new List<string>();
List<EventDto> results=null;
if (_userid == null)
results = logrepo.GetEvents(new Guid(), et, (DateTime)FromDateText.SelectedDate, (DateTime)ToDateText.SelectedDate); //All are optional. If dates are blank I default to last 5 days
else
{
Guid gUserId = new Guid(_userid);
results = logrepo.GetEvents(gUserId, et, (DateTime)FromDateText.SelectedDate, (DateTime)ToDateText.SelectedDate); //All are optional. If dates are blank I default to last 5 days
}
if (results.Count == 0)
return;
radGridNewAuditLog.DataSource = results;
}
protected void radGridNewAuditLog_PreRender(object sender, EventArgs e)
{
HideExpandColumnRecursive(radGridNewAuditLog.MasterTableView);
}
public void HideExpandColumnRecursive(GridTableView tableView)
{
GridItem[] nestedViewItems = tableView.GetItems(GridItemType.NestedView);
foreach (GridNestedViewItem nestedViewItem in nestedViewItems)
{
foreach (GridTableView nestedView in nestedViewItem.NestedTableViews)
{
if (nestedView.Items.Count == 0)
{
TableCell cell = nestedView.ParentItem["ExpandColumn"];
cell.Controls[0].Visible = false;
nestedViewItem.Visible = false;
}
if (nestedView.HasDetailTables)
{
HideExpandColumnRecursive(nestedView);
}
}
}
}