TreeListView和分层复选框

时间:2016-01-22 06:43:49

标签: c# winforms objectlistview

我正在使用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;
    }                      
};

1 个答案:

答案 0 :(得分:0)

根据文档," CheckStateGetters"不允许进入treelistview。

来自网页:

  

一个主要问题是我们不知道所有的检查   子项目。当ObjectListView安装了CheckStateGetter时,   只有这样我们才能知道是否检查了一个项目是通过调用   关于该项目的CheckStateGetter。我们无法推断检查的内容   或者未经检查 - 我们总是要问。在我们的磁盘浏览器示例中,我们   如果被检查,将不得不询问所有700,000件物品。那永远不会   开始工作,所以使用分层复选框,我们不允许   要安装的CheckStateGetters。

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