Entwickler-Ecke

WinForms - Treeview mehrere selectedImageIndex als Liste


Chiyoko - Do 30.06.11 12:52
Titel: Treeview mehrere selectedImageIndex als Liste
Huhu,

Ich habe ungefähr 150 Treeview selectedImageIndexer und bei bestimmten Gruppen,
z.b. 1-10 soll ein Panel ein bzw ausgeblendet werden.

Ich möchte natuerlich redundanten Code vermeiden und hab es zuerst so versucht:
(aus dem Kopf ausgeschrieben, bin gerade nicht zu Hause)


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
List<int> liste1 = new List<int>();
List<int> liste2 = new List<int>();
liste1.AddRange(new List[] { 1,2,3,4,5,6,7,8 });
liste2.AddRange(new List[] { 9,10,11,12,13 });

foreach(int list1 in liste1)
//...?


Nun funktioniert das zwar untereinander geschrieben, aber nicht geschachtelt.
Die Frage ist, wo ich das hinschreiben soll, ohne tausend mal Panel.Show(); Panel.Hide(); aufzurufen?

Ich hoffe , das ist verständlich.Danke


Th69 - Do 30.06.11 13:05

Hallo Chiyoko,

nein, leider ist das (mir zumindestens) nicht verständlich genug.
Was hat die SelectedImageIndex-Eigenschaft mit dem Ein- und Ausblenden von Panels zu tun? Du meinst sicherlich das AfterSelect-Ereignis.


Chiyoko - Do 30.06.11 13:24

Ja richtig, das Ereignis ist die AfterSelect Methode.

In dieser definiere ich 2 Arrays(odr mehr) die dann eine Liste der vorhandenen Indexer beinhaltet.

Da das nun 2 Arrays sind, brauche ich 2 foreach schleifen in der selben Methode.

Nun, nehmen wir an, ich habe 2 Panel.Array 1 braucht Panel 1 und Array 2 braucht Panel 2.


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:
List<int> liste1 = new List<int>();
List<int> liste2 = new List<int>();
liste1.AddRange(new List[] { 1,2,3,4,5,6,7,8 });
liste2.AddRange(new List[] { 9,10,11,12,13 });

foreach(int list1 in liste1)
{
    switch(e.Node.SelectedImageIndex)
    {
        case 1:
           // lade i-was
           Panel1.Show();
           Panel2.Hide(); //????
           break;
        case 2:
           // lade i-was
           Panel1.Show();

    }
}
foreach(int list2 in liste2)
{
   // das selbe wie oben, nur mit dem anderen Array

}


Veranschaulichst das etwas besser, was ich meine?
Ich möchte nicht jedes mal SHOW aufrufen.
Kann ich das nicht irgendwie global setzen?

Pseudocode:

WENN liste2
DANN Panel1.Show();Panel2.Hide();

WENN liste1
DANN Panel2.Show();Panel2.Hide();

Meine Versuche schlugen immer fehl und debuggen brachte nicht viel, weil er das selektieren überspringt.
(wird ja auch nichts angewaehlt in dem Moment)


Th69 - Do 30.06.11 14:56

Hallo Chiyoko,

ok, jetzt ist mir das etwas klarer ;-)

Du weißt aber schon, was Methoden sind, oder?
Packe die switch-Anweisung in eine eigene Methode und übergib die Liste sowie den Index als Parameter.

Und dann noch ein Tipp:
wenn du immer nur genau 1 Panel anzeigen willst, dann kannst du dir dieses in einer Membervariablen merken und einmalig Hide() dafür aufrufen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private Panel currentPanel;

// in der Methode
if (currentPanel != null)
{
   currentPanel.Hide();
   currentPanel = null;
}

// switch-case: nur noch das neu anzuzeigende Panel zuweisen
   case 1:
      currentPanel = Panel1;
      break;

// unterhalb der switch-Anweisung
if (currentPanel != null)
   currentPanel.Show();


P.S: Trotzdem verstehe ich immer noch nicht, in wieweit SelectedImageIndex und die Listen im Verhältnis zueinander stehen (in deinem Code-Beispiel benutzt du ja gar nicht den Listen-Index 'list1')...


Chiyoko - Do 30.06.11 15:16

Ups, unglücklich formuliert:D
Aber du weist,was ich meine.In dem Fall war die Funktion gemeint mit dem Event.

Also....ich hasse Parameter...nagut, ich versuchs.

Danke fuer die Hinweise, mal schauen, wie weit ich komme.


Chiyoko - Do 30.06.11 15:26

Eine Frage ueberlesen, naja ich wollte damit den Index abfragen, etwa so:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
                List<int> test = new List<int>();
                List<int> test2 = new List<int>();
                foreach (int t in test)
                {
                    if (treeView1.SelectedImageIndex == t)
                    {
                        pan_m.Show();
                        pan_s.Hide();

                    }
                    
                }