2013-07-31 124 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

你的代碼中的問題是它正在爲相同的模塊提取記錄多次,我剛剛檢查過,如果以前發生過,不要去找它 –