C# ObjectListView-TreeListView自动三态检查

C# ObjectListView-TreeListView自动三态检查,c#,recursion,objectlistview,treelistview,C#,Recursion,Objectlistview,Treelistview,是否有人成功地使三态复选框在TreeListView中正常工作,而不使用模型对象中的属性来存储复选状态 例如,检查一个节点。应检查其所有子女(以及子女的子女等),然后根据其兄弟姐妹检查其所有父母/祖父母CheckStates 我尝试了几种方法,但每种方法都会在TreeListView类中获得一个ArgumentOutOfRange/ArgumentException。这包括: 将所有节点CheckStates存储在字典中,并将其用作查找CheckStateGetter事件 当itemsChec

是否有人成功地使三态复选框在TreeListView中正常工作,而不使用模型对象中的属性来存储复选状态

例如,检查一个节点。应检查其所有子女(以及子女的子女等),然后根据其兄弟姐妹检查其所有父母/祖父母
CheckStates

我尝试了几种方法,但每种方法都会在TreeListView类中获得一个
ArgumentOutOfRange
/
ArgumentException
。这包括:

  • 将所有节点CheckStates存储在字典中,并将其用作查找
    CheckStateGetter
    事件
  • 当items
    CheckState
    更改时递归调用函数(并确保在编程更改
    CheckStates
    时忽略后续的ItemCheck事件)
  • 调用函数以确定直接的子节点/父节点状态,并让TreeListView为每个受影响的节点触发
    ItemChecked
    事件
我经常从以下函数(在TreeListView.cs中)中得到错误:

  • 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
    }