【问题标题】:Determine selected tristate确定选定的三态
【发布时间】:2013-09-06 14:18:36
【问题描述】:

我有一个显示Company 类型对象层次结构的树视图。

Company 拥有(除其他外)属性Bool? Checked。我在每一行的复选框中使用该值。我希望该复选框(也)指示是否选择了任何孩子,但我不确定如何为Checked 属性构建Getter

我猜问题是该值不仅代表当前对象的值,还代表子项的组合值。它可以解决还是我需要重新考虑?

这是我想要得到的结果:

  • Checked = True(如果项目本身被选中)
  • 检查 = 假(如果 未检查项目本身并且未检查所有孩子/孙子 检查)
  • Checked = Null(如果项目本身没有被检查并且一些 检查孩子/孙子)
  • Checked = Null(如果项目本身未选中且 ALL 检查孩子/孙子)

类公司:

public class Company
{
    public Company()
    {
        this.childs = new List<Company>();
    }
    public int ID { get; set; }
    public string Title { get; set; }
    public List<Company> childs { get; set; }
    public int NrOfChilds { get { return childs.Count; } }
    public bool Checked {
        get { ??? }
        set { this.Checked = value; }
    }

【问题讨论】:

  • 你不能只枚举getter中的孩子并检查他们的状态吗?但也许我没有得到你想要达到的目标。
  • 是的,我可以枚举所有孩子。没问题。但它变得很棘手,因为每个孩子都可以有自己的孩子。我认为它的三态布尔与递归函数相结合,让我很困惑。我根本不知道如何编写一个返回正确值的递归函数!
  • 我认为有一个简单的代码解决方案可以解决这个问题,涉及 XOR 和其他一些我必须掌握的东西。但现在我最终得到了 60 行代码,除了正确的结果之外,这些代码可以产生所有其他可以想象的结果 :)

标签: c# recursion objectlistview tri-state-logic


【解决方案1】:

好的,所以使用可为空的 bool 是 OLV 的要求,对吧?

但是不应该用这种方法来实现你想要的吗?

class Entity {
    private bool? _CheckState;
    public List<Entity> ChildEntities { get; set; }

    public Entity() {
        _CheckState = false;
        ChildEntities = new List<Entity>();
    }

    public bool? CheckState {
        get {
            if (_CheckState == true) {
                return true;
            } else if (ChildEntities.All(child => child.CheckState == false)) {
                return false;
            } else {
                return null;
            }
        }
        set { _CheckState = value; }
    }
}

【讨论】:

  • 哈哈,在实现这个 Getter 时遇到了“StackOverflowException”!当你想到它时会很有趣:)
  • @David:这不应该发生。但是查看您的原始代码示例,您调用“set { this.Checked = value; }”,这也会导致 StackOverflow(没有双关语;)),因为您递归地调用了该属性。也许你在 setter 中犯了同样的错误?
  • 是的,错过了。我称之为 this.Marked 而不是 this._marked。现在它的工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2021-01-22
  • 2014-06-06
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多