博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使TreeView的Checked自动响应子节点

Posted on 2005-05-18 21:17    阅读(1191)  评论(0)    收藏  举报

    使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


        
    }
在例子中还为其添加了一个属性NodeType一供不时之需。