【问题标题】:TreeListView and hierarchical checkboxesTreeListView 和分层复选框
【发布时间】:2016-01-22 06:43:49
【问题描述】:

我正在使用 TreeListView:

this.tlv.CheckBoxes = true;
this.tlv.TriStateCheckBoxes = true;
this.tlv.HierarchicalCheckboxes = true;

具有三态的分层效果很好,除了一个:用户可以通过单击鼠标设置 CheckState.Indeterminate,我不需要它。为此,我使用了 2 个无法正常工作的委托。如何让它发挥作用?

this.tvl.CheckStateGetter = delegate(object rowObject)
{                
    if (((ModelData)rowObject).IsChecked == true)
    {
        return CheckState.Checked;
    }
    else
    {
        if (((ModelData)rowObject).IsChecked == false)
        {
            return CheckState.Unchecked;
        }
        else
        {
            return CheckState.Indeterminate;
        }
    }
};
this.tvl.CheckStatePutter = delegate(object rowObject, CheckState newValue)
{
    if (((ModelData)rowObject).Child.Count > 0)
    {
        if ((((ModelData)rowObject).Child.Where(x => x.IsChecked != null).Any(x => (bool)x.IsChecked) && 
            ((ModelData)rowObject).Child.Where(x => x.IsChecked != null).Any(x => !(bool)x.IsChecked)) || 
            (((ModelData)rowObject).Child.Any(x => x.IsChecked == null)))
        {                        
            ((ModelData)rowObject).IsChecked = null;
            return CheckState.Indeterminate;
        }
        else
        {
            if (((ModelData)rowObject).Child.Where(x => x.IsChecked != null).All(x => (bool)x.IsChecked))
            {                            
                ((ModelData)rowObject).IsChecked = true;
                return CheckState.Checked;
            }
            else
            {
                ((ModelData)rowObject).IsChecked = false;
                return CheckState.Unchecked;
            }
        }
    }
    else
    {
        ((ModelData)rowObject).IsChecked = (newValue == CheckState.Checked) ? true : false;
        return newValue;
    }                      
};

【问题讨论】:

    标签: c# winforms objectlistview


    【解决方案1】:

    根据文档,树列表视图中不允许使用“CheckStateGetters”。

    来自网页:

    一个主要问题是我们不知道所有 子项。当 ObjectListView 安装了 CheckStateGetter 时, 我们可以知道一个项目是否被检查的唯一方法是调用 CheckStateGetter 在该项目上。我们无法推断检查的内容 或未经检查——我们总是要问。在我们的磁盘浏览器示例中,我们 如果它被检查,将不得不询问所有 700,000 个项目。那从来没有 去工作,所以对于分层复选框,我们不允许 要安装的 CheckStateGetters。

    http://objectlistview.sourceforge.net/cs/blog7.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 2014-07-09
      • 1970-01-01
      • 2015-08-16
      相关资源
      最近更新 更多