Entwickler-Ecke
WinForms - Abfrage von Gruppenüberschriften im ListView Element
WSS-130 - Di 30.10.12 17:54
Titel: Abfrage von Gruppenüberschriften im ListView Element
Hi Forum,
bin ganz neu hier und habe gleich ein Problem (wie wahrscheinlich die meisten die sich neu anmelden :-D)
Und zwar hab ich ein ListView in WinForms erstellt und möchte die Daten die ich einlese in Gruppen sortieren... Das funktioniert auch soweit.
Allerdings legt mein Code bisher immer eine neue Gruppe an.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| if (file.Directory.Parent.Name == listviewgroup1.Header) { ListViewItem item1 = list_select.Items.Add(item); listviewgroup1.Items.Add(item1); } else { listviewgroup1.Header = file.Directory.Parent.Name; list_select.Groups.Add(listviewgroup1); ListViewItem item1 = list_select.Items.Add(item); listviewgroup1.Items.Add(item1);
MessageBox.Show("neue Gruppe angelegt!"); } |
Das Problem ist offensichtlich das "if" kann ich denn mit listviewgroup1.Header nicht die Überschriften der Gruppen auslesen?
Ich bedanke mich schonmal für die Hilfe, die ich hoffentlich bekomme :-) Und freue mich dann auch mal helfen zu können ;-)
Viele Grüße
Markus
Th69 - Di 30.10.12 20:20
Hallo Markus :welcome:
mit immer "eine neue Gruppe anlegen" meinst du also, daß der Code immer den else-Zweig durchläuft?
Hast du deinen Code schon mal mit dem Debugger überprüft, d.h. welche Werte die beiden Variablen file.Directory.Parent.Name und listviewgroup1.Header haben?
Was mir noch auffällt, ist, daß du in deinem Code keine neue ListViewGroup mittels new anlegst, sondern immer auf "listviewgroup1" verweist - dadurch hast du dann natürlich immer nur eine Gruppe.
WSS-130 - Mi 31.10.12 09:58
Hi Th69,
erstmal danke für deine Antwort.
Ja genau, es wird immer der else-Zweig durchlaufen.
Gedebuggt habe ich meinen Code bereits, wirklich schlau daraus geworden bin ich allerdings nicht geworden.
file.Directory.Parent.Name ist ein String und dieser soll dann auch die Überschrift der Gruppe werden:
C#-Quelltext
1:
| listviewgroup1.Header = file.Directory.Parent.Name; |
Das funktioniert auch in der else, wenn ich dann allerdings ein neues Element hinzufüge ist
listviewgroup1.Header ein string: "ListViewGroup"
Meine
ListViewGroup listviewgroup1 = new ListViewGroup(); habe ich am Anfang meiner Methode angelegt. Du hast aber natürlich recht, ich muss immer wenn eine unbekannter Header festgestellt wird, eine neue Gruppe erzeugen.
Noch ein bisschen mehr Background zum Programm:
Ich habe eine TreeView der mir die Ordner und Dateistruktur eines gewählten Ordners anzeigt, nun möchte ich verschiedene Dateien miteinander vergleichen. Dazu wähle ich die Dateien aus meinem TreeView aus und zeige Sie im ListView an. Da die Dateien teils ähnlich heißen, allerdings andere Strukturen haben sollen die Dateien nach den Strukturen gruppiert werden.
TreeView:
Strukt2011
|-Adressen
|-Signale
|-Referenzen
Strukt2012
|-Adressen
|-Signale
|-Referenzen
ListView:
----Name-------Dateiendung-------Bearbeiter--------zuletzt verwendet
-Strukt1
----Adressen---txt---------------ich---------------datum
-Strukt2
----Adressen---txt---------------ich---------------datum
Ich hoffe ihr versteht was ich realisieren möchte :-)
Viele Grüße
WSS-130 - Mo 05.11.12 11:03
Kann mir denn niemand helfen? Habe das Problem bisher noch nicht in Griff bekommen :-/
Viele Grüße
Th69 - Mo 05.11.12 11:59
Hallo,
erstellst du denn jetzt in deinem else-Zweig jedesmal eine neue ListViewGroup?
Und welches Problem hast du denn jetzt genau?
WSS-130 - Di 06.11.12 00:08
Hi Th69,
ja ich erstelle jetzt jedesmal ne neue Listgroup, wenn die Gruppe noch nicht existiert.
Allerdings funktioniert das nur rein theoretisch weil ich nach wie vor die Gruppenüberschriften nicht auslesen kann.
Es hängt an dem Vergleich:
file.Directory.Parent.Name == listviewgroup1.Header
Dabei ist der string "file.Directory.Parent.Name" laut Debugger wie erwartet. Nur der listgroup.header string bleibt immer auf seinem default "Wert", bei mir: listviewgroup1
Ich kann gerne mal den Teil meiner GUI separieren und in hochladen... allerdings sind wenn ich es richtig gelesen habe keine lauffähigen Programme erlaubt.
Gruß
Markus
Moderiert von
Th69: C#-Tags hinzugefügt
Th69 - Di 06.11.12 11:04
Hallo,
du mußt dir in der Schleife dann natürlich immer eine Referenz auf die letzte ListViewGroup (bzw. Header) merken und diese dann zum Vergleich heranziehen.
Nur wenn du wirklich nach eigenem Überlegen (und Debuggen) nicht weiterkommst, kannst du ja deinen aktuellen Stand der Schleife hier posten.
WSS-130 - Mi 07.11.12 11:25
Ich bin weitergekommen. Das waren die richtigen Denkanstöße, danke Th69. Allerdings bin ich jetzt wieder hängen geblieben...
Das hier ist die Methode die Elemente des Treeviews nach drücken eines Buttons dem ListView hinzufügt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| private void button_add_Click(object sender, EventArgs e) { ListViewItem.ListViewSubItem[] subItems; ListViewGroup listviewgroup1 = new ListViewGroup(); ListViewItem item = null; int index = 0;
if (tree_struct.SelectedNode.Tag != null) { FileInfo file = new FileInfo(tree_struct.SelectedNode.Tag.ToString() + tree_struct.SelectedNode.Text);
string path = "C:\\Eigene Dateien\\Test"; int size = new DirectoryInfo(path).GetDirectories().Length; ListViewGroup[] groups = new ListViewGroup[size]; for (int i = 0; i < size; i++) { groups[i] = new ListViewGroup(); groups[i].Header = new DirectoryInfo(path).GetDirectories()[i].Name; }
item = new ListViewItem(file.Name, 1); subItems = new ListViewItem.ListViewSubItem[] { new ListViewItem.ListViewSubItem(item, file.Directory.Parent.Name), new ListViewItem.ListViewSubItem(item, file.Directory.Name), new ListViewItem.ListViewSubItem(item, file.LastAccessTime.ToShortDateString()), new ListViewItem.ListViewSubItem(item, file.DirectoryName)}; item.SubItems.AddRange(subItems);
while (index < size) { if (file.Directory.Parent.Name == groups[index].Header) { list_select.Groups.Add(groups[index]); ListViewItem item1 = list_select.Items.Add(item); groups[index].Items.Add(item1);
break; } else index++; } } else MessageBox.Show("Selektierter Node ist keine Datei\n--> kann also nicht ausgewählt werden"); } |
Und zwar instanziere ich So viele Gruppen wie Unterornder in meinem Pfad sind und benenne die Gruppen wie die Unterordner (for-Schleife Zeile 16-20=. Habe ich einfach ein "harten" Pfad eingegeben. In meinem Programm kommt der aus einer anderen Methode.
Die entsprechenden Dateien sind im TreeView enthalten in dem der gleiche "harte" Pfad das Root Verzeichnis darstellt.
Wenn ich nun einzelne Dateien dem ListView hinzufüge, werden diese zwar in ihre jeweilige Gruppe hinzugefügt. (So ist es ja auch programmiert)
Aber falls ich eine Datei aus einem unterordner hinzufüge der bereits eine Gruppe hat, wird die Datei nicht in dieser Gruppe angezeigt. (was auch klar ist, weil nicht programmiert :-))
Kann mir jemand den Denkanstoß geben, wie ich es hinbekomme, das ich ie Gruppen erstelle und dann die Dateien der Unterordner in de jeweiligen Gruppen "sortiere"?
Die LisView soll also dynamisch mit Gruppen aufgebaut werden.... :-)
Edit sagt: Okay, es gibt kleine Fortschritte... Hatte nochmal ne Idee mit meiner ListView, leider funktioniert auch diese nicht wie gewünscht. Es werden auch immer neue Gruppen für jedes einzelne Element erzeugt. Woran das liegt kanni ch mir auch vorstellen. Ich überschreibewohl jedes mal mein Item.
Die Gruppen füge ich nun direkt nach dem erzeugen per AddRange hinzzu, also nochmal der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| for (int i = 0; i < size; i++) { groups[i] = new ListViewGroup(); groups[i].Header = new DirectoryInfo(path).GetDirectories()[i].Name; } list_select.Groups.AddRange(groups);
...
while (index < size) { if ((list_select.Groups.Contains(groups[index])) && (file.Directory.Parent.Name == groups[index].Header)) { ListViewItem item1 = new ListViewItem(); item1 = list_select.Items.Add(item); groups[index].Items.Add(item1); break; } else index++; } |
ist schon besser aber nciht wie gewollt.... :-/
Gruß
Markus
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!