使TreeView的Checked自动响应子节点可以直接在AfterCheck事件中添加代码控制,但这样很不方便也不利于重用代码。下面例子说明如何用另外一种方法即重写TreeView类来改变其响应。
例子重写了OnAfterCheck(TreeViewEventArgs e)并增加处理其相应的方法CheckChanged(TreeNode node)
public class TreeViewPlus : TreeView
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
public TreeViewPlus(System.ComponentModel.IContainer container)
{
///
/// Windows.Forms 类撰写设计器支持所必需的
///
container.Add(this);
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
public TreeViewPlus()
{
///
/// Windows.Forms 类撰写设计器支持所必需的
///
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
}
#endregion
#region NodeType
private Object _nodeType = "";
/// <summary>
/// Gets or sets a value indicating whether plus-sign (+) and minus-sign (-) buttons are displayed next to TreeListView that contain child TreeListViews
/// </summary>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible), DefaultValue("null")]
[Browsable(false), Description("标记节点的类型")]
public Object NodeType
{
get
{
return _nodeType;
}
set
{
if(_nodeType == value) return;
_nodeType = value;
}
}
#endregion
#region OnAfterCheck
protected override void OnAfterCheck(TreeViewEventArgs e)
{
base.OnAfterCheck (e);
CheckChanged(e.Node);
}
private void CheckChanged(TreeNode node)
{
foreach(TreeNode subNode in node.Nodes)
{
subNode.Checked=node.Checked;
CheckChanged(subNode);
}
}
#endregion
}

浙公网安备 33010602011771号