C # WinForms заполняет TreeView из списка <myObj> - PullRequest
0 голосов
/ 01 апреля 2012

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

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).

РЕДАКТИРОВАТЬ: Обратите внимание, что дерево моих объектов может быть глубже, чем один уровень (потому что классПараметр имеет реквизит List (список объекта 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

Что-то вроде этого

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

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

Ответы [ 2 ]

1 голос
/ 01 апреля 2012

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

Если вы собираетесь сделать это в другом потоке, вам нужно будет обновить GUI, перенаправив обновления в поток GUI, используя BeginInvoke:

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

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

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

0 голосов
/ 03 апреля 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);
            }  
        }
    }
...