TreeView в C# и MS Access с уникальным идентификатором - PullRequest
0 голосов
/ 27 апреля 2020

У меня TreeView подключен к БД MS Access, я пытаюсь читать / записывать узлы в БД. Я не думаю, что мой путь хорош, потому что для первого и второго уровня узлов это легко, после этого становится все труднее! вот мой путь:

public void LoadNodes()
        {
            ConnectionShorten("TreeViewTable");
            int H = MyNodes.Tables["TreeViewTable"].Rows.Count;
            for (int i = 0; i < H; i++)
            {
                int PID = MyNodes.Tables["TreeViewTable"].Rows[i].Field<int>("ParentID");
                string Name = MyNodes.Tables["TreeViewTable"].Rows[i].Field<string>("RootName");
                int Level = MyNodes.Tables["TreeViewTable"].Rows[i].Field<int>("Level");
                int UID = MyNodes.Tables["TreeViewTable"].Rows[i].Field<int>("UID");
                
                switch (Level)
                {
                    case 0:
                        treeView1.Nodes.Add(Name.ToString());
                        break;
                    case 1:
                        treeView1.Nodes[0].Nodes.Add(Name.ToString());
                        break;
                    case 2:
                        switch (PID)
                        {
                            case 1:
                                treeView1.Nodes[0].Nodes[0].Nodes.Add(Name.ToString());
                                break;
                            case 2:
                                treeView1.Nodes[0].Nodes[1].Nodes.Add(Name.ToString());
                                break;
                            case 3:
                                treeView1.Nodes[0].Nodes[2].Nodes.Add(Name.ToString());
                                break;
                            case 4:
                                treeView1.Nodes[0].Nodes[3].Nodes.Add(Name.ToString());
                                break;
                            case 5:
                                treeView1.Nodes[0].Nodes[4].Nodes.Add(Name.ToString());
                                break;
                            case 6:
                                treeView1.Nodes[0].Nodes[5].Nodes.Add(Name.ToString());
                                break;
                            case 7:
                                treeView1.Nodes[0].Nodes[6].Nodes.Add(Name.ToString());
                                break;
                            case 8:
                                treeView1.Nodes[0].Nodes[7].Nodes.Add(Name.ToString());
                                break;
                            case 9:
                                treeView1.Nodes[0].Nodes[8].Nodes.Add(Name.ToString());
                                break;
                            case 10:
                                treeView1.Nodes[0].Nodes[9].Nodes.Add(Name.ToString());
                                break;
                            case 11:
                                treeView1.Nodes[0].Nodes[10].Nodes.Add(Name.ToString());
                                break;

                            default:
                                break;
                        }
                        break;
                    case 3:

                        break;
                    default:
                        break;
                }
              
            }
        }

Дело в том, что я хочу ввести узлы без ограничений, например: A-> lvl1-> lvl2-> lvl3 -> ... lvl100 ...

Мой Engli sh не так уж и простите за это!

EDIT1: Я хочу читать узлы и записывать их в БД только с уникальным идентификатором. Вот что я пытаюсь сделать.

1 Ответ

0 голосов
/ 27 апреля 2020

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

Эта техника заключается в инициализации только самого первого уровня вашего дерева. Затем для каждого узла, который вы хотите расширить, вы добавляете подузел, называя его dummy subnode. Этот указанный c подузел содержит определенный c текст, который вы хотите отличить от всех других текстов.

 public const string DUMMYNODETEXT = "__dummyNode!!!";

 ...

 var node = new TreeNode("top level node");
 node.Nodes.Add( DUMMYNODETEXT );

 node.Tag = something_that_tags_this_node;

 treeView.Nodes.Add( node );

Затем, когда узел дерева расширен , вы хотите проверьте, содержит ли узел этот специальный фиктивный узел, и если да, только тогда вы хотите инициализировать вложенный уровень.

 public void TreeView_BeforeExpand( object sender, TreeViewCancelEventArgs e )
 {
     if ( e.Node != null &&
          e.Node.Nodes.Count == 1 &&
          e.Node.Nodes[0].Text == DUMMYNODETEXT
         )
     {
         // if you get there, the node containing only the dummy node is being
         // expanded

         // first, remove the dummy node
         e.Node.Nodes.Clear();

         // then, determine which node is expanded
         var tag = e.Node.Tag;

         // depending on the tag value, create subnodes
         // but remember to add dummy nodes to your newly created subnodes
         var newNodes = CreateSubNodesForNode( tag );

         foreach ( var newNode in newNodes )
         {
             e.Node.Nodes.Add( newNode );
         }
     }
 }

 public IEnumerable<TreeNode> CreateSubNodesForNode( object tag )
 {
     if ( tag is .... your type )
     {
         return ...
     }

     if ( tag is .... another type )
     {
         return ... 
     }
 }

Следуя этому шаблону, вы всегда только инициализируете развернутый узел. Фактический запрос к базе данных выполняется только при необходимости. Кроме того, глубина дерева не представляет никаких трудностей.

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