2016-01-22 66 views
0

我使用TreeListView有: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

根據文檔,「CheckStateGetters」不允許在treelistview中使用。

從網頁:

一個主要問題是,我們不知道所有的 子項的checkedness。當一個ObjectListView安裝了一個CheckStateGetter時, 我們可以知道一個項目是否被檢查的唯一方法是調用該項目上的 CheckStateGetter。我們不能推斷什麼是 或未檢查 - 我們總是要問。在我們的磁盤瀏覽器示例中,我們 必須詢問所有700,000個項目,如果它被檢查。這絕不是 可以工作,所以通過分層複選框,我們不允許安裝 CheckStateGetters。

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