Member 14633609 Ответов: 1

Заполнение treeview до N уровней в C# из базы данных без какого-либо целочисленного столбца


Я хочу TreeView как:-

A-1 (Родительский Узел)
---A01-(Подузел A)
-------A0101-(Подузел A01)
........
B-1 (Родительский Узел)
----B01-(Подузел B)
-------B0101-(Подузел B01)
.......
C-1 (Родительский Узел)
.
.
.

Что я уже пробовал:

SqlCommand cmd = new SqlCommand("SELECT SUBSTRING(BCD,1,1)[PARENT], BCD, DESCRIPTION from BALANCE_SHEET where TYPE = 'S' GROUP BY BCD, DESCRIPTION", con);
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(DT);

var treeParent = DT.AsEnumerable().Select(a => a.Field<string>("parent")).Distinct();
int count = 0;

foreach(string row in treeparent)
{
    var des = DT.AsEnumerable().Where(b => b.Field <string>("BCD") == row).CopyToDataTable();
    
    string ParentNode = row + " - " + Des.Rows[0]["DESCRIPTION"].ToString();
    TreeViewBcd.Nodes.Add(ParentNode);

    var dtnodeList = DT.AsEnumerable().Where(c => c.Field<string>("BCD").Contains(row) && !Equals(row.Substring(0))).CopyToDataTable();
    
    foreach(DataRow dataRow in dtnodeList.Rows)
    {
        if (!dataRow["BCD"].ToString().Equals(row))
        {
            string childNode = dataRow.ItemArray[1].ToString() + " - " + dataRow.ItemArray[2].ToString();
            TreeViewBcd.Nodes[count].Nodes.Add(childNode);
        }
    }
    
    count++;
}

con.Close();

Richard Deeming

Редактору удалось сломать форматирование вашего кода. Я думаю, что теперь мне удалось это исправить.

Теперь вам нужно объяснить, в чем проблема.

Kornfeld Eliyahu Peter

Правильно ли я понимаю (из вашего SQL), что первая буква идентификатора узла-это идентификатор родительского узла? Теперь это совсем не соответствует образцу, который вы дали выше...
Чтобы создать хорошую привязку дерева, вы должны вернуться из SQL с 3 столбцами для каждого узла: parent id, node id, text (где parent id будет равен null для корня(2))...

j snooze

Я предполагаю, что вы хотите, чтобы ваши результаты SQL были ближе к тому, что даст этот маленький образец SQL...это предполагает, что ваше значение BCD последовательно составляет 1 символ, а дочерние значения постоянно добавляются к корневому символу длиной 2 символа. Таким образом, это просто возвращает родителя как BCD менее 2 символов... Поскольку я не знаю, так это или нет, это что-то, чтобы зажечь идею, чтобы, возможно, помочь вам закончить то, что вы пытаетесь выполнить.

выберите дело
когда len(BCD) = 1, то BCD
Else substring(BCD,1,len(BCD)-2)
Конец как родитель,
BCD,
Описание
из Balance_Sheet, где type = 'S'

1 Ответов

Рейтинг:
1

j snooze

Я предполагаю, что вы хотите, чтобы ваши результаты SQL были ближе к тому, что даст этот маленький образец SQL...это предполагает, что ваше значение BCD последовательно составляет 1 символ, а дочерние значения постоянно добавляются к корневому символу длиной 2 символа. Таким образом, это просто возвращает родителя как BCD менее 2 символов... Поскольку я не знаю, так это или нет, это что-то, чтобы зажечь идею, чтобы, возможно, помочь вам закончить то, что вы пытаетесь выполнить.

выберите дело
когда len(BCD) = 1, то BCD
Else substring(BCD,1,len(BCD)-2)
Конец как родитель,
BCD,
Описание
из Balance_Sheet, где type = 'S'


Member 14633609

Я хочу, чтобы TreeView, как A,L и P, был родительским узлом и
А01,А02,А03 ребенка и a0101 и nbsp;, A0102,A0103 ребенка А01 и A010101,A010102,A010103 ребенка a0101 и nbsp;---

От l01,l02 на машинке,ребенок L03 L и L0101,L0102,L0103 ребенка от l01 и L010101,L010102,L010103 ребенка L0101--

Р01,Р02,версии p03 дитя P и P0101,P0102,P0103 ребенка от p01 и P010101,P010102,P010103 ребенка P0101

до 10-го уровня

Richard Deeming

Всегда ли дочерние идентификаторы ровно на два символа длиннее родительских идентификаторов?

Member 14633609

Да...Например, у A01 есть ребенок A0101,A0102,A0103.

Member 14633609

Пожалуйста, предоставьте мне полный код C#