繁体   English   中英

C# 中的 TreeView 和具有唯一 ID 的 MS 访问

[英]TreeView in C# and MS Access with Unique ID

我有一个连接到 MS Access 数据库的 TreeView,我正在尝试将节点读/写到数据库。 我不认为我的方式很好,因为对于第一级和第二级节点来说它很容易,之后变得更加困难:这是我的方式:

 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...

我的英语不是那么好抱歉!

EDIT1:我想读取节点并将它们写入数据库,只有唯一的 ID。 这就是我想要做的。

您需要实现一种常用的技术,称为惰性 treeview 加载

该技术包括仅初始化树的第一级。 然后,对于您希望可扩展的每个节点,添加一个子节点,称为虚拟子节点。 此特定子节点具有您希望与所有其他文本区分开来的特定文本。

 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 ... 
     }
 }

通过遵循此模式,您始终只初始化实际展开的节点。 实际的数据库查询仅在必要时执行。 此外,树的深度不会带来任何困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM