zoukankan      html  css  js  c++  java
  • C#Winform中treeView控件使用总结

    1.如何展开结点时改变图标(注意:不是选中时)

    要在目录中使用图标首先要加入一个控件ImageList(命名为imageList1),然后可以按图片的index或名称引用图片.

    然后需要在TreeView控件的ImageList属性中指向imageList1.

    TreeView有两个属性:

    SelectImageIndex:选中该结点时显示的图片的索引

    ImageIndex:未选中该结点时显示的图片的索引

    可以实现的效果是,选中某个结点时该结点的图片进行改变,如果我们的目标也是如此,万事已经大吉了.

    但我希望的效果是:展开某个结点时该结点的图片改变(如显示为打开的盒子),折叠时该结点的图片改变(如包装好的盒子).直接使用属性无法实现该效果.

    实现原理是:展开某个结点时将SelectImageIndex和ImageIndex统统指向打开盒子的图片

    折叠某个结点时将SelectImageIndex和ImageIndex统统指向包装盒子的图片

    自然需要用到两个事件:TreeView的AfterExpand和AfterCollapse事件

            private void treeView1_AfterExpand(object sender, TreeViewEventArgs e)
            {
                e.Node.ImageIndex = 1; //指向展开的图标
                e.Node.SelectedImageIndex = 1;//指向展开的图标
            }
    
            private void treeView1_AfterCollapse(object sender, TreeViewEventArgs e)
            {
                e.Node.ImageIndex = 0; //指向关闭的图标
                e.Node.SelectedImageIndex = 0;//指向关闭的图标
            }

    PS:当对某个结点的属性

    ImageIndex和SelectedImageIndex赋值后,向它添加的子结点如未指定该属性,似乎会沿用父结点的属性,所以通常我会对子结点单独设置该值 .

    2.重命名结点名称

    重命名结点的功能很好实现,只要将TreeView的LabelEdit属性改为True即可.选中某个结点后再单击(提示:间隔短的话算做双击),然后结点名称变成可以编辑状态,修改文本后即可完成.

    但我的程序设计是这样的:结点的名称会在后面自动加入子结点的数量(注:树的深度为2).

    效果如图:

    这样就会带来麻烦(我们总是擅长给自己制造麻烦?),因为我在重命名的时候并不想在编辑状态下名称中包含后面数字(它只在显示的时候出现).

    假设我希望将"新建分组"重命名为"我的分组",我希望进入编辑状态时,名称为"新建分组",修改后的名称为"我的分组",退出编辑状态时显示为"我的分组[1]".

    那实际的逻辑就是这样:

    1.进入编辑状态时将名称的数字去掉

    2.退出编辑状态时将名称加入数字.

    so easy!

    那如何获取进入编辑状态时的事件呢?我没有找到,或者可能就没有,但我们可以在结点的单击事件中进行捕获,再判断结点的文本是否为选中状态

            private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                if (e.Node.IsSelected)
                {
                    e.Node.Text = "替换掉数字,请自己实现";
                }
            }

    然后捕捉编辑结束事件,实现加数字的方法

    private void treeView1_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
            {
                if (!e.CancelEdit)
                {
              e.Node.Text=e.Label+string.Format(" [{0}]", e.Node.Nodes.Count.ToString());           
             e.CancelEdit
    = true; //注意这里
           }
        }

    以下是重点:

    在上面的代码没加入 e.CancelEdit = true 之前,会有一个奇怪的现象,当我将结点的名称修改后不会出现后面的数字.假设我修改的顺序是这样:将A->B->B

    很有趣的现象:当从A变成B时后面的数字不会出现,当从B变成B时(实际没有发行变动),数字又出现了.跟踪了很久的程序加上了很长的时间分析,终于明白原因了.

    当我们修改结点的文本时是这样的一个顺序:结点进入编辑状态->触发BeforeLabelEdit事件->触发AterLabelEdit事件->刷新界面用新值代替旧值.

    在 treeView1_AfterLabelEdit事件的参数中有两个属性:s.Label 修改之后的值(新值,可能为null,只读) 和s.Node.Text 修改之前的值(旧值,可读写).

    仔细分析后可以理解上面的现象:当从A->修改为B时,我们的代码对e.Node.Text(旧值)进行了赋值加入数字,最后程序刷新界面时会用新值代替旧值.这时我们加入的数字被新值Label覆盖了(代码做了无用功)

    而我们从B->修改为B时,由于新值(Label)为null,则系统不会执行最后一步,所以我们添加的数字得到了保留.

    最终的做法,就是将参数的e.CancelEdit改为true,告诉系统我们就当我们没有编辑过吧.这样系统就不会执行最后一步了,我们代码的修改得到了保留.

     

     

  • 相关阅读:
    RTTI应用一例,改变窗体上所有控件的颜色(如果这个控件有Color属性的话)
    ddd
    终于懂了:TWinControl主要是Delphi官方用来封装Windows的官方控件,开发者还是应该是有TCustomControl来开发三方控件
    C++能在三个地方创造对象,而Delphi只有一个地方
    win32内存调用图
    让C#、VB.NET实现复杂的二进制操作
    谈谈华为(这篇文章比较有思想,对不对另说)
    How to configure CDB in Qt Creator(使用VC调试器)
    kbmMW 5.0.1发布了(跨全平台,包括Linux,可使用Win的高性能HTTPSys传输层,等等)
    FMXUI
  • 原文地址:https://www.cnblogs.com/champaign/p/TreeView.html
Copyright © 2011-2022 走看看