2012-04-01 3 views
0

bevöl Ich habe diese Struktur der Klassen:C WinForms # TreeView von 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>(); 
    } 
} 

So, als Rückgabetyp von einem meiner Methoden I List von L3Messages (List<L3Message>) haben, und ich brauche, dass zur Karte zu TreeView in WinForms (bevölkern TreeView von diesem List).

EDIT: Bitte beachten Sie, dass Baum meiner Objekte können tiefer als eine Ebene sein (becouse Klasse Parameter haben prop Liste < Parmaeter> (Liste der Parameter-Objekt, gleiche Struktur wie root-Parameter-Objekt)), so dass Mittel Rekursion oder so ähnlich.

EDIT2:

Hier pic des Baumes, aber dieser Baum aus Textdatei Basis auf Whitespaces erstellt wird, so dass hier alle Parameter ist, in meinem Baum Ich brauche nur eine von Liste der L3Message Objekte.

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

EDIT3:

Ich bin sicher, dass mein TreeView, so etwas zu sein braucht:

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 

So etwas

Wenn möglich, würde ich gerne dazu in separaten Thread.

Wie kann ich das erreichen?

+0

Zunächst einmal denke ich, sollten Sie 'L3Message' von' Parameter' ableiten, da es einfacher wäre, zu verwalten. Tatsächlich scheint es, dass 'L3Message' ein Spezialfall von' Parameter' ist. – Tudor

+0

Ich habe versucht, es zu googeln, weil ich meine Logik mit C# -Code nicht abbilden kann, weil ich ziemlich neu in .NET und C# bin. :-) – JohnDoeKazama

+0

@JohnDoeKazama: Kannst du die Klassenstruktur ändern, um 'L3Message' von' Parameter' abzuleiten?Wenn Sie darüber nachdenken, würde es die Verwaltung viel einfacher machen. – Tudor

Antwort

0

Ich habe es geschafft, dies zu lösen, aber ich denke, das ist nicht zu optimieren und es gibt keinen separaten Thread. Wenn jemand meinen Code ändern kann, um bessere Ergebnisse zu erzielen und einen separaten Thread hinzuzufügen?

LÖSUNG:

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); 
      } 
     } 
    } 
1

Natürlich ist es möglich. Nun hängt es davon ab, wie Sie Ihre TreeView strukturieren möchten. Dann müssen Sie nur TreeNode Objekte erstellen und sie zu TreeView hinzufügen. Sehen Sie dieses kleine Tutorial: http://www.dotnetperls.com/treeview

Wenn Sie dies tun werden, in einem anderen Thread, müssen Sie die GUI aktualisieren, indem Sie die Updates zu den GUI-Thread Spedition mit BeginInvoke:

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

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

Beachten Sie, dass die TreeNode muss mit einem string erstellt werden, der den Namen darstellt, und Sie können das Objekt, auf das es verweist, mit der Tag-Eigenschaft hinzufügen.

+0

Ja, aber das Problem liegt in der Rekursion. Sie können in Parameter-Klasse sehen, dass es prop Liste < Parameter > (Liste von sich selbst) enthalten kann, so dass mein Baum kann nicht nur eine Ebene sehr tief sein. EDIT: Ich bin wirklich neu in C#, können Sie mir etwas Code zur Verfügung stellen? bitte? – JohnDoeKazama

+0

@ user743354: Ahh. Aha. Bitte fügen Sie diese Anforderung der ursprünglichen Frage hinzu, um sie klarer zu machen. – Tudor

+0

Ich habe meine Aufgabe geändert. – JohnDoeKazama