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:
| 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
Th69 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.
Ralf Jansen hat folgendes geschrieben : |
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(68, 103); cb.Name = "checkBox1"; cb.Size = new System.Drawing.Size(80, 17); 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!