C# WinForms, заполняющий TreeView из List‹myObj›

У меня есть такая структура классов:

public class L3Message
{
    public int Number { get; set; }
    public string MessageName { get; set; }
    public string Device { get; set; }
    public string Time { get; set; }
    public string ScramblingCode { get; set; }

    public List<Parameter> Parameters { get; set; }

    public L3Message()
    {
        Parameters = new List<Parameter>();
    }
}

public class Parameter
{
    public int numOfWhitespaces { get; set; }

    public string ParameterName { get; set; }
    public string ParameterValue { get; set; }

    public Parameter Parent { get; set; }
    public List<Parameter> SubParameters { get; set; }

    public Parameter()
    {
        SubParameters = new List<Parameter>();
    }
}

Итак, в качестве возвращаемого типа одного из моих методов у меня есть List из L3Messages (List<L3Message>), и мне нужно сопоставить это с TreeView в WinForms (заполнить TreeView из этого List).

EDIT: Обратите внимание, что дерево моих объектов может быть глубже одного уровня (поскольку класс Parameter имеет свойство List ‹ Parmaeter > (Список объектов Parameter, та же структура, что и объект корневого параметра)), так что это означает рекурсия или что-то в этом роде.

EDIT2:

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

http://imageshack.us/photo/my-images/803/treeviewmessage.png/

EDIT3:

Я уверен, что мой TreeView должен быть примерно таким:

L3Message.Number: L3Message.MessageName
+L3Message.Time
+L3Message.Device
+L3Message.ScramblingCode
+L3Message.Parameters[0]
++Parameter.ParamaeterName: Parameter.ParameterValue
++ (same as above)
L3Message.Number: L3Message.MessageName
+L3Message.Time
+L3Message.Device
+L3Message.ScramblingCode
+L3Message.Parameters[0]
++Parameter.ParamaeterName: Parameter.ParameterValue (in this occasion Value is null )
+++SubParameter.ParameterName: SubParameter.ParameterValue

Что-то подобное

Если возможно, я хотел бы это в отдельной теме.

Как я могу этого добиться?


person JohnDoeKazama    schedule 01.04.2012    source источник
comment
Во-первых, я думаю, вы должны получить L3Message из Parameter, так как им будет легче управлять. На самом деле кажется, что L3Message является частным случаем Parameter   -  person Tudor    schedule 01.04.2012
comment
Я попытался погуглить, потому что не могу сопоставить свою логику с кодом С# из-за того, что я новичок в .NET и С#. :-)   -  person JohnDoeKazama    schedule 01.04.2012
comment
@JohnDoeKazama: Итак, вы можете изменить структуру класса, чтобы получить L3Message из Parameter? Если подумать, управлять вещами стало бы намного проще.   -  person Tudor    schedule 01.04.2012
comment
Да, но только в том случае, если мне удастся сохранить предыдущую функциональность. Вся моя логика лежит в этой структуре классов.   -  person JohnDoeKazama    schedule 02.04.2012
comment
@JohnDoeKazama: Ну, поскольку у обоих классов были List<Parameter> и имя, я думаю, это можно сделать.   -  person Tudor    schedule 02.04.2012


Ответы (2)


Конечно, это возможно. Теперь это зависит от того, как вы хотите, чтобы ваш TreeView был структурирован. Затем вам просто нужно создать TreeNode объектов и добавить их в TreeView. Посмотрите это небольшое руководство: http://www.dotnetperls.com/treeview.

Если вы собираетесь сделать это в другом потоке, вам нужно будет обновить графический интерфейс, перенаправив обновления в поток графического интерфейса с помощью BeginInvoke:

TreeNode node = new TreeNode("node");
L3Message msg = new L3Message();
node.Tag = msg;

treeView.BeginInvoke(
    (Action)(() =>
    {
        treeView.Nodes.Add(node);
    }));

Обратите внимание, что TreeNode необходимо создать с string, представляющим имя, а затем вы можете добавить объект, на который он указывает, используя свойство Tag.

person Tudor    schedule 01.04.2012
comment
Да, но проблема с рекурсией, я действительно запутался в этом. Вы можете видеть в классе Parameter, что он может содержать prop List ‹ Parameter › (список самого себя), так что это означает, что мое дерево может быть очень глубоким, а не только одним уровнем. РЕДАКТИРОВАТЬ: я действительно новичок в С#, можете ли вы предоставить мне код? Пожалуйста? - person JohnDoeKazama; 01.04.2012
comment
@user743354: Ааа. Я понимаю. Пожалуйста, добавьте это требование к исходному вопросу, чтобы сделать его более понятным. - person Tudor; 01.04.2012
comment
@user743354: Итак, у вас есть L3Message объектов на верхнем уровне, а затем Parameter объектов на следующих уровнях? - person Tudor; 01.04.2012
comment
Да, именно, в дереве я корневой узел, скажем, числовая опора L3Message или опора MessageName, следующий уровень - это другие реквизиты объекта L3Message с ParameterName ... что-то в этом роде. Могу ли я предоставить где-нибудь на скриншоте stackoverflow? - person JohnDoeKazama; 01.04.2012

Мне удалось это решить, но я думаю, что это не оптимизация и нет отдельного потока. Если кто-нибудь может изменить мой код, чтобы он работал лучше, и добавить отдельный поток?

РЕШЕНИЕ:

foreach (L3Message message in por)
            {
                treeViewMessages.Nodes.Add(message.Number + ": " + message.MessageName);
                treeViewMessages.Nodes.Add("Time: " + message.Time);
                treeViewMessages.Nodes.Add("MS: " + message.Device);
                treeViewMessages.Nodes.Add("Scrambling Code: " + message.ScramblingCode);

                foreach (Parameter param in message.Parameters)
                {
                    TreeNode tnRootParam = new TreeNode();

                    //tnRootParam.Nodes.Add(param.ParameterName + ": " + param.ParameterValue);
                    if (param.SubParameters.Count != 0)
                    {
                        CreateTreeNodes(param, tnRootParam);
                        tnRootParam.Text = param.ParameterName;
                        treeViewMessages.Nodes.Add(tnRootParam);
                    }
                    else
                    {
                        tnRootParam.Text = param.ParameterName + ": " + param.ParameterValue;
                        treeViewMessages.Nodes.Add(tnRootParam);
                    }


                }
                treeViewMessages.Nodes.Add("---------------------------------------------------------------------");
            }

private void CreateTreeNodes(Parameter parameter, TreeNode tnRootParam)
    {

        if (parameter.SubParameters.Count == 0)
        {
            tnRootParam.Nodes.Add(parameter.ParameterName + ": " + parameter.ParameterValue);
        }
        else
        {
            foreach (Parameter subparam in parameter.SubParameters)
            {
                CreateTreeNodes(subparam, tnRootParam);
            }  
        }
    }
person JohnDoeKazama    schedule 03.04.2012