日期:2008-06-11  浏览次数:20427 次



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 ; }

}



<