Laden...

TreeView zusammenbauen

Erstellt von tom-cat vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.041 Views
T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren
TreeView zusammenbauen

Hallo Forum,

ich habe eine Frage zum TreeView.

Meine Datenbank schaut wie folgt aus:


UID	CodeName	CodeDesc	Level	MKSub
1	14000000	Produktgruppe	1	1	
2	14010000	Prod.Untergru	2	1
3	14010100	Prod.Unt.Gr.10	3	1
4	14010200	Prod.Unt.Gr.20	4	0
5	14010210	Prod.Unt.Gr.21	4	0
6	14010220	Prod.Unt.Gr.22	4	0
7	15010000	Produktgruppe	1	0
8	16010000	Produktgruppe	1	0
	

Daraus muss ich einen TreeView zusammenbauen anhand der Daten.
Zur Erklärung des Schemas:

UID => Identifier
CodeName => Produktklasse (immer 6 stellen)
CodeDesc => Beschreibung der Gruppe
Level => In welcher Tiefe von CodeName
MKSub => Beschreibt ob es eine Untergruppe gibt.

Habt Ihr ne Idee oder einen Vorschlag wie ich das zusammenbauen kann ?

Gruß
Tom

K
55 Beiträge seit 2007
vor 13 Jahren

Hallo tom-cat,

du solltest nach Level sortieren und dann mittels Rekursion den Baum aufbauen. Da gibt es keine Probleme. Rekursionsansätze findest du bei Bedarf zur Genüge im Web.

5.658 Beiträge seit 2006
vor 13 Jahren

Wo genau gibt es denn Probleme? Ich kann aus den Daten erstmal nicht erkennen, wo für einen Eintrag steht, welchem Eintrag er untergeordnet sein soll. Es sei denn, die Reihenfolge der Daten spielt dabei eine Rolle...?

Weeks of programming can save you hours of planning

1.378 Beiträge seit 2006
vor 13 Jahren

Die Beispieldaten sind mMn. nicht richtig:

Wenn ich aus den ersten 6 Zeilen weiter folge, müsste der CodeName für Zeile sieben nicht 15010000 sonder 15000000 sein und für Zeile 8 nicht 16010000 sondern 16000000.

Wobei ich nicht verstehe was die erste Ziffer bedeutet aber soweit ich das verstehe ist der CodeName der Baum wobei erste und zweite Ebene 0-99 Elemente beinhalten können und die dritte Ebene 0-999.

Ich war so frei dein Beispiel mal in einer kleinen Consolenapp nachzubauen:


        static void Main()
        {
            var strings = new[]
            {
                new[] {"1", "14000000", "Produktgruppe", "1", "1"},
                new[] {"2", "14010000", "Prod.Untergru", "2", "1"},
                new[] {"3", "14010100", "Prod.Unt.Gr.10", "3", "1"},
                new[] {"4", "14010200", "Prod.Unt.Gr.20", "4", "0"},
                new[] {"5", "14010210", "Prod.Unt.Gr.21", "4", "0"},
                new[] {"6", "14010220", "Prod.Unt.Gr.22", "4", "0"},
                new[] {"2", "14020000", "Prod.Untergru", "2", "1"},
                new[] {"3", "14020300", "Prod.Unt.Gr.30", "3", "1"},
                new[] {"4", "14020400", "Prod.Unt.Gr.30", "3", "0"},
                new[] {"7", "15000000", "Produktgruppe", "1", "0"},
                new[] {"8", "16000000", "Produktgruppe", "1", "0"}
            };

            var x = from firstLevel in GroupLines(strings, 1, 2)
                    select new
                    {
                        Item = firstLevel.First(),
                        Children = from seconLevel in GroupLines(firstLevel, 3, 2)
                                   select new
                                   {
                                       Item = seconLevel.First(),
                                       Children = from thirdLevel in GroupLines(seconLevel, 5, 3)
                                                  select new
                                                  {
                                                      Item = thirdLevel.First()
                                                  }
                                   }
                    };

            foreach (var level1Item in x)
            {
                Console.WriteLine(level1Item.Item[1]);
                foreach (var level2Item in level1Item.Children)
                {
                    Console.WriteLine("\t" + level2Item.Item[1]);
                    foreach (var level3Item in level2Item.Children)
                    {
                        Console.WriteLine("\t\t" + level3Item.Item[1]);
                    }
                }
            }
        }

        private static IEnumerable<IGrouping<int, string[]>> GroupLines(IEnumerable<string[]> strings, int startIndex, int length)
        {
            return from line in strings
                   let level = Convert.ToInt32(line[1].Substring(startIndex, length))
                   where level != 0
                   group line by level;
        }

Lg XXX