/* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457 */ using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace TreeViewDataBinding { /// <summary> /// Summary description for TreeViewDataBinding. /// </summary> public class TreeViewDataBinding : System.Windows.Forms.Form { internal System.Windows.Forms.Panel Panel2; internal System.Windows.Forms.Panel Panel3; internal System.Windows.Forms.Label lblInfo; internal System.Windows.Forms.Label Label1; internal System.Windows.Forms.Splitter Splitter1; internal System.Windows.Forms.TreeView treeDB; internal System.Windows.Forms.Panel Panel1; internal System.Windows.Forms.Button cmdClose; internal System.Windows.Forms.GroupBox GroupBox1; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public TreeViewDataBinding() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (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.Panel2 = new System.Windows.Forms.Panel(); this.Panel3 = new System.Windows.Forms.Panel(); this.lblInfo = new System.Windows.Forms.Label(); this.Label1 = new System.Windows.Forms.Label(); this.Splitter1 = new System.Windows.Forms.Splitter(); this.treeDB = new System.Windows.Forms.TreeView(); this.Panel1 = new System.Windows.Forms.Panel(); this.cmdClose = new System.Windows.Forms.Button(); this.GroupBox1 = new System.Windows.Forms.GroupBox(); this.Panel2.SuspendLayout(); this.Panel3.SuspendLayout(); this.Panel1.SuspendLayout(); this.SuspendLayout(); // // Panel2 // this.Panel2.Controls.AddRange(new System.Windows.Forms.Control[] { this.Panel3, this.Splitter1, this.treeDB}); this.Panel2.Dock = System.Windows.Forms.DockStyle.Fill; this.Panel2.Location = new System.Drawing.Point(5, 5); this.Panel2.Name = "Panel2"; this.Panel2.Size = new System.Drawing.Size(446, 264); this.Panel2.TabIndex = 8; // // Panel3 // this.Panel3.Controls.AddRange(new System.Windows.Forms.Control[] { this.lblInfo, this.Label1}); this.Panel3.Dock = System.Windows.Forms.DockStyle.Fill; this.Panel3.Location = new System.Drawing.Point(239, 0); this.Panel3.Name = "Panel3"; this.Panel3.Size = new System.Drawing.Size(207, 264); this.Panel3.TabIndex = 7; // // lblInfo // this.lblInfo.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right); this.lblInfo.BackColor = System.Drawing.SystemColors.Window; this.lblInfo.Location = new System.Drawing.Point(16, 12); this.lblInfo.Name = "lblInfo"; this.lblInfo.Size = new System.Drawing.Size(176, 240); this.lblInfo.TabIndex = 1; // // Label1 // this.Label1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right); this.Label1.BackColor = System.Drawing.SystemColors.Window; this.Label1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.Label1.Location = new System.Drawing.Point(4, 0); this.Label1.Name = "Label1"; this.Label1.Size = new System.Drawing.Size(200, 264); this.Label1.TabIndex = 2; // // Splitter1 // this.Splitter1.Location = new System.Drawing.Point(236, 0); this.Splitter1.Name = "Splitter1"; this.Splitter1.Size = new System.Drawing.Size(3, 264); this.Splitter1.TabIndex = 6; this.Splitter1.TabStop = false; // // treeDB // this.treeDB.Dock = System.Windows.Forms.DockStyle.Left; this.treeDB.ImageIndex = -1; this.treeDB.Name = "treeDB"; this.treeDB.SelectedImageIndex = -1; this.treeDB.Size = new System.Drawing.Size(236, 264); this.treeDB.TabIndex = 4; this.treeDB.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeDB_AfterSelect); this.treeDB.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeDB_BeforeExpand); // // Panel1 // this.Panel1.Controls.AddRange(new System.Windows.Forms.Control[] { this.cmdClose, this.GroupBox1}); this.Panel1.Dock = System.Windows.Forms.DockStyle.Bottom; this.Panel1.Location = new System.Drawing.Point(5, 269); this.Panel1.Name = "Panel1"; this.Panel1.Size = new System.Drawing.Size(446, 36); this.Panel1.TabIndex = 7; // // cmdClose // this.cmdClose.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right); this.cmdClose.FlatStyle = System.Windows.Forms.FlatStyle.System; this.cmdClose.Location = new System.Drawing.Point(372, 12); this.cmdClose.Name = "cmdClose"; this.cmdClose.Size = new System.Drawing.Size(72, 24); this.cmdClose.TabIndex = 4; this.cmdClose.Text = "Close"; this.cmdClose.Click += new System.EventHandler(this.cmdClose_Click); // // GroupBox1 // this.GroupBox1.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right); this.GroupBox1.Name = "GroupBox1"; this.GroupBox1.Size = new System.Drawing.Size(444, 8); this.GroupBox1.TabIndex = 5; this.GroupBox1.TabStop = false; // // TreeViewDataBinding // this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); this.ClientSize = new System.Drawing.Size(456, 310); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.Panel2, this.Panel1}); this.DockPadding.All = 5; this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); this.Name = "TreeViewDataBinding"; this.Text = "TreeViewDataBinding"; this.Load += new System.EventHandler(this.TreeViewDataBinding_Load); this.Panel2.ResumeLayout(false); this.Panel3.ResumeLayout(false); this.Panel1.ResumeLayout(false); this.ResumeLayout(false); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new TreeViewDataBinding()); } private ProductDatabase DataClass = new ProductDatabase(); private void TreeViewDataBinding_Load(object sender, System.EventArgs e) { TreeNode nodeParent; foreach (DataRow row in DataClass.GetCategories().Rows) { // Add the category node. nodeParent = treeDB.Nodes.Add(row[ProductDatabase.CategoryField.Name].ToString()); nodeParent.ImageIndex = 0; // Store the disconnected category information. nodeParent.Tag = row; // Add a "dummy" node. nodeParent.Nodes.Add("*"); } } private void treeDB_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) { TreeNode nodeSelected, nodeChild; nodeSelected = e.Node; if (nodeSelected.Nodes[0].Text == "*") { // This is a dummy node. nodeSelected.Nodes.Clear(); foreach (DataRow row in DataClass.GetProductsInCategory((DataRow)nodeSelected.Tag)) { nodeChild = nodeSelected.Nodes.Add(row[ProductDatabase.ProductField.Name].ToString()); // Store the disconnected product information. nodeChild.Tag = row; nodeChild.ImageIndex = 1; nodeChild.SelectedImageIndex = 1; } } } private void treeDB_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) { lblInfo.Text = DataClass.GetDisplayText((DataRow)e.Node.Tag); } private void cmdClose_Click(object sender, System.EventArgs e) { this.Close(); } } public class ProductDatabase { public class Tables { public const string Product = "Products"; public const string Category = "Categories"; } public class ProductField { public const string Name = "ModelName"; public const string Description = "Description"; } public class CategoryField { public const string Name = "CategoryName"; } private DataSet dsStore; DataRelation relCategoryProduct; public ProductDatabase() { dsStore = new DataSet(); dsStore.ReadXmlSchema(Application.StartupPath + "store.xsd"); dsStore.ReadXml(Application.StartupPath + "store.xml"); // Define the relation. relCategoryProduct = new DataRelation("Prod_Cat", dsStore.Tables["Categories"].Columns["CategoryID"], dsStore.Tables["Products"].Columns["CategoryID"]); dsStore.Relations.Add(relCategoryProduct); } public DataTable GetCategories() { return dsStore.Tables["Categories"]; } public DataRow[] GetProductsInCategory(DataRow rowParent) { return rowParent.GetChildRows(relCategoryProduct); } public string GetDisplayText(DataRow row) { string text = ""; switch (row.Table.TableName) { case Tables.Product: text = "ID: " + row[0] + " "; text += "Name: " + row[ProductField.Name] + " "; text += row[ProductField.Description]; break; } return text; } } } TreeViewDataBinding.zip( 56 k)