【问题标题】:Export checked Form1.checkBoxes to Form2.listBox将选中的 Form1.checkBoxes 导出到 Form2.listBox
【发布时间】:2016-04-25 15:43:13
【问题描述】:

我有一个包含 5 个复选框的表单设计。我称它们为 Bus1、Bus2...Bus5。

我有一个“编辑”按钮,它会调出具有列表框的 Form2。

当我按下“编辑”按钮时,我只想选中复选框并将它们放入 listBox。

我正在考虑检查单个复选框,如果为真,请将它们添加到列表中。

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

这是正确的方法还是有更好的方法?

谢谢

编辑---------------------------------------

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);
   }
}

【问题讨论】:

    标签: c#


    【解决方案1】:

    您需要在Form2 中公开一个填充列表框的公共方法

    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);
            }
        }
    }
    

    然后您从Form1 调用此方法,并使用您想要的复选框作为参数

    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);
        }
    
    }
    

    通过这种方式,您可以选择要在检查中包含哪些框。如果都需要,那么上面的代码类似:

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

    和

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

    感谢@Andrey Tretyak

    【讨论】:

    • 考虑到我们需要表单中的所有复选框,您可以像这样调用函数PopulateListBox:form2.PopulateListBox(this.Controls.OfType&lt;CheckBox&gt;())。并且替换IEnumerable&lt;CheckBox&gt; 上的输入参数将防止创建将为param 参数创建的冗余数组。
    • 我寻求用户选择哪些复选框的灵活性,以防 all 不应该包括在内。
    【解决方案2】:

    如果您需要表单上的所有复选框,这应该可以工作:

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

    如果您还需要有关复选框变量名称的信息,例如字符串 "checkBox1.Text",您可以考虑创建 Tuple&lt;string,CheckBox&gt;[] 或 Dictionary&lt;string,CheckBox&gt; 并使用 nameof 填充它。

    编辑:还有一个没有foreach循环的版本,但会导致创建冗余数组:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多