【问题标题】:How to access a dynamically created checkbox in Windows Form如何在 Windows 窗体中访问动态创建的复选框
【发布时间】:2013-09-15 10:52:03
【问题描述】:

form_load 事件中,我创建了三个复选框。然后通过button_click 事件,我想检查复选框的状态,但它们在我的if 语句中不可用。我找到了这段代码作为例子:

CheckBox chk = new CheckBox();
chk.Top = 50;
chk.Left = 50;
chk.Text = "Check Box Test";
chk.Name = "chkTest";
this.Controls.Add(chk);
CheckBox chkTest = (CheckBox)Controls["chkTest"];

仅当我检查form_load 中的状态时才有效。如何使用 button_click 访问复选框?

【问题讨论】:

  • 显示您的实际代码,而不是您尝试调整的示例
  • 试试CheckBox chkTest =this.Controls.OfType<CheckBox>().FirstOrDefault(c=>c.Name =="chkTest");

标签: c# winforms checkbox


【解决方案1】:

一个选项是在类级别创建一个List<CheckBox> 来保存您创建的复选框的集合。

例子:

List<CheckBox> CheckBoxes = new List<CheckBox>();
public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    CreateCheckBoxes();
}

private void CreateCheckBoxes()
{
    //Create 3 checkboxes
    int intialTop = 50;
    for (int i = 0; i < 3; i++)
    {
        CheckBox chk = new CheckBox();
        chk.Top = intialTop;
        chk.Left = 50;
        chk.Text = "Check Box Test";
        chk.Name = "chkTest";
        this.Controls.Add(chk);
        CheckBoxes.Add(chk);

        intialTop += 20;
    }

    //You can access your checkboxes anywhere in Form1 now.
    var first = CheckBoxes.First();
    first.Text = "First Checkbox";
}

其他示例:

这个例子展示了向表单添加两个复选框以及为它们提供自己的点击事件处理程序。

CheckBox checkBoxA;
CheckBox checkBoxB;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    //Add checkbox A
    checkBoxA = new CheckBox();
    checkBoxA.Top = 10;
    checkBoxA.Left = 50;
    checkBoxA.Text = "CheckBoxA";
    //Register the event handler for this checkbox
    checkBoxA.Click += new EventHandler(checkBoxA_Click);
    this.Controls.Add(checkBoxA);

    //Add checkbox B
    checkBoxB = new CheckBox();
    checkBoxB.Top = 30;
    checkBoxB.Left = 50;
    checkBoxB.Text = "checkBoxB";
    //Register the event handler for this checkbox
    checkBoxB.Click += new EventHandler(checkBoxB_Click);
    this.Controls.Add(checkBoxB);        
}

void checkBoxA_Click(object sender, EventArgs e)
{
    MessageBox.Show("CheckBoxA has been clicked!!!");
}

void checkBoxB_Click(object sender, EventArgs e)
{
    MessageBox.Show("CheckBoxB has been clicked!!!");
}

【讨论】:

  • 我退出我的应用程序直接检查这个。我将如何重命名其他复选框?继续 button_click 事件,我将如何检查复选框的状态?如果我将 CheckBoxes 与设计器一起放在表单上,​​我会使用一个简单的 'if (Checkbox.Name [where this is the name of the Checkbox]) do something'
  • 如果您有固定数量的复选框。声明这些复选框来代替 List&lt;Checkbox&gt;。如果没有,您可以通过 List 中的索引指定复选框。
  • ` private void Form1_Load(object sender, EventArgs e) { CreateCheckBoxes(); } private void CreateCheckBoxes() { CheckBox A = new CheckBox(); A.Location = new Point(20, 20); A.Text = "Chk1"; A.Name = "Chk1"; this.Controls.Add(A);}`
  • 查看 awudoin 的答案。它非常清楚地说明了我所说的作为您的另一种选择。
  • [上面的评论没有竞争,希望这更容易理解]我没有关注如何在 button_click 事件中使用它。我使用CheckBox A = new Checkbox(); 创建其中之一。调用其他 B 和 C。将 .Name 和 .Text 属性也更改为“A”、“B”、“C”。那么在方法内我应该做var one = A;,var two = B;,var three = C;吗?完成此操作后,如何检查 button_click 事件中的状态?
【解决方案2】:

如前所述,您可以创建一个类级别的 CheckBox,然后在代码中您需要的任何地方进行检查:

CheckBox checkBox1 = new CheckBox();
private void Form1_Load()
{
   checkBox1.Name = "CheckBox1";
   checkBox1.Text = "Click Me!";
   checkBox1.Click += new EventHandler(checkBox1_Click);   // Only need this if you want a click handler
   this.Controls.Add(checkBox1);
}

private void checkBox1_Click(object sender, EventArgs e)
{
   MessageBox.Show("You click the check box");
}

private void submitButton_Click(object sender, EventArgs e)
{
   if (checkBox1.Checked)
   {
      MessageBox.Show("Check box is checked!");
   }
}

或者,您可以遍历表单的控件并搜索那里的复选框:

private void CheckCheckBoxes(string checkBoxName)
{
   // this.Controls is a collection of all controls on the form (assuming this is run on the Form class)
   foreach(Control control in this.Controls)
   {
      if (control.Name == checkBoxName && control is CheckBox)
      {
         CheckBox checkBox = control as CheckBox;
         if (checkBox.Checked)
         {
            MessageBox.Show("Check box is checked");
         }
      }
   }
}

【讨论】:

  • 您可能需要考虑将复选框添加到示例中的表单中。
  • 谢谢...不敢相信我忘记了。
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多