Entwickler-Ecke

WinForms - Control.Visible funktioniert nicht


Vitalic - Fr 27.01.12 13:20
Titel: Control.Visible funktioniert nicht
Hallo zusammen,

ich habe folgenden Quellcode und möchte den Status der Controls abrufen.


C#-Quelltext
1:
2:
3:
4:
5:
6:
// Wenn alle Steuerelemente in der GB unsichtbar sind, dann wird die GB gelöscht
foreach (System.Windows.Forms.Control control in gb.Controls)
{
    if (control.Visible == true)
        MessageBox.Show("Hello");
}


Problem:
Der Status ist immer auf false gesetzt, obwohl er in der Form angezeigt wird.
Woran kann das liegen und wie kann man das Problem umgehen?
Liegt das vielleicht daran, dass ich mit mehreren Forms arbeite und eine die andere aufruft?


Danke für die Mühe!

Gruß
Vitalic


Th69 - Fr 27.01.12 13:59

Hallo Vitalic,

in welcher Methode (bzw. Ereignis) rufst du denn die Abfrage auf, d.h. wird die Form dann schon angezeigt?
(beispielsweise wäre Form.Load also zu früh zum abrufen, sondern erst ab Form.Shown)


traceurmicha - Fr 27.01.12 14:01

Hallo Vitalic,

wie user profile iconTh69 müsste man wissen in welcher Methode du das aufrufst. Wenn du es in der Load Methode machst könnte es nämlich Probleme geben weil die Elemente vielleicht noch garnicht existieren.

Gruß
Micha


Vitalic - Fr 27.01.12 14:24

Hallo Th69 und traceurmicha.

Ablauf:
Konstruktor ruft meine CreateTabControl Methode auf.
Dort werden dynamsiche TabPages, GroupBoxen und in den GroupBoxen die Steuerelemente erstellt.
Und nach dem Hinzufügen des letzten Elements in die GroupBox rufe ich die Methode die den Control durchsucht.
Wenn ich im Debug Modus die Schleife durchgehe, dann kann ich diese Elemente aus einzeln sehen.
Das funktioniert z.B. mit control.Enabled aber nicht mit control.Visible.

Danke!

Gruß
Vitalic


Ralf Jansen - Fr 27.01.12 15:10

Die Antwort ist immer noch rätselhaft. Willst du sagen das du denn gezeigten Code im Konstruktor ausführst? Dann ist das natürlich genauso zu früh wie im Load Event. Der Code macht erst Sinn wenn die Form auf der die Controls angezeigt werden auch selbst wirklich angezeigt wird (vorher sind logischerweise alle Controls nicht sichtbar). Und das ist frühestens in dem bereits erwähnten Shown Event.

Wobei sich mir die Frage stellt, wenn du die gerade erstellt hast, wieso du das so gemacht das du die unter bestimmten Bedingungen sofort wieder löschen willst? Klingt überflüssig.


Vitalic - Fr 27.01.12 22:43

Hallo, also ich habe meinen Code mal genau angeguckt und ich mache das vor dem Form.Shown Event.


user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Der Code macht erst Sinn wenn die Form auf der die Controls angezeigt werden auch selbst wirklich angezeigt wird (vorher sind logischerweise alle Controls nicht sichtbar). Und das ist frühestens in dem bereits erwähnten Shown Event.


Warum ist z.B. hier dann die CheckBox sichtbar?


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private void Form1_Load(object sender, EventArgs e)
{
    cb.AutoSize = true;
    cb.Location = new System.Drawing.Point(68103);
    cb.Name = "checkBox1";
    cb.Size = new System.Drawing.Size(8017);
    cb.TabIndex = 0;
    cb.Text = "checkBox1";
    cb.UseVisualStyleBackColor = true;
    this.Controls.Add(cb);

    foreach (System.Windows.Forms.Control control in this.Controls)
    {
        if (control.Visible == true)
            MessageBox.Show("Hello");
    }
}


Gruß
Vitalic


Ralf Jansen - Fr 27.01.12 23:33

Zitat:
Warum ist z.B. hier dann die CheckBox sichtbar?


Du meinst dein "Hallo" wird angezeigt? Dann weiß ich nicht warum. Ich denke in Form_Load sollte Visible der Form auf false sein da die noch nicht angezeigt ist. Und Visible wird an alle ChildControls weitergereicht so das die auch alle auf Visible = false stehen sollten. Wenn dem nicht so ist fände ich das extrem unlogisch und meine auch es anders beobachtet zu haben.

Aber hattest du nicht zum Start dieses Threads noch behauptet das würde nicht gehen? Oder hab ich was verpasst?


Vitalic - Sa 28.01.12 13:47

Hallo Ralf Jansen und danke für die Antwort.

Ich habe das Problem genauer analysiert und gelöst.
Man kann also den Status sowohl in der Form_Load als auch in der Form.Shown Methode abrufen.
Was nicht geht ist den Status in dem Konstruktor abzufragen, was ich aber nicht so genau verstehe.
In beiden Fällen ist die Form noch nicht sichtbar, warum funktioniert das also in der Form_Load und im Konstruktor nicht?

Gruß
Vitalic


Ralf Jansen - Sa 28.01.12 14:12

Zitat:
In beiden Fällen ist die Form noch nicht sichtbar, warum funktioniert das also in der Form_Load und im Konstruktor nicht?


Die Form wir durch Aufruf von Show, ShowModal etc. angezeigt nicht dadurch das du die Form erzeugst. Im Konstruktor ist dir Form also nicht mal potentiell sichtbar.
Load wird wirklich erst beim Vorgang des Anzeigens (aus oben erwähnten Methoden) gefeuert. Eigentlich kurz vor dem eigentlich Anzeigen aber das scheint ja scheinbar zu reichen damit Visible doch schon auf true gesetzt ist. Auch wenn das gefühlt falsch ist.


Vitalic - Mo 30.01.12 08:33

Nun die Hauptsache ist, dass das Problem nicht mehr besteht und dafür ein Danke von mir!

Form.Close(); :)

Gruß
Vitalic