2013-07-31 97 views
0

我有一棵深度为2的树,如下所示。Treeview添加重复节点

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 

如上图所示,问题在于,所述Forms将被显示多次它们具有Tabs。例如,如果Form 5三个Tabs,它将显示三次。 我需要他们只显示一次,因为他们的标签是相同的。

这是我的代码:

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); 
     } 
    } 

任何帮助吗?

+0

你的SQL查询返回的行的列表形状'(模块,表单,选项卡)'的形状,所以如果你有3个属于同一个模块和形式的选项卡,那么它们都存在于所有3行中。但是,您仍然可以正确处理模块。只要对表单做同样的事情。 –

+0

DataRow [] drForms = dt.Select(“Module ='”+ TModule.Value +“'”);'带回?这就是你的问题所在。我建议你过滤不同的这些。 – SollyM

+0

@Heuster那是真的,我没有'Modules'的问题,因为它们显示得很好,只有'Forms'有问题。已经尝试过,但是出现了选择不属于该方法中的表的字段的问题。 – mutiemule

回答

2
DataRow[] drForms = dt.Select("Module='" + TModule.Value + "'"); 

变化:

DataRow[] drForms = dt.Select("Module='" + TModule.Value + "'").CopyToDataTable().DefaultView.ToTable(true,"Form").Select(); 
+0

像魔术一样工作。您应该在几年前加入了stackoverflow。 花费了5个小时来调试。非常感谢。 – mutiemule

0

尝试一些东西像下面

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);     
} 
     } 

可以用于检查和创建独立的功能

+0

还没有尝试过,但上面的答案只用一行代码解决了我的问题。 – mutiemule

+0

你的代码中的问题是它正在为相同的模块提取记录多次,我刚刚检查过,如果以前发生过,不要去找它 –