c # дерево, выберите дочерний узел, когда выберите родительский узел - PullRequest
0 голосов
/ 27 марта 2012

я создаю один вид дерева. связать это древовидное представление с базой данных.

Я хочу, чтобы при выборе родительского узла автоматически выбирались все дочерние узлы.

в c # что я могу сделать ??

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Это то, что вы хотите:

// Updates all child tree nodes recursively.
private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
{
   foreach(TreeNode node in treeNode.Nodes)
   {
      node.Checked = nodeChecked;
      if(node.Nodes.Count > 0)
      {
         // If the current node has child nodes, call the CheckAllChildsNodes method recursively.
         this.CheckAllChildNodes(node, nodeChecked);
      }
   }
}

// NOTE   This code can be added to the BeforeCheck event handler instead of the AfterCheck event.
// After a tree node's Checked property is changed, all its child nodes are updated to the same value.
private void node_AfterCheck(object sender, TreeViewEventArgs e)
{
   // The code only executes if the user caused the checked state to change.
   if(e.Action != TreeViewAction.Unknown)
   {
      if(e.Node.Nodes.Count > 0)
      {
         /* Calls the CheckAllChildNodes method, passing in the current 
         Checked value of the TreeNode whose checked state changed. */
         this.CheckAllChildNodes(e.Node, e.Node.Checked);
      }
   }
}
0 голосов
/ 08 декабря 2014

Приведенный выше код работает ненадежно - это код копирования / вставки из темы события MSDN AfterCheck, однако событие не срабатывает надежно при двойном щелчке - вам нужно смешать код, который отключает двойной щелчок - это то, что я нашелкак обходной путь в MSDN:

public class MyTreeView : TreeView
{
    #region Constructors

    public MyTreeView()
    {
    }

    #endregion

    #region Overrides

    protected override void WndProc(ref Message m)
    {
        // Suppress WM_LBUTTONDBLCLK on checkbox
        if (m.Msg == 0x0203 && CheckBoxes && IsOnCheckBox(m))
        {
            m.Result = IntPtr.Zero;
        }
        else
        {
            base.WndProc(ref m);
        }
    }

    #endregion

    #region Double-click check

    private int GetXLParam(IntPtr lParam)
    {
        return lParam.ToInt32() & 0xffff;
    }

    private int GetYLParam(IntPtr lParam)
    {
        return lParam.ToInt32() >> 16;
    }

    private bool IsOnCheckBox(Message m)
    {
        int x = GetXLParam(m.LParam);
        int y = GetYLParam(m.LParam);
        TreeNode node = GetNodeAt(x, y);
        if (node == null)
            return false;
        int iconWidth = ImageList == null ? 0 : ImageList.ImageSize.Width;
        int right = node.Bounds.Left - 4 - iconWidth;
        int left = right - CHECKBOX_WIDTH;
        return left <= x && x <= right;
    }

    const int CHECKBOX_WIDTH = 12;

    #endregion
0 голосов
/ 27 марта 2012

Когда вы говорите «выбранный», вы имеете в виду с флажками?Если вы имеете в виду только «выделенный», то это идет вразрез с дизайном древовидных элементов управления - в любой момент времени может быть выделена только одна ветвь / лист (чтобы показать тот, который вы выбрали в данный момент).Если вы имеете в виду, что установка флажка в поле родительской ветви также устанавливает флажок для всех дочерних ящиков, то вам нужно реагировать на событие, которое вызывается, когда вы щелкаете по ветви, проверяете проверенное состояние и вручную перемещаете потомков ветви кустановить их проверенное состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...