TreeListView应用(2)

1 篇文章 0 订阅
1 篇文章 0 订阅

接着上一篇   TreeListView应用(1)_l651214615的博客-CSDN博客 

一、显示的一些问题

1.上篇提过的不设置图标,会导致所有节点不缩进,显示错误。

2.为了方便以后操作,最开始我将数据库的所有列都绑定到 TreeListView 上,但没找到隐藏列这个功能。 然后我把除第一列外其余所有列的 列宽 都设为零,这样隐藏列的目的是达到了,但发现了一个BUG:然后我把列宽都设成 1 了,效果不错。

二、编辑

这一篇的所有编辑都是针对与界面,不考虑对绑定的数据进行同步处理。处理数据要考虑数据结构,其实也简单,可以通过选定的 Item 得到 info(在下面代码中能找到),调试时可以看到 info 中包含的属性值,利用这些属性值可以对数据直接处理,更改数据后 Updata()到数据库内,然后重载一次TreeListView。如果不想重载,也可以同步处理,但多人编辑数据库时有可能会出错。

1.编辑Item(看成是单元格)

暂时想到两种方法,一种是学的大气象老师的博客,C# WinForm TreeListView控件用法初步 - 大气象 - 博客园

利用 TreeListView 的事件 BeforeLabelEdit ,但工作过程中发现并不满足需求,我需要大量维护工作,而 BeforeLabelEdit 属性效果在编辑时有一个短暂的延迟,频繁编辑时很拖沓,第二种时用双击事件召唤出一个 TextBox,在 TextBox 内编辑后把值赋给单元格。快是快了,但拖动滚动条时,文本框位置会一动不动,对于编辑没什么影响。

首先将 TreeListView  LabelEdit 属性设为 TRUE

编辑 TreeListView 的事件 BeforeLabelEdit 

 private void treeListView1_BeforeLabelEdit(object sender, TreeListViewBeforeLabelEditEventArgs e)
        {
            TextBox textBox = new TextBox();
            e.Editor = textBox;          
        }//编辑文本

 ②

TreeListView 上添加一个 TextBox 控件,把它置于底层(运行时看不见它),然后编辑它的Leave 事件,如下:

 private void textBox1_Leave(object sender, EventArgs e)
        {

            item.Text = textBox1.Text;
            textBox1.Visible = false;
            textBox1.Text = "";
        }

 然后编辑 TreeListView  DoubleClick 事件,如下:

private void treeListView1_DoubleClick(object sender, EventArgs e)
        {
            if (treeListView1.SelectedItems.Count == 0) return;          //防止双击折叠符号报错
            Point pointMP = Control.MousePosition;                       //获取鼠标双击位置的屏幕坐标
            Point pointTLV = treeListView1.PointToClient(pointMP);       //转换为控件 treelistview1 上的坐标
            ListViewHitTestInfo info = treeListView1.HitTest(pointTLV);  //HitTest()给定一个点,获取整个项信息
            item = info.SubItem;                                         //全局变量 类型为 ListViewItem.ListViewSubItem 留着给"单元格"赋值
            if (info.Item == null) return;

            Rectangle rectangle = info.SubItem.Bounds;
           
            textBox1.Left = rectangle.Location.X;
            textBox1.Top = rectangle.Location.Y;                         //获取选择项左上角坐标
            textBox1.Width = rectangle.Width;                            //textbox宽,第一列宽需要写死,否则是整个treelistview的宽
            textBox1.BringToFront();

            textBox1.Text = info.SubItem.Text;
            textBox1.Visible = true;
            textBox1.Focus();
        }//双击编辑文本

 这样基本上就完成了需要的功能:双击可以编辑文本,鼠标点其他地方文本框消失,把输入的值带到我们说的“单元格”里。

:TextBox 不够用还可以换成 Combox。

:如果你需要用 按回车键 代表输入完成,而不是鼠标点其他地方。那么这里的 Leave 事件也可以替换成 KeyPress 事件,代码如下,需要注意的一点:KeyPress 事件生效后,会紧接着触发Leave 事件,这点需要处理一下。

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {

            if (e.KeyChar.Equals((char)13))
            {

            item.Text = textBox1.Text;
            textBox1.Visible = false;
            textBox1.Text = "";

            }

        }

2.编辑节点(看成是行)

 ①

增加子节点

参考上一篇内容,同样是实例化一个

TreeListViewItem t =  new  TreeListViewItem();

 把最后的

treeListView1.Items.Add(t);

替换成

TreeListViewItem select = treeListView1.SelectedItems[0];

select.Items.Add(t);

 ②

增加根节点

简单,请举一反三。

删除节点

举一反三。

三、折叠和展开

TreeListView 绑定了一个 ContextMenuStrip 控件,写一个全部展开,一个全部折叠。

     private void 全部展开ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            treeListView1.ExpandAll();
        }

     private void 全部折叠ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            treeListView1.CollapseAll();
        }

四、TreeListView 不知道还写啥了,暂时工作中就遇到这些。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅比龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值