C# Treeview添加重复节点
我有一棵深度为2的树,如下所示C# Treeview添加重复节点,c#,asp.net,C#,Asp.net,我有一棵深度为2的树,如下所示 Module 1 Form 1 Tab 1 Form 2 Tab 2 Tab 3 Form 2 Tab 2 Tab 3 Module 2 Form 4 Tab 2 Form 5 Tab 4 Tab 5 Tab 6 Form 5 Tab 4
Module 1
Form 1
Tab 1
Form 2
Tab 2
Tab 3
Form 2
Tab 2
Tab 3
Module 2
Form 4
Tab 2
Form 5
Tab 4
Tab 5
Tab 6
Form 5
Tab 4
Tab 5
Tab 6
Form 5
Tab 4
Tab 5
Tab 6
如上所示,问题在于,表单
的显示次数与选项卡
的显示次数相同。例如,如果表格5
有三个选项卡
,则它将显示三次。
我需要它们只显示一次,因为它们的选项卡是相同的
这是我的代码:
private void LoadTreeview()
{
string sql = "SELECT Module, Form, Tab, HelpText " +
"FROM PageHelp " +
"WHERE Module IS NOT NULL";
DataTable dt = Public_Methods.Get_DataTable(sql);
DataView dvModules = new DataView(dt, "Module IS NOT NULL", "Module ASC", DataViewRowState.Unchanged);
DataTable dtModules = dvModules.ToTable(true, "Module");
for (int count = 0; count < dtModules.Rows.Count; count++)
{
TreeNode TModule = new TreeNode();
TModule.Value = dtModules.Rows[count]["Module"].ToString();
TModule.Text = dtModules.Rows[count]["Module"].ToString();
TModule.Collapse();
LoadForms(ref TModule, dt);
TreeView_EditHelp_Help.Nodes.Add(TModule);
}
}
private void LoadForms(ref TreeNode TModule, DataTable dt)
{
DataRow[] drForms = dt.Select("Module='" + TModule.Value + "'");
for (int count = 0; count < drForms.Length; count++)
{
TreeNode TForm = new TreeNode();
TForm.Value = drForms[count]["Form"].ToString();
TForm.Text = drForms[count]["Form"].ToString();
TForm.Collapse();
LoadTabs(ref TForm, dt);
TModule.ChildNodes.Add(TForm);
}
}
private void LoadTabs(ref TreeNode TForm, DataTable dt)
{
DataRow[] drTabs = dt.Select("Form='" + TForm.Value + "'");
for (int count = 0; count < drTabs.Length; count++)
{
TreeNode TTab = new TreeNode();
TTab.Value = drTabs[count]["Tab"].ToString();
TTab.Text = drTabs[count]["Tab"].ToString();
TTab.Collapse();
TForm.ChildNodes.Add(TTab);
}
}
private void LoadTreeview()
{
string sql=“选择模块、表单、选项卡、帮助文本”+
“来自页面帮助”+
“其中模块不为空”;
DataTable dt=公共方法。获取数据表(sql);
DataView dvModules=新数据视图(dt,“模块不为空”、“模块ASC”、DataViewRowState.Unchanged);
数据表dtModules=dvModules.ToTable(真,“模块”);
对于(int count=0;count
需要帮忙吗
DataRow[] drForms = dt.Select("Module='" + TModule.Value + "'");
改为:
DataRow[] drForms = dt.Select("Module='" + TModule.Value + "'").CopyToDataTable().DefaultView.ToTable(true,"Form").Select();
试试下面这样的东西
for (int count = 0; count < dtModules.Rows.Count; count++)
{
TreeNode TModule = new TreeNode();
TModule.Value = dtModules.Rows[count]["Module"].ToString();
TModule.Text = dtModules.Rows[count]["Module"].ToString();
TModule.Collapse();
f =0;
for(int j=0;j<count;j++)
{ // check the new module has been previously ocured or not
if(dtModules.Rows[count]["Module"].ToString() == dtModules.Rows[j]["Module"].ToString())
{
f=1;
break;
}
}
if(f== 0){
LoadForms(ref TModule, dt);
TreeView_EditHelp_Help.Nodes.Add(TModule);
}
}
for(int count=0;count 对于(int j=0;jSQL查询返回一个shape(module,form,tab)
(模块,表单,tab)的行列表,因此如果有3个选项卡属于同一个模块和表单,那么它们都存在于所有3行中。但是,您仍然可以正确地处理模块。只需对表单执行相同的操作。DataRow[]drForms=dt.选择(“module=”)+t模块值+“'”)
带回来?这就是你的问题所在。我建议你对这些进行不同的筛选。@Heuster没错,我对模块没有问题,因为它们显示得很好,只有表单有问题。你试过了,但是在方法中选择一个不属于表的字段时出现了问题。@SollyM它返回模块的第一个表单
method.Works like magic。你早就应该加入stackoverflow了。花了5个小时调试这个。非常感谢。我还没有尝试过这个方法,但是上面的答案用一行代码就解决了我的问题。你的代码中的问题是,它在同一个模块中多次出现时都在获取记录,我刚刚检查了是否已被删除显然发生了,不要去做