2016-04-25 5 views
1

Ich habe ein Formularentwurf, der 5 Kontrolle-Kästchen hat. Ich werde sie Bus1, Bus2 ... Bus5 nennen.Exportieren Sie überprüfte Form1.checkBoxes zu Form2.listBox

Ich habe "Bearbeiten" -Taste, die Form2, die ListBox hat.

Wenn ich "Edit" -Button drücke, möchte ich nur markierte Kästchen nehmen und sie in listBox setzen.

Ich dachte über das Überprüfen einzelner Kontrollkästchen nach, und wenn es zutrifft, fügen Sie sie der Liste hinzu.

private void button1_Click(object sender, EventArgs e) 
{ 
    if(checkBox1.Checked==true) 
    { 
     form2.listBox1.Items.Add("checkBox1.Text"); 
    } 
    if(checkBox2.Checked==true) 
    { 
     ... 
    } 
    ... 
} 

Ist dies ein richtiger Weg oder gibt es einen besseren?

Dank

bearbeiten --------------------------------------

private void button1_click(object sender, EventArgs e) 
{ 
    Form2 form2 = new Form2(); 
    form2.Show(); 
    foreach(var checkBox in this.Controls.OfType<CheckBox>().Where(c=>c.Checked)) 
    { 
     form2.listBox1.Items.Add(checkBox.Text); 
    } 
} 

Antwort

2

Sie benötigen eine öffentliche Methode in Form2 zu machen, die das Listenfeld

auffüllt
public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public void PopulateListBox(params CheckBox[] checkboxes) 
    { 
     foreach(var item in checkboxes.Where((cb) => cb.Checked)) 
     { 
      listBox1.Items.Add(item.Text); 
     } 
    } 
} 

Dann rufen Sie diese Methode aus Form1 mit dem Kontrollkästchen Sie als

Parameter wollen
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 form2=new Form2(); 
     form2.Show(); 

     form2.PopulateListBox(
      checkBox1, 
      checkBox2, 
      checkBox3, 
      checkBox4, 
      checkBox5); 
    } 

} 

Auf diese Weise wählen Sie, welche Boxen in die Prüfung einbezogen werden sollen. Wenn alle nötig sind, um dann die oben in ähnlicher Weise codiert wie:

public void PopulateListBox(IEnumerable<CheckBox> checkboxes) 
    { 
     foreach(var item in checkboxes.Where((cb) => cb.Checked)) 
     { 
      listBox1.Items.Add(item.Text); 
     } 
    } 

und

 form2.PopulateListBox(Controls.OfType<CheckBox>()); 

Dank @Andrey Tretyak

+0

in Anbetracht, dass wir alle Kontrollkästchen in Form benötigen, können Sie anrufen Funktion 'PopulateListBox' so: 'form2.PopulateListBox (this.Controls.OfType ())'. Und durch das Ersetzen des Eingabearguments auf IEnumerable wird verhindert, dass ein redundantes Array erstellt wird, das für das Argument "param" erstellt wird. –

+0

Ich ging für die Flexibilität des Benutzers, die Auswahl der Kontrollkästchen, falls nicht _all_ sollte enthalten sein. – ja72

2

Dies sollte funktionieren, wenn Sie alle Kontrollkästchen auf dem Formular müssen:

foreach (var checkBox in this.Controls.OfType<CheckBox>().Where(c => c.Checked)) 
{ 
    form2.listBox1.Items.Add(checkBox.Text); 
} 

, wenn Sie auch über Kontrollkästchen Variablenname wie Zeichenfolge "checkBox1.Text" Info benötigen, können Sie betrachten Tuple<string,CheckBox>[] oder Dictionary<string,CheckBox> und fo verwenden Erstellen nameof r es füllen.

Edit: es auch eine Version ohne foreach Schleife, aber es wird bei der Erstellung von redundanten Arrays zur Folge haben:

form.listBox1.Items.AddRange(this.Controls.OfType<CheckBox>() 
            .Where(c => c.Checked) 
            .Select(c => c.Text) 
            .ToArray<object>()); 
Verwandte Themen