2012-01-28 55 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

相关问题