2014-07-25 3 views
0

Я пытаюсь расширить TreeView на C# несколькими методами, чтобы заполнить дерево и проверить подносы. Тем не менее, я столкнулся с проблемой дизайна, когда я не могу получить доступ к фактическим узлам TreeView, чтобы проверить их.TreeView в C#: проверенные субноды не проверяются и не могут использовать параметры ref

Метод PopulateTree() работает по назначению, и CheckBoxesBelow() успешно вызван из WPF.

enter image description here

private void BusinessUnitsForm_Load(object sender, EventArgs e) 
     { 
      busUnitTreeView.PopulateTree(busUnitTreeView.GetTreeItems("BU")); 
     } 

// a box is checked, so recursively check all boxes below 
private void busUnitTreeView_AfterCheck(object sender, TreeViewEventArgs e) 
    { 
     busUnitTreeView.CheckBoxesBelow(sender,ref e);  
    } 

Однако, узлы не остаются проверены после закрытия меню. Это происходит потому, что узлы создаются локально и не ссылаются на исходные узлы дерева. Тем не менее, я не могу добавить «реф» там или следующее сообщение об ошибке происходит:

A property or indexer may not be passed as an out or ref parameter 

Глядя на ряд различных нитей на той же ошибки, похоже, я должен был бы создавать новые объекты и возврат их, затем установите исходный объект на новый объект. Это не похоже на очень элегантное решение.

// used to check all sub boxes of a node 
     public void CheckBoxesBelow(object sender,ref TreeViewEventArgs e) 
     { 
      if (busy) return; 
      busy = true; 
      try 
      { 
       CheckNodes(e.Node, e.Node.Checked); 
      } 
      finally 
      { 
       busy = false; 
      } 
     } 

     private void CheckNodes(TreeNode node, bool check) 
     { 
      foreach (TreeNode child in node.Nodes) 
      { 
       child.Checked = check; 
       CheckNodes(child, check); 
      } 
     } 

Есть ли лучшее решение, как я мог проверить узлы дерева? В C++ это было бы легко с указателями, но я не понимаю, как это сделать здесь.

Thanks

+1

Какая точка передачи по ссылке? Вы не изменяете ссылку на новый экземпляр где-либо в своих методах, поэтому передача в качестве параметра ref необязательна. –

ответ

1

Для этого вам действительно необходимо использовать DataBinding. Это решит все ваши проблемы. В обработчике события busUnitTreeView_AfterCheck вы просто извлечете базовую структуру данных из DataContext отправителя и установите для свойства, которое вы хотите установить true или false во всех подузлах.

Смежные вопросы