TreeView Control. Флажки. И нажав - PullRequest
0 голосов
/ 26 января 2010

Я добавил флажки в свое древовидное представление и использую событие AfterSelect (также пытался AfterChecked).

Мое дерево выглядит так

1 Штат
1.1 City1
1.2 City2
1,3 City3
2 State
2,1 Город1
2,2 City2
2,3 City3

и т.д.

Я пытаюсь запустить событие, поэтому, когда флажок установлен, тег добавляется в массив, готовый к обработке позже. Мне также нужно использовать его, чтобы при нажатии на штат он выбирал все города под этим листом.

treeSections.AfterSelect += node_AfterCheck;

private void node_AfterCheck(object sender, TreeViewEventArgs e)
{
    MessageBox.Show("testing");
}

Приведенный выше код работает в древовидной структуре, если у него нет иерархии. Но не работайте над древовидной структурой со штатами и городами, если дважды щелкнуть текст / метку для каждого листа.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 26 января 2010

Я предлагаю использовать комбинацию событий TreeView.NodeMouseClick и TreeView.KeyUp ... событие click предоставит вам узел, по которому щелкнули, посредством аргументов события, и с помощью keyup вы можете использовать текущий выбранный узел. Следуйте примеру ниже ...

//This is basic - you may need to modify logically to fit your needs
void ManageTreeChecked(TreeNode node)
{
   foreach(TreeNode n in node.Nodes)
   {
      n.Checked = node.Checked;
   }
}

private void convTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
   ManageTreeChecked(e.Node);
}
private void convTreeView_KeyUp(object sender, KeyEventArgs e)
{
   if (e.KeyCode == Keys.Space)
   {
      ManageTreeChecked(convTreeView.SelectedNode);
   }
}

Используя узел, заданный для каждого события, вы теперь можете циклически проходить через коллекцию узлов на этом узле и изменять ее, чтобы проверять / снимать флажок, учитывая статус проверенного состояния узла, с которым вы действовали.

Вы даже можете получить достаточно фантазии, чтобы снять отметку с родительского узла, когда все дочерние узлы сняты. Если вы хотите использовать три состояния с тремя состояниями (Все проверено, Некоторые проверены и Ни один не проверен), вам нужно создать его или найти созданный.

Наслаждайтесь, удачи.

1 голос
/ 27 января 2010

Код для рассмотрения:

Здесь не рассматривается:

  1. что относительно того, какой узел выбран при проверке, когда выбор дочернего узла вынуждает выбрать родительский узел (поскольку выбраны все другие дочерние узлы).

  2. могут быть другие случаи, связанные с отбором, которые здесь не рассматриваются.

Допущения:

  1. вы находитесь в TreeView с режимом выбора одного узла

  2. только два уровня глубины, как в примере OP (рекурсия «для тяжелых условий эксплуатации» не требуется)

  3. все сделано только с помощью мыши: дополнительные действия, такие как нажатие клавиатуры, не требуются.

  4. если проверены все дочерние узлы, родительский узел проверяется автоматически

  5. снятие отметки с любого дочернего узла снимает флажок с проверенного родительского узла

  6. проверка или снятие флажка родительского узла установит все дочерние узлы в одно и то же состояние проверки

...

    // the current Node in AfterSelect
    private TreeNode currentNode;

    // flag to prevent recursion
    private bool dontRecurse;

    // boolean used in testing if all child nodes are checked
    private bool isChecked;

    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        // prevent recursion here
        if (dontRecurse) return;

        // set the currentNode
        currentNode = e.Node;

        // for debugging
        //Console.WriteLine("after check node = " + currentNode.Text);

        // select or unselect the current node depending on checkstate
        if (currentNode.Checked)
        {
            treeView1.SelectedNode = currentNode;
        }
        else
        {
            treeView1.SelectedNode = null;
        }

        if(currentNode.Nodes.Count > 0)
        {
            // node with children : make the child nodes
            // checked state match the parents
            foreach (TreeNode theNode in currentNode.Nodes)
            {
                theNode.Checked = currentNode.Checked;
            }
        }
        else
        {
            // assume a child node is selected here
            // i.e., we assume no root level nodes without children

            if (!currentNode.Checked)
            {
                // the child node is unchecked : uncheck the parent node
                dontRecurse = true;

                    currentNode.Parent.Checked = false;

                dontRecurse = false;
            }
            else
            {
                // the child node is checked : check the parent node 
                // if all other siblings are checked
                // check the parent node
                dontRecurse = true;

                    isChecked = true;

                    foreach(TreeNode theNode in currentNode.Parent.Nodes)
                    {
                       if(theNode != currentNode)
                       {
                           if (!theNode.Checked) isChecked = false;
                       }
                    }

                    if (isChecked) currentNode.Parent.Checked = true;

                dontRecurse = false;
            }

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