[英]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.