Autor Beitrag
WSS-130
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Di 30.10.12 17:54 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Mo 05.11.12 11:03 
Kann mir denn niemand helfen? Habe das Problem bisher noch nicht in Griff bekommen :-/

Viele Grüße
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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 user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: 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:
ausblenden volle Höhe 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;                                                     // Anzahl der "Architekturen"
      ListViewGroup[] groups = new ListViewGroup[size];                                                               // Gruppen in Listview weren instanziert

      for (int i = 0; i < size; i++)                  
      {
        groups[i] = new ListViewGroup();                                                                            // Elemente der Gruppe werden instanziert
        groups[i].Header = new DirectoryInfo(path).GetDirectories()[i].Name;                                        // Gruppenüberschriften bekommen Namen
      }

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

      //Hier beginnt der Teil bei dem ich nicht weiterkomme
      
      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:
ausblenden 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();                                                                            // Elemente der Gruppe werden instanziert
                    groups[i].Header = new DirectoryInfo(path).GetDirectories()[i].Name;                                        // Gruppenüberschriften bekommen Namen
                }
                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