using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Diagnostics;
namespace upControls
{
/// <summary>
/// 可快速绑定到关系表或单表的树,树自动按照主表及其子表的PrimaryKey列值来绑定
/// 只遍历一次Rows中的所有行,所以加载速度非常快
/// 结点内容可以只显示值,也可以显示列名称以作说明
/// 关系型的数据源要求具有:子列必需具唯一约束
/// 附加列必需是关系表中的最底层表所拥有的列
/// 适用于ParentID,ID,Text式之外的所有表的树填充
/// </summary>
public class DataTreeView : TreeView
{
private System.ComponentModel.Container components = null;
private DataTable _mainDatatable;
private string[] _appendColumnNames=null;
private System.Windows.Forms.ContextMenu cntMenu;
private bool _columnNameOnText;
private TreeNode _parentNode;
public DataTreeView ()
{
InitializeComponent();
MenuItem mnu;
mnu=cntMenu.MenuItems.Add ("显示列名");
mnu.Click +=new EventHandler(mnu_Click);
mnu=cntMenu.MenuItems.Add ("-");
mnu=cntMenu.MenuItems.Add ("展开");
mnu.Click +=new EventHandler(mnu_Click);
mnu=cntMenu.MenuItems.Add ("折叠");
mnu.Click +=new EventHandler(mnu_Click);
mnu=cntMenu.MenuItems.Add ("-");
mnu=cntMenu.MenuItems.Add ("全部展开");
mnu.Click +=new EventHandler(mnu_Click);
mnu=cntMenu.MenuItems.Add ("全部折叠");
mnu.Click +=new EventHandler(mnu_Click);
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.cntMenu = new System.Windows.Forms.ContextMenu();
this.cntMenu.Popup += new System.EventHandler(this.cntMenu_Popup);
this.CheckBoxes = true;
this.ContextMenu = this.cntMenu;
}
#endregion
///////////////////////////////////////////////////////////////////////////////
/// <summary>
/// 主表,主表的第一个primarykey值将添加在树的顶层
/// </summary>
public DataTable MainTable
{
get{return this._mainDatatable ; }
}
/// <summary>
/// 除primarykey列之外的列,可以附加在最后一个primarykey列的结点之下的列
/// </summary>
public string[] AppendColumnNames
{
get{return _appendColumnNames ; }
}
/// <summary>
/// 结点的文本要否包含列名
/// </summary>
public bool ColumnNameOnText
{
get{return _columnNameOnText ; }
}
<