TreeView控件扩展问题,本帖急,解决结贴。

zhchg6666 2008-07-24 11:16:42
由于项目要求,需要对TreeView控件做进一步的扩展,
具体要求如下:
1 每一个TreeNode要求对应多个状态图标。
2 每一个TreeNode对应一个CheckBox
3 TreeNode的任何一个状态图标,或则文字,或者CheckBox被点击要求触发相应的事件。

请问:
目前不做扩展,是否可以实现该功能?
有没有第三方控件实现该功能?
若做扩展,需要做哪些工作?

本帖急,解决结贴。
...全文
232 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wocow2316 2008-07-25
  • 打赏
  • 举报
回复
我就你的那些功能,帮你做了一个Demo,
程序下载地址:
http://download.csdn.net/source/554239
zhchg6666 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wocow2316 的回复:]
你说的几个功能,都可以实现
1.状态对以多个图标,其实,就是StateImageList
绑定一个 ImageList ,然后改变 ImageIndex 就可以

2.每个node 对应一个 checkbox ,其实这个checkbox 不是真正的checkbox
其实 也是图片,这是三张不同的图片,选中的,不选中的,和 半选中的图片,来回的变换,看上去就像checkbox
3.对于你点的是状态图标,还是文字,都可以判断的响应
你看以通过,点击的坐标了判断是选中了什么

这…
[/Quote]

关于你说的第一条,我想确认一下是否我理解上有偏差,我想做到的效果是一个TreeNode同时对应多个图片,展示出现的一个TreeNode的效果应该类似于 checkBox pic1 pic2 pic3 pic4... 文字,如此。
wocow2316 2008-07-25
  • 打赏
  • 举报
回复
treeView 关于这个功能我找不到以前做的demo了
不过你还可以用第三方 dev 空间 treelist 实现,它的核心代码如下
//初始化
private void InitData() {
DevExpress.XtraTreeList.Design.XViews xv = new DevExpress.XtraTreeList.Design.XViews(treeList1);
treeList1.SelectImageList = null;
try {
SetCheckedNode(treeList1.Nodes[0].Nodes[0]);
}
catch { }
}
//获取选中的状态
private CheckState GetCheckState(object obj) {
if(obj != null) return (CheckState)obj;
return CheckState.Unchecked;
}
//设置选择的节点
private void SetCheckedNode(DevExpress.XtraTreeList.Nodes.TreeListNode node) {
CheckState check = GetCheckState(node.Tag);
if(check == CheckState.Indeterminate || check == CheckState.Unchecked) check = CheckState.Checked;
else check = CheckState.Unchecked;
treeList1.BeginUpdate();
node.Tag = check;
SetCheckedChildNodes(node, check);
SetCheckedParentNodes(node, check);
treeList1.EndUpdate();
}
//</treeList1>
//设置孩子节点
private void SetCheckedChildNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check) {
for(int i = 0; i < node.Nodes.Count; i++) {
node.Nodes[i].Tag = check;
SetCheckedChildNodes(node.Nodes[i], check);
}
}
//设置父亲节点
private void SetCheckedParentNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check) {
if(node.ParentNode != null) {
bool b = false;
CheckState state;
for(int i = 0; i < node.ParentNode.Nodes.Count; i++) {
if(node.ParentNode.Nodes[i].Tag == null) state = CheckState.Unchecked;
else state = (CheckState)node.ParentNode.Nodes[i].Tag;
if(!check.Equals(state)) {
b = !b;
break;
}
}
node.ParentNode.Tag = b ? CheckState.Indeterminate : check;
SetCheckedParentNodes(node.ParentNode, check);
}
}

//<treeList1>
private void treeList1_GetStateImage(object sender, DevExpress.XtraTreeList.GetStateImageEventArgs e) {
CheckState check = GetCheckState(e.Node.Tag);
if (check == CheckState.Unchecked)
e.NodeImageIndex = 0;
else if (check == CheckState.Checked)
e.NodeImageIndex = 1;
else e.NodeImageIndex = 2;
}

private void treeList1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) {
if(e.KeyData == Keys.Space)
SetCheckedNode(treeList1.FocusedNode);
}
//判断选中节点的位置,主要判断 HitInfoType 的类型,下面的是,当选中StateImage时候响应
//if(hInfo.HitInfoType == HitInfoType.StateImage)

private void treeList1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
if(e.Button == MouseButtons.Left) {
DevExpress.XtraTreeList.TreeListHitInfo hInfo = treeList1.CalcHitInfo(new Point(e.X, e.Y));
if(hInfo.HitInfoType == HitInfoType.StateImage)
SetCheckedNode(hInfo.Node);
}
}
wocow2316 2008-07-25
  • 打赏
  • 举报
回复
你说的几个功能,都可以实现
1.状态对以多个图标,其实,就是StateImageList
绑定一个 ImageList ,然后改变 ImageIndex 就可以
2.每个node 对应一个 checkbox ,其实这个checkbox 不是真正的checkbox
其实 也是图片,这是三张不同的图片,选中的,不选中的,和 半选中的图片,来回的变换,看上去就像checkbox
3.对于你点的是状态图标,还是文字,都可以判断的响应
你看以通过,点击的坐标了判断是选中了什么

这些功能,我以前都实现过
哈皮玩 2008-07-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xhan2000 的回复:]
1无法实现
2可以
3文字和chechkbox可以实现点击事件
[/Quote]
[Quote=引用 5 楼 zhchg6666 的回复:]
顶起 100分白送
[/Quote]
等楼主散分!
希望楼主早日研究出来。
cheng_feng001 2008-07-25
  • 打赏
  • 举报
回复
up
HW_zxc_002 2008-07-25
  • 打赏
  • 举报
回复
up
zhchg6666 2008-07-25
  • 打赏
  • 举报
回复
顶起 100分白送
zhchg6666 2008-07-25
  • 打赏
  • 举报
回复
问题解决:

本来自己重画,弄了半天弄出来了,很难看。
自己重画需要继承TreeView
绑定一个DrawNode方法,实现之。

后来找到一个控件,做稍许改动可以完全满足我的要求。
有类似需求的同志可以参考:
http://www.codeproject.com/KB/tree/treeviewadv.aspx
zhchg6666 2008-07-25
  • 打赏
  • 举报
回复
up
zhchg6666 2008-07-25
  • 打赏
  • 举报
回复
楼上二位大哥
多谢费心了

我想我们的理解还是有偏差的,是我没有说清楚

简单的说 我需要实现 每个TreeNode对应一排图片,且这一排图片中的任何一个都要可以响应单击事件

我想,如果不重绘TreeNode是无法实现的
liushuyong08 2008-07-25
  • 打赏
  • 举报
回复
用treeview本身就可以实现的.好好利用它的属性方法.
jl_lsj 2008-07-24
  • 打赏
  • 举报
回复
up
zhchg6666 2008-07-24
  • 打赏
  • 举报
回复
关键是 每一个TreeNode要求对应多个状态图标 且每个图标要有鼠标事件
xhan2000 2008-07-24
  • 打赏
  • 举报
回复
1无法实现
2可以
3文字和chechkbox可以实现点击事件
zhchg6666 2008-07-24
  • 打赏
  • 举报
回复
顶起 100分白送
zhchg6666 2008-07-24
  • 打赏
  • 举报
回复
世界真奇妙,100分都没人来拿。。。。。。。。。

8,834

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 组件/控件开发
社区管理员
  • 组件/控件开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧