Hi
I have an expanding grid with a self referencing hierarchy that can go to a variable depth so I can't use nested detail tables, so after some experimenting I started using the self referencing hierarchy and came up with the following code.
and the codebehind is
At first this approach seemed to work
Screenshot
but if I then expanded another row it would cut out my addidtional columns in my modified detail table.
Screenshot 2
Is it possible to modify a detail table view so that the changes persist on another row expanding?
Is there an easier/better way to do what I am attempting to do i.e. a self referencing grid with a different detail view at the lowest level?
Any help/advice will be gratefully received.
Jon
I have an expanding grid with a self referencing hierarchy that can go to a variable depth so I can't use nested detail tables, so after some experimenting I started using the self referencing hierarchy and came up with the following code.
<telerik:RadGrid ID="RadGrid1" runat="server" AutoGenerateColumns="False" OnDetailTableDataBind="RadGrid1_DetailTableDataBind" GridLines="None" onitemdatabound="RadGrid1_ItemDataBound" > <MasterTableView DataKeyNames="ParentID, LearningObjectID, IsCriteria, ShowOverview, ShowNotes, ShowSchematic, LearningObject_Overview, LearningObject_Notes, SchematicFilename, OriginalSchematicFilename" AllowSorting="true" Width="100%" HierarchyLoadMode="ServerOnDemand" CommandItemDisplay="Top"> <CommandItemTemplate> <asp:Table ID="tblInfo" runat="server"> <asp:TableRow ID="rowOverview"> <asp:TableCell> <asp:Label ID="ttlOverview" Font-Bold="true" Font-Size="Small" ForeColor="Black" runat="server" Text="Overview:"></asp:Label> </asp:TableCell> <asp:TableCell> <asp:Label ID="txtOverview" Font-Size="Small" ForeColor="Black" runat="server"></asp:Label> </asp:TableCell> </asp:TableRow> <asp:TableRow ID="rowNotes"> <asp:TableCell> <asp:Label ID="ttlNotes" Font-Bold="true" Font-Size="Small" ForeColor="Black" runat="server" Text="Notes:"></asp:Label> </asp:TableCell> <asp:TableCell> <asp:Label ID="txtNotes" Font-Size="Small" ForeColor="Black" runat="server"></asp:Label> </asp:TableCell> </asp:TableRow> <asp:TableRow ID="rowSchematic"> <asp:TableCell> <asp:Label ID="ttlSchematic" Font-Bold="true" Font-Size="Small" ForeColor="Black" runat="server" Text="Schematic:"></asp:Label> </asp:TableCell> <asp:TableCell> <asp:HyperLink ID="lnkSchematic" Font-Size="Small" ForeColor="Black" runat="server" Text="Click Here To View" Target="_blank" /> <asp:Label ID="txtSchematic" Font-Size="Small" ForeColor="Black" runat="server" Text="There is no schematic for this entry"></asp:Label> </asp:TableCell></asp:TableRow></asp:Table></CommandItemTemplate><CommandItemSettings ExportToPdfText="Export to Pdf"> </CommandItemSettings> <SelfHierarchySettings ParentKeyName="ParentID" KeyName="LearningObjectID" /> <RowIndicatorColumn> <HeaderStyle Width="20px"></HeaderStyle> </RowIndicatorColumn> <ExpandCollapseColumn> <HeaderStyle Width="20px"></HeaderStyle> </ExpandCollapseColumn> <Columns> <telerik:GridImageColumn HeaderStyle-Width="20px" DataImageUrlFields="IconURL"></telerik:GridImageColumn> <telerik:GridBoundColumn DataField="Code" HeaderText="<%$ Resources:Code %>" SortExpression="Code" UniqueName="Code" HeaderStyle-Width="100px" ItemStyle-Width="100px"> </telerik:GridBoundColumn> <telerik:GridBoundColumn DataField="LearningObjective" HeaderText="<%$ Resources:LearningObjective %>" SortExpression="LearningObjective" UniqueName="LearningObjective"> </telerik:GridBoundColumn> <telerik:GridBoundColumn DataField="CriticalPercentage" DataType="System.Double" HeaderStyle-Width="75px" ItemStyle-Width="75px" HeaderText="<%$ Resources:CriticalPercentage %>" ReadOnly="True" SortExpression="CriticalPercentage" UniqueName="CriticalPercentage" DataFormatString="{0}%"> </telerik:GridBoundColumn> <telerik:GridBoundColumn DataField="NonCriticalPercentage" DataType="System.Double" HeaderStyle-Width="75px" ItemStyle-Width="75px" HeaderText="<%$ Resources:NonCriticalPercentage %>" ReadOnly="True" SortExpression="NonCriticalPercentage" UniqueName="NonCriticalPercentage" DataFormatString="{0}%"> </telerik:GridBoundColumn> </Columns> </MasterTableView> </telerik:RadGrid>protected void RadGrid1_DetailTableDataBind(object source, GridDetailTableDataBindEventArgs e) { //Get the info on the parent item GridDataItem parentItem = e.DetailTableView.ParentItem as GridDataItem; int LearningObjectID = (int)parentItem.GetDataKeyValue("LearningObjectID"); //Get the info on the table that is to be opened. CMASDALTableAdapters.AssessUsersPositionSuitabilityTableAdapter assessment = new CMASDALTableAdapters.AssessUsersPositionSuitabilityTableAdapter(); CMASDAL.AssessUsersPositionSuitabilityDataTable dt = assessment.GetAssessUsersPositionSuitability(int.Parse(Session["ClientID"].ToString()), EmployeeSelector1.SelectedPositionID, LearningObjectID, EmployeeSelector1.SelectedEmployeeID); //Check it has children if (dt.Count > 0) { //Find out if the children are criteria and therefore the bottom level and need the alternate table layout. if (dt[0].IsCriteria) { //Get the data for the new table layout CMASDALTableAdapters.AssessUsersPositionSuitabilityCriteriaTableAdapter assessment2 = new CMASDALTableAdapters.AssessUsersPositionSuitabilityCriteriaTableAdapter(); e.DetailTableView.DataSource = assessment2.GetAssessUsersPositionSuitabilityCriteria(int.Parse(Session["ClientID"].ToString()), EmployeeSelector1.SelectedPositionID, LearningObjectID, EmployeeSelector1.SelectedEmployeeID); //Add the additional columns that I need to my collection. //Important: first Add column to the collection GridBoundColumn nameColumn = new GridBoundColumn(); e.DetailTableView.Columns.Add(nameColumn); //Then set properties nameColumn.DataField = "AssessorName"; nameColumn.HeaderText = "Assessor"; nameColumn.HeaderStyle.Width = 150; //Important: first Add column to the collection GridBoundColumn dateColumn = new GridBoundColumn(); e.DetailTableView.Columns.Add(dateColumn); //Then set properties dateColumn.DataField = "AssessmentDate"; dateColumn.HeaderText = "Assessment Date"; dateColumn.HeaderStyle.Width = 75; dateColumn.DataFormatString = "{0:d}"; //Important: first Add column to the collection GridBoundColumn statusColumn = new GridBoundColumn(); e.DetailTableView.Columns.Add(statusColumn); //Then set properties statusColumn.DataField = "AssessmentStatus"; statusColumn.HeaderText = "Assessment Status"; statusColumn.HeaderStyle.Width = 75; //Important: first Add column to the collection GridBoundColumn method1Column = new GridBoundColumn(); e.DetailTableView.Columns.Add(method1Column); //Then set properties method1Column.DataField = "AssessmentMethod1"; method1Column.HeaderText = "Assessment Method 1"; method1Column.HeaderStyle.Width = 75; //Important: first Add column to the collection GridBoundColumn method2Column = new GridBoundColumn(); e.DetailTableView.Columns.Add(method2Column); //Then set properties method2Column.DataField = "AssessmentMethod2"; method2Column.HeaderText = "Assessment Method 2"; method2Column.HeaderStyle.Width = 75; //Get rid of the columns I don't need. GridColumn critPercentageCol = e.DetailTableView.Columns[3]; GridColumn nonCritPercentageCol = e.DetailTableView.Columns[4]; e.DetailTableView.Columns.Remove(critPercentageCol); e.DetailTableView.Columns.Remove(nonCritPercentageCol); //GridColumn newCol = new GridColumn(); //e.DetailTableView.Columns.Add(); } else e.DetailTableView.DataSource = dt; } else e.DetailTableView.DataSource = dt; } protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e) { //If its the command area prepare to show overview/notes etc. if (e.Item is GridCommandItem) { GridDataItem parentItem = e.Item.OwnerTableView.ParentItem as GridDataItem; if (parentItem != null) { //Get the information about the parent item bool showOverview = (bool)parentItem.GetDataKeyValue("ShowOverview"); bool showNotes = (bool)parentItem.GetDataKeyValue("ShowNotes"); bool showSchematic = (bool)parentItem.GetDataKeyValue("ShowSchematic"); string strOverview = (string)parentItem.GetDataKeyValue("LearningObject_Overview"); string strNotes = (string)parentItem.GetDataKeyValue("LearningObject_Notes"); string lnkSchematicFilename = (string)parentItem.GetDataKeyValue("SchematicFilename"); GridCommandItem commandItem = (GridCommandItem)e.Item; //Show and hide appropriate fields. if (showOverview) { Label txtOverview = (Label)commandItem.FindControl("txtOverview"); txtOverview.Text = strOverview; } else { TableRow rowOverview = (TableRow)commandItem.FindControl("rowOverview"); rowOverview.Visible = false; } if (showNotes) { Label txtNotes = (Label)commandItem.FindControl("txtNotes"); txtNotes.Text = strNotes; } else { TableRow rowNotes = (TableRow)commandItem.FindControl("rowNotes"); rowNotes.Visible = false; } if (showSchematic) { Label txtSchematic = (Label)commandItem.FindControl("txtSchematic"); HyperLink lnkSchematic = (HyperLink)commandItem.FindControl("lnkSchematic"); if (lnkSchematicFilename.Length == 0) lnkSchematic.Visible = false; else { lnkSchematic.NavigateUrl = lnkSchematicFilename; txtSchematic.Visible = false; } } else { TableRow rowSchematic = (TableRow)commandItem.FindControl("rowSchematic"); rowSchematic.Visible = false; } } else e.Item.Visible = false; } //if it's a criteria then hide the expand control if (e.Item is GridDataItem)// to access a row { GridDataItem item = (GridDataItem)e.Item; RadGrid parentGrid = (RadGrid)sender; if ((bool)item.GetDataKeyValue("IsCriteria") == true) { item.Cells[0].Controls[0].Visible = false; } } }At first this approach seemed to work
Screenshot
but if I then expanded another row it would cut out my addidtional columns in my modified detail table.
Screenshot 2
Is it possible to modify a detail table view so that the changes persist on another row expanding?
Is there an easier/better way to do what I am attempting to do i.e. a self referencing grid with a different detail view at the lowest level?
Any help/advice will be gratefully received.
Jon