C# ObjectListView-TreeListView自动三态检查
是否有人成功地使三态复选框在TreeListView中正常工作,而不使用模型对象中的属性来存储复选状态 例如,检查一个节点。应检查其所有子女(以及子女的子女等),然后根据其兄弟姐妹检查其所有父母/祖父母C# ObjectListView-TreeListView自动三态检查,c#,recursion,objectlistview,treelistview,C#,Recursion,Objectlistview,Treelistview,是否有人成功地使三态复选框在TreeListView中正常工作,而不使用模型对象中的属性来存储复选状态 例如,检查一个节点。应检查其所有子女(以及子女的子女等),然后根据其兄弟姐妹检查其所有父母/祖父母CheckStates 我尝试了几种方法,但每种方法都会在TreeListView类中获得一个ArgumentOutOfRange/ArgumentException。这包括: 将所有节点CheckStates存储在字典中,并将其用作查找CheckStateGetter事件 当itemsChec
CheckStates
我尝试了几种方法,但每种方法都会在TreeListView类中获得一个ArgumentOutOfRange
/ArgumentException
。这包括:
- 将所有节点CheckStates存储在字典中,并将其用作查找
事件CheckStateGetter
- 当items
更改时递归调用函数(并确保在编程更改CheckState
时忽略后续的ItemCheck事件)CheckStates
- 调用函数以确定直接的子节点/父节点状态,并让TreeListView为每个受影响的节点触发
事件ItemChecked
- GetNthItem()
- GetChildren()-然后在GUI中展开/折叠shild
- ProcessLButtonDown()
如果有人在这方面取得了成功,我洗耳恭听。我在TreeListView中也遇到了一些问题,并且在GetChildren()函数中发现了一个问题 GetChildren不必要地试图扩展相关分支以获取子级。这导致内部状态显示为展开,而视图保持折叠状态,并导致内部索引出现问题 原始方法:
public virtual IEnumerable GetChildren(Object model) {
Branch br = this.TreeModel.GetBranch(model);
if (br == null || !br.CanExpand)
return new ArrayList();
if (!br.IsExpanded) // THIS IS THE PROBLEM
br.Expand();
return br.Children;
}
固定方法:
public virtual IEnumerable GetChildren(Object model) {
Branch br = this.TreeModel.GetBranch(model);
if (br == null || !br.CanExpand)
return new ArrayList();
br.FetchChildren();
return br.Children;
}
也许这至少解决了您的一些问题。我在TreeListView中也遇到了一些问题,并且在GetChildren()函数中发现了一个问题 GetChildren不必要地试图扩展相关分支以获取子级。这导致内部状态显示为展开,而视图保持折叠状态,并导致内部索引出现问题 原始方法:
public virtual IEnumerable GetChildren(Object model) {
Branch br = this.TreeModel.GetBranch(model);
if (br == null || !br.CanExpand)
return new ArrayList();
if (!br.IsExpanded) // THIS IS THE PROBLEM
br.Expand();
return br.Children;
}
固定方法:
public virtual IEnumerable GetChildren(Object model) {
Branch br = this.TreeModel.GetBranch(model);
if (br == null || !br.CanExpand)
return new ArrayList();
br.FetchChildren();
return br.Children;
}
也许这至少解决了你的一些问题
“当items CheckState更改时递归调用函数(并确保在以编程方式更改CheckState时忽略后续ItemCheck事件)”
如果TreeListView自检查(“从框”)对您有好处,您只想知道所有员工在手动完成某些主复选框单击后的时间
(这意味着:单击TreeListView(取消)检查所有儿童和家长),
因此,您需要在ObjectListView库中创建额外的事件(以粗略的方式):
\objectlistviewdemo\objectlistview\treelistview.cs
首先添加事件(我的事件不好,但您知道如何修复)
“当items CheckState更改时递归调用函数(并确保在以编程方式更改CheckState时忽略后续ItemCheck事件)”
如果TreeListView自检查(“从框”)对您有好处,您只想知道所有员工在手动完成某些主复选框单击后的时间
(这意味着:单击TreeListView(取消)检查所有儿童和家长),
因此,您需要在ObjectListView库中创建额外的事件(以粗略的方式):
\objectlistviewdemo\objectlistview\treelistview.cs
首先添加事件(我的事件不好,但您知道如何修复)
非常感谢,我自己刚刚发现了这个问题,但是我将有问题的行更改为if
(br.CanExpand)br.FetchChildren()代码>。你有没有注意到这次修改有什么副作用?尽管如此,它看起来还是正确的-这并没有修改分支的Expanded
属性,这导致了所有问题:)+1,不管查看源代码(我应该早一点做!)就我所知,代码更改似乎没有造成任何副作用。与ObjectListView相比,TreeListView有很多缺陷(我以前使用过很多次,没有任何重大问题)。我花了一些时间寻找一个或多或少同等(免费)的替代品,但似乎什么都没有。即使有麻烦,它仍然是一个伟大的组成部分。愉快的编码…感谢Rev1.0-我同意目前为止最好的,但有一些小毛病。非常感谢,我自己刚刚发现了这个问题,但是我将问题行改为if(br.CanExpand)br.FetchChildren()代码>。你有没有注意到这次修改有什么副作用?尽管如此,它看起来还是正确的-这并没有修改分支的Expanded
属性,这导致了所有问题:)+1,不管查看源代码(我应该早一点做!)就我所知,代码更改似乎没有造成任何副作用。与ObjectListView相比,TreeListView有很多缺陷(我以前使用过很多次,没有任何重大问题)。我花了一些时间寻找一个或多或少同等(免费)的替代品,但似乎什么都没有。即使有麻烦,它仍然是一个伟大的组成部分。愉快的编码…感谢Rev1.0-我同意目前为止最好的,但有点奇怪。另外,在这种情况下,您应该在TreeListView.cs中修复:public virtual IEnumerable Children{set{if(checkedness.HasValue&&checkedness.Value==CheckState.Checked)//treeListView.SetObjectCheckedness(x,checkedness.Value);treeListView.SetObjectCheckednessHelper(x,checkedness.Value,0);}只需替换commentedplus,在这种情况下,您应该在TreeListView.cs中修复:public virtual IEnumerable Children{
this.olvDataTree.AfterTreeCheckAndRecalculate += new BrightIdeasSoftware.TreeListView.AfterTreeCheckEventHandler(this.olvDataTree_TreeChecked);
private void olvDataTree_TreeChecked(object sender)
{
//some staff here
}