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 = ; //指向展开的图标
e.Node.SelectedImageIndex = ;//指向展开的图标
} private void treeView1_AfterCollapse(object sender, TreeViewEventArgs e)
{
e.Node.ImageIndex = ; //指向关闭的图标
e.Node.SelectedImageIndex = ;//指向关闭的图标
}

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,告诉系统我们就当我们没有编辑过吧.这样系统就不会执行最后一步了,我们代码的修改得到了保留.

C#Winform中treeView控件使用总结的更多相关文章

  1. Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼

    Winform中Treeview控件失去焦点,将选择的节点设置为高亮显示 (2012-07-16 13:47:07)转载▼标签: winform treeview drawnode Treeview控 ...

  2. WinForm 中TreeView 控件的使用实例

    新建一个窗体,在本窗体界面上需要以下几个按钮 (一个TreeView    一个 TextBox  三个Button 按钮) 后台代码如下: using System; using System.Co ...

  3. WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)

    ;//1:不同级, 不为1:拖同级 private void treeView1_ItemDrag(object sender, ItemDragEventArgs e) { if (e.Button ...

  4. C#之Winform中treeview控件绑定数据库

    private DataSet ds; private SqlDataAdapter sqlDataAdapter1; private int maxnodeid; private void Form ...

  5. Winform中checklistbox控件的常用方法

    Winform中checklistbox控件的常用方法最近用到checklistbox控件,在使用其过程中,收集了其相关的代码段1.添加项checkedListBox1.Items.Add(" ...

  6. [C#]WinForm 中 comboBox控件之数据绑定

    [C#]WinForm 中 comboBox控件之数据绑定 一.IList 现在我们直接创建一个List集合,然后绑定 IList<string> list = new List<s ...

  7. Win32中TreeView控件的使用方法,类似于资源管理器中文件树形显示方式

    首先是头文件,内容如下: #include <tchar.h> #include "..\CommonFiles\CmnHdr.h" #include <Wind ...

  8. C#winform中使用控件的Dock属性进行布局

    想要实现如下布局,可以通过设置控件的Dock属性达到效果 1.拖放一个panel控件一个label控件(放在panel中)和一个treeView控件到TestForm中 2.设置panel的Dock属 ...

  9. C# WinForm中 让控件全屏显示的实现代码

    夏荣全 ( lyout(at)163.com )原文 C#中让控件全屏显示的实现代码(WinForm) 有时候需要让窗口中某一块的内容全屏显示,比如视频播放.地图等等.经过摸索,暂时发现两种可行方法, ...

随机推荐

  1. 数据库 SQL优化

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  2. HDU 4004

    http://acm.hdu.edu.cn/showproblem.php?pid=4004 题意:青蛙过长L的河,只能落在石头上,石头数量是n,给出n个坐标,至多跳m次,求在可以过河的条件下,青蛙跳 ...

  3. magento memcache缓存配置

    在app/etc/local.xml <global>配置段中添加 cache段配置 <config> <global> <install> <d ...

  4. Log4Cplus的介绍

    Log4Cplus是一款很好的开源日志打印程序,该日志打印程序的配置文件为类似INI的文件,以下为该日志打印程序配置文件中的说明: 1.#—注释行的开头表示,即以该字符开头的行,改日志程序不解释改行内 ...

  5. Day07_面向对象第二天

    1.构造方法(掌握) 1.构造方法的特点(掌握)      A.方法名必须和类名保持一致      B.没有返回值类型并且没有具体的返回值   2.构造方法的作用(掌握)       给对象的属性初始 ...

  6. python 怎样使用安装库

    win: 1.使用匹配安装 进入pip所在目录C:\Python27\Scripts pip intasll lxml 2.源码下载安装 下载源码,解压到任意目录 cd 进入到setup.py的目录 ...

  7. 学习iOS的一些网站收藏

    1,CocoaChina:http://www.cocoachina.com/ 2,Code4App:http://code4app.com/ 3,梦维:http://www.dreamingwish ...

  8. 服务器重写技术:rewrite

    rewrite 是一种服务器的重写技术,它可以使得服务器支持 URL 重写,是一种最新流行的服务器技术. 主要功能:限制特定IP访问网站,实现URL的重写.

  9. Codeforces Round #126 (Div. 2)

    A. Cinema 假设当前要的位置为\((x, y)\),如果枚举答案的横坐标,那么每次找离\(y\)最近的纵坐标. 如果占用了位置\((x,y)\),需要要更新第\(x\)行的信息,而占用位置\( ...

  10. Codeforces Round #373 (Div. 1)

    Codeforces Round #373 (Div. 1) A. Efim and Strange Grade 题意 给一个长为\(n(n \le 2 \times 10^5)\)的小数,每次可以选 ...