2016-03-31 12 views
1

ich diesen Code habe in meinem öffentlichen Form1():C# foreach-Kontrollen

foreach (Control c in Controls) 
      { 
       if (c is CheckBox) 
       { 

       } 
      } 

, was ich bin auf der Suche zu tun, ein Ereignis wird ausgelöst, wenn eine der Checkbox angeklickt wird, spielt es keine Rolle, welcher. so zum Beispiel:

if(CheckBox.Checked == True) { 
//do something to the checked checkbox 
} 

aber natürlich, das den Fehler auslöst, weil ich angegeben haben, die Checkbox:

An object reference is required for the non-static field, method, or property 'CheckBox.Checked'

ist es eine Möglichkeit, um dies? Weil ich das gleiche Ereignis auf jedes einzelne Kontrollkästchen wie folgt angewendet habe:

if (TestBox.Checked == true) 
{//Do Something} 
else {//Do Something} 

if (TestBox2.Checked == true) 
{//Do Something} 
else {//Do Something} 

was macht meinen Code schrecklich ineffizient.

EDIT: nur dieser Iterationsschleifen throug der cb.Checked == falsch und ignoriert die sonst ....

foreach (var cb in Controls.OfType<CheckBox>()) 
     { 
      if (cb.Checked == false) 
      { 
       cb.BackgroundImage = Image.FromFile("M:\\Phase IX (Jeremy, Sandima)\\Icons\\ CheckboxUncheck_18x.png"); 
       cb.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; 
       cb.FlatAppearance.BorderSize = 0; 
       // make all four (!) BackColors transparent! 
       cb.BackColor = System.Drawing.Color.Transparent; 
       cb.FlatAppearance.CheckedBackColor = Color.Transparent; 
       cb.FlatAppearance.MouseDownBackColor = Color.Transparent; 
      } 
      else 
      { 
       cb.BackgroundImage = Image.FromFile("M:\\Phase IX (Jeremy, Sandima)\\Icons\\CheckBox_18x.png"); 
       cb.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; 
       cb.FlatAppearance.BorderSize = 0; 
       // make all four (!) BackColors transparent! 
       cb.BackColor = System.Drawing.Color.Transparent; 
       cb.FlatAppearance.CheckedBackColor = Color.Transparent; 
       cb.FlatAppearance.MouseDownBackColor = Color.Transparent; 
      } 
     } 

Antwort

0

Also, für zukünftige Menschen lesen, Anwendung Konzepte aus diesem Thread und andere. Ich verließ mein Aussehen Eigenschaften in ihren eigenen checkchanged Events und verwendet stattdessen diesen Vorgang für meine deaktivierte Schaltflächen, ich sie in eine Liste gemacht und ging wie folgt:

foreach(Control t in Ratingfields) 
     { 
      if (t.Enabled == false) 
      { 
       t.BackgroundImage = Image.FromFile("M:\\DisableBox_18x.png"); 
       t.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; 

       if (((CheckBox)t).Checked == true) 
       { 
         t.BackgroundImage = Image.FromFile("M:\\RadioGreen_Disabled18x.png"); 
         t.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center; 
        } 
      } 

     } 
0

Siehe Code unten:

List<CheckBox> cboxes = new List<CheckBox>(); 
cboxes.Add(cb1); 
cboxes.Add(cb2); 
... 
cboxes.Add(cbN); 
... 
if(cboxes.Any(b => b.Checked)) 
{ 
    ... 
} 

Alternativ können Sie einhaken Onchange-Ereignis für alle Ihre Kontrollkästchen.

+0

meine Kontrollkästchen sind nicht als in einer Liste @rbaghbanli gemeint – Krono

0

@ rbaghbanli Antwort ist gut, es ist der richtige Weg, um Ihre Aufgabe zu erfüllen. Ich möchte nur darauf hinweisen, warum Sie die Fehlermeldung anzeigt:

Sie nicht

if(CheckBox.Checked == True) { 

Sie verwenden soll

if(((CheckBox)c).Checked == True) { 
+0

if (((CheckBox) Form1) .Checked == True) gibt mir den Fehler 'True existiert nicht im aktuellen Kontext' – Krono

+0

1. Warum hast du c in form1 geändert? 2. True -> true – Zee

+0

Tippfehler - versuchte etwas. – Krono

1

Sie können LINQ verwenden, um iterieren Kontrollen eines bestimmten Typs verwendet werden soll - zum Beispiel alle Kontrollkästchen:

foreach (var cb in Controls.OfType<CheckBox>()) { 
    if (cb.Checked) { 
     // Do something 
    } 
} 
+0

mit diesem, es durchläuft nur meine erste Bedingung - Antwort bearbeitet oben – Krono

+0

@Krono Das ist sehr seltsam - die andere Seite der bedingten sollte für markierte Kontrollkästchen getroffen werden. Haben Sie das Problem gelöst? – dasblinkenlight

+0

leider nicht, stattdessen habe ich den Code als das große Chaos es ist für jetzt, aber ive das gleiche Konzept auf meine Tasten deaktiviert, so wie folgt: foreach (var cb in Controls.OfType ()) {if (cb.Enabled == false) {// stuff}} getestet in einem neuen sauberen Testprojekt funktioniert es, aber es scheint nicht in meinem regulären Projekt zu arbeiten, obwohl es keine Fehler wirft – Krono

0

Wenn Sie Kontrollkästchen zum Formular dynamisch hinzufügen oder Hinzufügen manuell, fügen Sie einfach ein einzelnes Ereignis für alle von ihnen

Protected void check_checkchanged(object sender, changedeventargs e) 
{ 
var checkedbox = sender as CheckBox; 
//do something 
}