Как вставить данные в Winform TreeView (C #) в эффективном кодировании? - PullRequest
0 голосов
/ 28 января 2012

Я использую Winform C # и MySQL.

У меня есть таблица с именем столбца и идентификатором родителя.

У меня есть решение, но оно слишком велико, и каждый раз, когда я хочу изменить этот код.

Пожалуйста, помогите мне добавить данные с идентификатором родителя. В простом формате.

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

Ответы [ 3 ]

0 голосов
/ 28 января 2012

Ниже код заполняет древовидную структуру XML. Вы можете изменить это и в 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 голосов
/ 28 января 2012

Создайте новый класс для представления записей вашей базы данных:

Я использовал соглашение об именовании из метода Add для TreeNodeCollection, где Key - это значение узла, а Text - метка узла, потому что вы еще не дали понять, как на самом деле называются столбцы в вашей таблице или типы они есть. Было бы полезно добавить эту информацию в вопрос.

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

Обычно ключ - это значение первичного ключа (обычно называемое идентификатором) из базы данных. ParentKey будет значением первичного ключа родительского узла (обычно хранится в столбце, называемом чем-то вроде ParentId). Ваш код, кажется, связывает узлы таким образом, что является наиболее распространенной реализацией хранения дерева в базе данных.

Так, например:

  • TreeNodeRecord, где Key = 1 и ParentKey = 0 - корневой узел
  • TreeNodeRecord, где Key = 2 и ParentKey = 1 - дочерний элемент корневого узла.

Создайте класс для инкапсуляции методов заполнения дерева с узлами из вашей базы данных:

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 (), когда закончите с ним. Приведенный выше код достигает этого, заключая объекты в операторы using, что обеспечивает вызов Dispose () даже в случае возникновения каких-либо исключений.

0 голосов
/ 28 января 2012

Анализ значения 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...