TreeView нескольких родителей - PullRequest
0 голосов
/ 26 апреля 2018

В настоящее время у меня есть одно дерево, загружающее данные из одной таблицы базы данных SQL. Я получил его для загрузки результатов, но обнаружил, что он загружает один и тот же родительский узел для каждого дочернего объекта и перечисляет только один дочерний объект ниже. Как я могу сгруппировать их, чтобы иметь одного родителя для нескольких детей? Код у меня ниже. Я пытался использовать DISTINCT, но я не уверен, как я могу, и не мог заставить это работать, когда мне нужно вытащить несколько столбцов. Я ценю чью-либо помощь!

Например, мой стол имеет:

WorkOrderName       ItemNumber
45123               101
45123               102
45123               103

И мое дерево в данный момент выглядит так:

+ 45123
  - 101
+ 45123
  - 102
+ 45123
  - 103

Когда мне нужно, чтобы это выглядело так:

+ 45123
  - 101
  - 102
  - 103

Вот код, который у меня есть:

        private void Form1_Shown(object sender, EventArgs e)
        {
        treeView1.Nodes.Clear();

        try
        {
            cn.Open();
        }
        catch(SqlException ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
            Application.ExitThread();
        }

        SqlCommand cm = new SqlCommand("SELECT * FROM ProductTracking WHERE WorkOrderName IS NOT NULL ORDER BY WorkOrderName ASC", cn);

        try
        {
            SqlDataReader dr = cm.ExecuteReader();

            while (dr.Read())
            {
                TreeNode node = new TreeNode(dr["WorkOrderName"].ToString());
                node.Nodes.Add(dr["ItemNumber"].ToString());

                treeView1.Nodes.Add(node);
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Поскольку у вас уже есть данные в порядке WorkOrderName, вам просто нужно отследить родительский узел:

TreeNode parentNode = null;
while (dr.Read()) {
  string parentKey = dr["WorkOrderName"].ToString();
  if (parentNode == null || parentNode.Name != parentKey) {
    parentNode = treeView1.Nodes.Add(parentKey, parentKey);
  }
  parentNode.Nodes.Add(dr["ItemNumber"].ToString());
}
0 голосов
/ 26 апреля 2018

Ну, в качестве простого исправления, вы можете сначала сбросить данные в Dictionary:

отказ от ответственности: это просто быстрое решение; полностью написано и от макушки головы. т.е. более эффективный код может быть написан

try
{
    SqlDataReader dr = cm.ExecuteReader();

    //create a dict of strings which holds a list of "items"
    var dict = new Dictionary<string, List<string>>();

    while (dr.Read())
    {
        var orderName = (dr["WorkOrderName"].ToString();
        //fill the dictionary
        if (!dict.ContainsKey(orderName))
            dict.Add(orderName, new List<string>());

        dict[orderName].Add(dr["ItemNumber"].ToString());
    }

    //this should also be possible with a single linq statement
    //now loop the dictionary and fill the tree
    foreach (var key in dict.Keys)
    {
       //add parent
       TreeNode node = new TreeNode(key);

       //add childs
       foreach(var item in dict[key])
       {
           node.Nodes.Add(item);
       }

       //add it to the treeview
       treeView1.Nodes.Add(node);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...