2012-01-28 22 views
0

我正在使用Winform C#和MySQL。如何將數據插入Winform TreeView(C#)中的有效編碼?

我有列名稱和父ID的表。

我得到了解決方案,但它太大了,每次我想改變這段代碼。

請幫我添加數據與父母的ID。以簡單的格式。

string MyConString = ConfigurationManager.ConnectionStrings["College_Management_System.Properties.Settings.cmsConnectionString"].ConnectionString; 
       MySqlConnection connection = new MySqlConnection(MyConString); 
       MySqlCommand command = connection.CreateCommand(); 
       MySqlDataReader Reader; 
       command.CommandText = "select * from menu_details"; 
       connection.Open(); 
       Reader = command.ExecuteReader(); 
       while (Reader.Read()) 
       { 
        if (Reader[2].ToString() == Convert.ToString(0)) 
        { 
         treeView1.Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 

        if (Reader[2].ToString() == Convert.ToString(1)) 
        { 
         treeView1.Nodes[0].Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 

        if (Reader[2].ToString() == Convert.ToString(2)) 
        { 
         treeView1.Nodes[1].Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 

        if (Reader[2].ToString() == Convert.ToString(3)) 
        { 
         treeView1.Nodes[2].Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 

        if (Reader[2].ToString() == Convert.ToString(4)) 
        { 
         treeView1.Nodes[3].Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 

        if (Reader[2].ToString() == Convert.ToString(7)) 
        { 
         treeView1.Nodes[1].Nodes[0].Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 

        if (Reader[2].ToString() == Convert.ToString(8)) 
        { 
         treeView1.Nodes[1].Nodes[1].Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 

        if (Reader[2].ToString() == Convert.ToString(9)) 
        { 
         treeView1.Nodes[1].Nodes[2].Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 

        if (Reader[2].ToString() == Convert.ToString(29)) 
        { 
         treeView1.Nodes[1].Nodes[3].Nodes.Add(Reader[3].ToString(), Reader[1].ToString()); 
        } 
       } 
       connection.Close(); 
      } 
      catch { } 

更新的問題 -

我嘗試Eswarn,..

以下格式不正常@!

dt.Rows.Add(new string[] { "1", "One", null }); 
      dt.Rows.Add(new string[] { "2", "Two", null }); 
      dt.Rows.Add(new string[] { "3", "Three", "2" }); 
      dt.Rows.Add(new string[] { "4", "Four", "1" }); 
      dt.Rows.Add(new string[] { "5", "Five", "4" }); 
      dt.Rows.Add(new string[] { "6", "Six", "2" }); 
      dt.Rows.Add(new string[] { "7", "Seven", "1" }); 
      dt.Rows.Add(new string[] { "8", "Eight", "7" }); 
      dt.Rows.Add(new string[] { "9", "Nine", "8" }); 

enter image description here

回答

0

解析的Reader[2]的值,以避免字符串比較(總是使用.Equals()如果你這樣做!!!!)和使用switch語句:

while (Reader.Read()) 
{ 
    TreeNodeCollection parent; 
    int readValue = Int32.Parse(Reader[2].ToString); 
    switch(readValue) 
    { 
    case 1: 
    case 2: 
    case 3: 
    case 4: 
     parent = treeView1.Nodes[readValue-1].Nodes; 
     break; 
    case 7: 
    case 8: 
    case 9: 
     parent = treeView1.Nodes[1].Nodes[readValue-7].Nodes; 
     break; 
    case 29: 
     parent = treeView1.Nodes[1].Nodes[3].Nodes; 
     break; 
    default: 
     parent = treeView1.Nodes; 
     break; 
    } 

    parent.Add(Reader[3].ToString(), Reader[1].ToString()); 
} 
0

下面的代碼用XML填充treeview。你可以在MySQL的太多改變這種..

private void populateBaseNodes() 
{ 
    treeViewMenu.Nodes.Clear(); // Clear any existing items 
    treeViewMenu.BeginUpdate(); // Begin updating the treeview 
    TreeNode treenode; 
    treenode = treeViewMenu.Nodes.Add("Folders"); 

    XmlNodeList baseNodeList = docXML.SelectNodes("root/folder"); 
    // Get all first level <folder> nodes 

    foreach (XmlNode xmlnode in baseNodeList) 
    // loop through all base <folder> nodes 
    { 
     string title = xmlnode.Attributes["title"].Value; 

     treenode = treeViewMenu.Nodes.Add(title); // add it to the tree 

     populateChildNodes(xmlnode, treenode); // Get the children 
    } 

    treeViewMenu.EndUpdate(); // Stop updating the tree 
    treeViewMenu.Refresh(); // refresh the treeview display 
} 

private void populateChildNodes(XmlNode oldXmlnode, TreeNode oldTreenode) 
{ 
    TreeNode treenode = null; 
    XmlNodeList childNodeList = oldXmlnode.ChildNodes; 
    // Get all children for the past node (parent) 

    foreach (XmlNode xmlnode in childNodeList) 
    // loop through all children 
    { 
     string title = xmlnode.Attributes["title"].Value; 
     // add it to the parent node tree 
     treenode = oldTreenode.Nodes.Add(title); 
     populateChildNodes(xmlnode, treenode); 
    } 
} 

http://www.codeproject.com/Articles/42272/Populate-TreeView-Menu-with-XML

+0

這很難理解。任何人都可以在MySQL中進行更改。 – Sagotharan 2012-01-28 11:52:15

0

創建一個新的類來表示你的數據庫記錄:

我已經使用的命名約定從Add方法上TreeNodeCollection ,其中Key是節點值,Text是節點標籤,因爲您沒有清楚地表明表中的列實際被調用的是什麼或它們是什麼類型。如果您可以將這些信息添加到問題中,將會非常有用。

public class TreeNodeRecord 
{ 
    public string Key { get; set; } 
    public string ParentKey { get; set; } 
    public string Text { get; set; } 
} 

通常,Key將是數據庫中的主鍵值(通常稱爲類似ID的東西)。 ParentKey將是父節點的主鍵值(通常存儲在名爲類似ParentId的列中)。您的代碼似乎以這種方式將節點鏈接在一起,這是在數據庫中存儲樹的最常見實現。

因此,例如:

  • 一個TreeNodeRecord其中密鑰= 1和ParentKey = 0是根節點
  • 一個TreeNodeRecord其中密鑰= 2和ParentKey = 1是根節點的子節點。

創建一個類來封裝方法填充一個TreeView從數據庫節點:

public static class TreeBuilder 
{ 
    public static void BuildTree(TreeView treeview) 
    { 
     // Load database records into strongly typed list 
     List<TreeNodeRecord> records = GetTreeNodeRecords(); 

     //Pause redrawing for the tree view control 
     treeview.BeginUpdate(); 
     // Recursively add all items in the list to the tree 
     AddNodes(records, "0", treeview.Nodes); 
     // Resume redrawing for the tree view control 
     treeview.EndUpdate(); 
    } 

    // A method that reads all of the database records, and returns a strongly typed list for further processing 
    private static List<TreeNodeRecord> GetTreeNodeRecords() 
    { 
     List<TreeNodeRecord> records = new List<TreeNodeRecord>(); 

     string MyConString = ConfigurationManager.ConnectionStrings["College_Management_System.Properties.Settings.cmsConnectionString"].ConnectionString; 
     using (MySqlConnection connection = new MySqlConnection(MyConString)) 
     { 
      connection.Open(); 

      using (MySqlCommand command = connection.CreateCommand()) 
      { 
       MySqlDataReader reader; 
       command.CommandText = "select * from menu_details"; 

       using (reader = command.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         TreeNodeRecord newRecord = new TreeNodeRecord 
         { 
          Key = reader[3].ToString(), 
          ParentKey = reader[2].ToString(), 
          Name = reader[1].ToString() 
         }; 
         records.Add(newRecord); 
        } 
       } 
      } 
     } 

     return records; 
    } 

    // A recursive method to add nodes to the tree 
    private static void AddNodes(List<TreeNodeRecord> records, string parentKey, TreeNodeCollection nodes) 
    { 
     List<TreeNodeRecord> children = records.Where(r => r.ParentKey == parentKey).ToList(); 

     foreach (TreeNodeRecord child in children) 
     { 
      TreeNode newNode = nodes.Add(child.Key, child.Text); 
      AddNodes(records, child.Key, newNode.Nodes); 
     } 

    } 
} 

使用類來填充您的TreeView控件:

TreeBuilder.BuildTree(treeView1); 

請注意,正確處理您的物體非常重要。如果您正在使用的對象實現IDisposable(具有Dispose()方法),則應在完成處理後調用Dispose()。上面的代碼通過將對象封裝在使用語句中來實現這一點,這確保了即使引發任何異常也會調用Dispose()。

+0

謝謝sga。我會執行這個。 – Sagotharan 2012-01-29 06:21:04

+0

只有父母在Treeview中添加。孩子不被添加。這個Key是什麼意思? – Sagotharan 2012-01-29 06:57:45

+0

我編輯了答案來解釋每個值是什麼。我希望這有幫助。 – sga101 2012-01-29 07:43:21

相關問題