Sourabh V Savanur Ответов: 1

Как создать древовидное представление для следующей таблицы с помощью элемента управления treeview в C#


он доносится из-за стола.

l1 l2 l3
б ВВ, ВВН
б ББ Би-би-си
в ВС ШПД

я хочу, чтобы treeview был чем-то вроде этого

б
---ББ
------ВВН
------ВВС
---британская Колумбия
------bba

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

Я новичок в c# любезно помогите и, пожалуйста, дайте мне знать простой способ его реализации.

BillWoodruff

Это WinForm ? Сложность решения будет зависеть от того, в какой степени DataTable имеет регулярную, инвариантную структуру.

Graeme_Grant

Ваша догадка так же хороша, как и моя

BillWoodruff

Мне ясно, что я не буду писать код, если контекст не будет ясен.

-Я не просвещаю тех, кто не горит желанием учиться.,
и не будите тех, кто не тревожится
дать объяснение самим.
Если я представил один угол квадрата
и они не могут вернуться ко мне с остальными тремя,
Я не должен снова возвращаться к этим пунктам."

Из "Аналектов" Конг Фузи (Конфуция), примерно 2500 лет назад

:)

Graeme_Grant

Виды деревьев в значительной степени одинаковы ... так что это не требовало никаких усилий ... но я понимаю, откуда вы пришли.

BillWoodruff

"TreeViews почти все одинаковы ..." я не согласен: WinForm TreeView не имеет эквивалента многим функциям WebUI, таким как "PopulateOnDemand".

Graeme_Grant

В том, как они работают с иерархическими данными, они одинаковы, каждая платформа имеет свои нюансы, как вы указываете.

Вы правы, не все платформы имеют "заполнение по требованию", WPF-это другое. Но с небольшим творческим потенциалом это не так уж трудно подражать. WinForms, например, может быть реализован примерно так:

private void Form1_Load(object sender, EventArgs e)
{
    // initialise the tree here
    var nodeSomething = treeView1.Nodes.Add("Something");
    nodeSomething.Nodes.Add("Something below something");

    treeView1.AfterExpand += AfterExpand;
}

private void AfterExpand(object sender, TreeViewEventArgs e)
{
    foreach (TreeNode node in e.Node.Nodes)
    {
        // skip if we have already loaded data for this node
        if (node.Tag != null) 
            continue;
        node.Tag = new object();
        node.Nodes.AddRange(GetDataForThisNode(node));
    }
}

BillWoodruff

Я восхищаюсь вашим плодовитым кодированием ! То, что вы показали здесь,-это своего рода эскиз/модель для загрузки по требованию, что здорово, но не имеет ничего общего с проблемами ОП ... какими бы они ни были.

У OP есть (мы надеемся) DataTable: мы не знаем, использует ли этот DataTable 'Childrow и т. д.; Мы не знаем, знает ли OP о привязке данных. Мы не знаем, имеет ли ОП хоть какое-то представление о том, что ему действительно нужно знать :)

Моя цель-заставить ОП прояснить, что они делают.

Graeme_Grant

Да, сообщение ОП было немного расплывчатым, поэтому я выбросил немного кода в надежде открыть дальнейший диалог.

Приведенный выше код был адресован только вашему комментарию о "заполнении по требованию". И да, я действительно открылся для этих комментариев. :)

Graeme_Grant

Есть ли шанс, что вы сможете уточнить, что именно вам нужно? Более конкретная информация поможет дать более конкретный ответ.

Пожалуйста, нажмите на ссылку "улучшить вопрос", чтобы обновить более конкретную информацию. Если вы не уверены в том, как это сделать, следующая ссылка объяснит, как это сделать.: Часто задаваемые вопросы - Как улучшить свой вопрос[^]

1 Ответов

Рейтинг:
1

Graeme_Grant

То TreeView контроль-это иерархический контроль данных. Дочерние узлы нуждаются в ссылке на родительский узел. Так что вы должны иметь таблицу, которая имеет поля: id &усилителя; атрибутом parentId. Тогда дочерние< & gt; родительские отношения parentId = Id

Поэтому, как только вы загружаете свои данные в DataTable, вы можете сделать что-то вроде этого:

foreach (DataRow row in data.Rows)
{
    TreeNode node = new TreeNode(dr["field1"], dr["fieldId"])
    node.PopulateOnDemand = true;

     TreeView1.Nodes.Add(node);
 }
 
 protected void PopulateNode(Object sender, TreeNodeEventArgs e)
 {
     string fieldId = e.Node.Value;
     //select from table where parentId = fieldId.
     foreach (DataRow row in topics.Rows)
     {
         TreeNode node = new TreeNode(dr["field1"], dr["fieldId"])
         node.PopulateOnDemand = true;

         e.Node.ChildNodes.Add(node);
     }

 }


BillWoodruff

Видите ли вы какие-либо признаки того, что OP использует System.Web.UI.WebControls здесь для TreeView?.. не WinForms ?