我正在使用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;
}
};
答案 0 :(得分:0)
根据文档," CheckStateGetters"不允许进入treelistview。
来自网页:
一个主要问题是我们不知道所有的检查 子项目。当ObjectListView安装了CheckStateGetter时, 只有这样我们才能知道是否检查了一个项目是通过调用 关于该项目的CheckStateGetter。我们无法推断检查的内容 或者未经检查 - 我们总是要问。在我们的磁盘浏览器示例中,我们 如果被检查,将不得不询问所有700,000件物品。那永远不会 开始工作,所以使用分层复选框,我们不允许 要安装的CheckStateGetters。