接着上一篇 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();
}