2015-05-04 7 views
7

Ich habe einige Artikel gelesen und nicht verwaltet mein Problem gelöst, Mein Problem ist in dem Moment, wenn ich versuche, den Wert der Steuerelemente (CheckBox und ComboBox) dynamisch in Windows Form hinzugefügt, muss ich wissen, wenn das Kontrollkästchen aktiviert ist (oder nicht markiert), und wenn die Kombinationsfeld leer ist (oder nicht) ist, wenn I eine Taste drücken, diese Taste eine Methode aufrufen, in dem ich zu validieren, wenn alle Komponenten leer sind, fügen I die Bedienelemente die folgende Weise:Wie erhält man den Wert eines Controls dynamisch in Windows Form C# hinzugefügt?

CheckBox box; 
ComboBox cmBox; 
for (int i = 1; i <= sumOfRegisters; i++) 
{ 
    box = new CheckBox(); 
    box.Name = "CheckBox" + i; 
    box.Text = "Some text"; 
    box.AutoSize = true; 
    box.Location = new Point(10, i * 25); //vertical 

    cmBox = new ComboBox(); 
    cmBox.Name = "ComboBox" + i; 
    cmBox.Size = new System.Drawing.Size(302, 21); 
    cmBox.TabIndex = i; 
    cmBox.Text = "Some Text"; 
    cmBox.Location = new Point(270, i * 25); 

    this.groupBox.Controls.Add(cmBox); 
    this.groupBox.Controls.Add(box); 
} 

"Ich füge die Werte aus der Datenbank im Falle der ComboBox, ich habe diesen Teil weggelassen."

Ich versuche, den Wert mit einem foreach erhalten:

foreach (Control ctrl in groupBox.Controls) 

Das Problem ist, ich habe keine Ahnung, wie zu wissen, ob die Control (CheckBox und ComboBox) aktiviert ist oder leer ist (wie der Fall) .

Wirklich danke für jede Hilfe, ich schätze Ihre Zeit.

+0

ich empfehlen, der in die [ 'DataRepeater'] (https: //msdn.microsoft.com/en-us/library/cc488280.aspx) Kontrolle. –

+0

Ist das Problem, Sie sind nicht sicher, welche Kontrolle über welchen Typ, wenn Sie durch 'groupBox.Controls' durchlaufen? – JNYRanger

+0

Es könnte sich lohnen, die beiden Steuerelemente in separaten 'foreach'-Anweisungen zu trennen: 'var CheckBox chk; foreach (chk in groupbox.Controls) 'und' var ComboBox cmb; foreach (cmb in groupbox.Controls) ' – Ben

Antwort

2

Sie könnten den as Operator verwenden, etwa so:

foreach (Control ctrl in groupBox.Controls) 
{ 
    CheckBox checkBox = ctrl as CheckBox; 
    ComboBox comboBox = ctrl as ComboBox; 

    if (checkBox != null) // Control is a CheckBox 
    { 
     if (checkBox.Checked) 
     { 
      // CheckBox is checked 
     } 
     else 
     { 
      // CheckBox is not checked 
     } 
    } 
    else if (comboBox != null) // Control is a ComboBox 
    { 
     if (comboBox.Items.Count == 0) 
     { 
      // ComboBox is empty 
     } 
     else 
     { 
      // ComboBox isn't empty 
     } 
    } 
} 
+0

Danke für Ihre Antwort und Ihre Zeit, löste ich mein Problem mit Ihrer Antwort. –

3

Sie werfen Ihren Verweis auf jedes dynamisch zugewiesene Steuerelement weg, nachdem Sie es zu grbMateias hinzugefügt haben.

Eine Option ist sicherlich, diese Referenzen zu speichern, zum Beispiel in einem List<Control>.

List<ComboBox> comboBoxes = new List<ComboBox>(); 

for (int i = 1; i <= sumOfRegisters; i++) 
{ 
    box = new CheckBox(); 
    comboBoxes.Add(box); 
    // etc. 
} 

Sie können jedoch iterieren nur die Kontrollen in grbMateias

foreach(Control ctl in grbMateias.Controls) 
{ 
    if (ctl is CheckBox) 
    { 
     // Use the checkbox 
    }  
    else if (ctl is ComboBox) 
    { 
     // Use the ComboBox 
    }  
} 

oder mit Linq

var comboBoxes = grbMateias.Controls.OfType<ComboBox>(); 
var checkBoxes = grbMateias.Controls.OfType<CheckBox>(); 
1

Da Sie geben jeweils einen Namen innerhalb der Schleife zu steuern, es ist einfach zu bedienen Es erkennt jedes einzelne Steuerelement, solange Namen eindeutig sind. Um zum Beispiel die dritte Option erhalten Sie so etwas wie diese verwenden:

Control control = groupBox.Controls.Single(x => x.Name == "CheckBox3"); 
Checkbox thirdCheckBox = (CheckBox)control; 
bool checkBoxCheched = thirdCheckBox.Checked; 
1

Zuerst müssen Sie wissen, was Sie steuern sind momentan Wenn Sie mit Iterieren arbeiten, können Sie sie anschließend umwandeln und die Methoden dieses spezifischen Steuerelements verwenden.

foreach(Control c in groupBox.Controls) 
{ 
    if(c is ComboBox) 
    { 
     if((ComboBox) c).SelectedItem == null) 
      //handle nothing entered 
    } 
    else if(c is CheckBox) 
    { 
     if((CheckBox) c).Checked) 
      //handle checked 
    } 
} 

In der obigen snippit überprüfen wir die Verwendung des is Schlüsselwort, welche Art von Kontrolle ist. Wenn wir also wissen, wie wir damit umgehen sollen, werfen wir es aus und prüfen, ob es leer ist oder überprüft wird.

1

Ich brauche wissen, wenn das Kontrollkästchen aktiviert ist (oder deaktiviert) und wenn die ComboBox leer ist (oder nicht).

Um die Zustände Ihrer Checkboxen und Comboboxen zu erhalten, einschließlich des Index Sie sie erstellt haben, können Sie Folgendes tun:

var checkBoxStates = groupBox.Controls 
    .OfType<CheckBox> 
    .Where(x => x.Name.StartsWith("CheckBox")) 
    .Select(x => new { 
     Index = Int.Parse(x.Name.Substring("CheckBox".Length)), 
     IsChecked = x.Checked 
    }) 
    .ToList(); 

var comboBoxStates = groupBox.Controls 
    .OfType<ComboBox> 
    .Where(x => x.Name.StartsWith("ComboBox")) 
    .Select(x => new { 
     Index = Int.Parse(x.Name.Substring("ComboBox".Length)), 
     IsEmpty = x.Items.Count == 0 
    }) 
    .ToList(); 
Verwandte Themen