Dim CylRelation As GridViewRelation
Dim CylGasRelation As GridViewRelation
Dim CylTemplate As GridViewTemplate
Dim CylGasTemplate As GridViewTemplate
'setup the master template
rgvInletDetails.MasterTemplate.Columns.Clear
rgvInletDetails.MasterTemplate.AddNewRowPosition = SystemRowPosition.Top
rgvInletDetails.MasterTemplate.AllowAddNewRow = True
PopInletDetails(rgvInletDetails) ' Binding Source for rgvInletDetails.DataSource = 'Inlet' table
'setup the Cylinder child template (Level 2)
CylTemplate = New GridViewTemplate()
CylTemplate.Caption = "Cylinders"
CylTemplate.AllowAddNewRow = True
PopCylinderData(CylTemplate) 'setup BindingSource for level 2 with 'Cylinder' table
rgvInletDetails.MasterTemplate.Templates.Add(CylTemplate) ' add 2nd Level Template to MasterTemplates
'setup the CylinderGas child template (Level 3)
CylGasTemplate = New GridViewTemplate()
CylGasTemplate.Caption = "Cylinder Gas"
CylGasTemplate.AllowAddNewRow = True
PopCylinderGas(CylGasTemplate) 'setup BindingSource for level 3 with 'CylinderGas' table
rgvInletDetails.MasterTemplate.Templates.Add(CylGasTemplate) ' add 3rd Level Template to MasterTemplates
'create the Cylinder relation
Cylrelation = New GridViewRelation(rgvInletDetails.MasterTemplate)
CylRelation.ParentTemplate = rgvInletDetails.MasterTemplate
Cylrelation.ChildTemplate = CylTemplate
Cylrelation.RelationName = "Cylinders"
Cylrelation.ParentColumnNames.Add("CylinderID")
Cylrelation.ChildColumnNames.Add("CylinderID")
rgvInletDetails.Relations.Add(Cylrelation)
'create the CylinderGas relation
CylGasRelation = New GridViewRelation(rgvInletDetails.MasterTemplate)
CylGasRelation.ParentTemplate = CylTemplate
CylGasRelation.ChildTemplate = CylGasTemplate
CylGasRelation.RelationName = "CylinderGas"
CylGasRelation.ParentColumnNames.Add("CylinderID")
CylGasRelation.ChildColumnNames.Add("CylinderID")
rgvInletDetails.Relations.Add(CylGasRelation)
================================================================
Ok - all done. Now when I run this the main grid is displayed correctly with a '+' showing there are records for the 2nd level. However, when I click on
that '+' button then I get this message:-
(see attachment 'errordisplay.jpg' )
Actually an example of a three level hierarchy would be invaluable as it isn't immediately clear on the set up for this arrangement. This requirement above is further complicated by the fact that both Relations have to specify the same field name and I was worried in case the grid thought that it might have to produce two Level 2 grids rather than a Level 2 and a Level 3. As it is I probably have this incorrectly specified. But it would be really nice if an example of both arrangements could be provided.
Many thanks for taking the time to read this and if there are any other details I can provide please ask.
I am using this in a VB.Net 2.0 VS2008 IDE for Windows Forms and the RadgridView is from the 2010.3.10.1109 release.
Does anyone in Telerik know what the message "measure override returned positive infinity" actually means? Can't find any trace of it on the Internet.
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Telerik.WinControls.UI;namespace MenuMemoryLeak{ public partial class TestMdiParent : Telerik.WinControls.UI.RadForm { public TestMdiParent() { InitializeComponent(); } //NOTE this stuff with the backgroundworker is just to repeatedly close/open the form, I know it's not fully correct but the bug occurs nevertheless BackgroundWorker myWorker = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = false }; TestMdiChild myMdiChild; private void TestMdiParent_Shown(object sender, EventArgs e) { myWorker.DoWork += delegate { int count = 0; while(true) { ++count; myWorker.ReportProgress(count); System.Threading.Thread.Sleep(1000); } }; myWorker.ProgressChanged += delegate { if(myMdiChild != null) { myMdiChild.Close(); System.GC.Collect(); } myMdiChild = new TestMdiChild() { MdiParent = this }; myMdiChild.Show(); }; myWorker.RunWorkerAsync(); } }}
TestMdiParent.Designer.csnamespace MenuMemoryLeak{ partial class TestMdiParent { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.testMenuItem = new Telerik.WinControls.UI.RadMenuItem(); this.testParentMenu = new Telerik.WinControls.UI.RadMenu(); ((System.ComponentModel.ISupportInitialize)(this)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.testParentMenu)).BeginInit(); this.SuspendLayout(); // // testMenuItem // this.testMenuItem.Name = "testMenuItem"; this.testMenuItem.Text = "Parent"; // // TestMdiParent // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(902, 523); // // testParentMenu // this.testParentMenu.Items.AddRange(new Telerik.WinControls.RadItem[] { this.testMenuItem}); this.testParentMenu.Location = new System.Drawing.Point(0, 0); this.testParentMenu.Name = "testParentMenu"; this.testParentMenu.Size = new System.Drawing.Size(902, 24); this.testParentMenu.TabIndex = 1; this.testParentMenu.Text = "radMenu1"; this.Controls.Add(this.testParentMenu); this.IsMdiContainer = true; this.Name = "TestMdiParent"; // // // this.RootElement.ApplyShapeToControl = true; this.Text = "TestMdiParent"; this.ThemeName = "ControlDefault"; this.Shown += new System.EventHandler(this.TestMdiParent_Shown); ((System.ComponentModel.ISupportInitialize)(this.testParentMenu)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private Telerik.WinControls.UI.RadMenuItem testMenuItem; private Telerik.WinControls.UI.RadMenu testParentMenu; }}using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using Telerik.WinControls;namespace MenuMemoryLeak{ public partial class TestMdiChild : Telerik.WinControls.UI.RadForm { public TestMdiChild() { InitializeComponent(); //NOTE required for bug to occur this.WindowState = FormWindowState.Maximized; } }}namespace MenuMemoryLeak{ partial class TestMdiChild { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.testMenuButtonItem = new Telerik.WinControls.UI.RadMenuButtonItem(); this.testChildMenu = new Telerik.WinControls.UI.RadMenu(); this.testTextBox = new Telerik.WinControls.UI.RadTextBox(); ((System.ComponentModel.ISupportInitialize)(this.testChildMenu)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.testTextBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this)).BeginInit(); this.SuspendLayout(); // // testMenuButtonItem // this.testMenuButtonItem.Name = "testMenuButtonItem"; this.testMenuButtonItem.Text = "Child"; // // testChildMenu // this.testChildMenu.AllowMerge = false; this.testChildMenu.IsMainMenu = false; this.testChildMenu.Items.AddRange(new Telerik.WinControls.RadItem[] { this.testMenuButtonItem}); this.testChildMenu.Location = new System.Drawing.Point(0, 0); this.testChildMenu.Name = "testChildMenu"; this.testChildMenu.Size = new System.Drawing.Size(467, 24); this.testChildMenu.TabIndex = 2; this.testChildMenu.Text = "radMenu1"; // // testTextBox // this.testTextBox.Location = new System.Drawing.Point(22, 23); this.testTextBox.Name = "testTextBox"; this.testTextBox.Size = new System.Drawing.Size(100, 20); this.testTextBox.TabIndex = 1; this.testTextBox.TabStop = false; this.testTextBox.Text = "test"; // // TestMdiChild // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(467, 268); this.Controls.Add(this.testChildMenu); this.Controls.Add(this.testTextBox); this.Name = "TestMdiChild"; // // // this.RootElement.ApplyShapeToControl = true; this.Text = "TestMdiChild"; this.ThemeName = "ControlDefault"; ((System.ComponentModel.ISupportInitialize)(this.testChildMenu)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.testTextBox)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private Telerik.WinControls.UI.RadMenuButtonItem testMenuButtonItem; private Telerik.WinControls.UI.RadMenu testChildMenu; private Telerik.WinControls.UI.RadTextBox testTextBox; }}