【问题标题】:How to obtain the value of a control added dynamically into Windows Form c#?如何获取动态添加到Windows Form c#中的控件的值?
【发布时间】:2015-05-05 07:59:23
【问题描述】:

我阅读了一些文章并没有解决我的问题,我的问题是在我尝试获取动态添加到 Windows 窗体中的控件(CheckBox 和 ComboBox)的值时,我需要知道 CheckBox 何时被选中(或未选中),如果当我按下按钮时 ComboBox 为空(或不为空),则此按钮调用一个方法,在该方法中我验证所有组件是否为空,我按以下方式添加控件:

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

“我在 ComboBox 的情况下添加了数据库中的值,我省略了这部分。”

我尝试使用 foreach 获取值:

foreach (Control ctrl in groupBox.Controls)

问题是我不知道如何知道控件(CheckBox 和 ComboBox)是否被选中或为空(视情况而定)。

非常感谢您的帮助,感谢您的宝贵时间。

【问题讨论】:

  • 我建议查看DataRepeater 控件。
  • 是您在迭代groupBox.Controls 时不确定什么类型的控件的问题吗?
  • 在单独的foreach 语句中分离两个控件可能是值得的:var CheckBox chk; foreach (chk in groupbox.Controls)var ComboBox cmb; foreach (cmb in groupbox.Controls)

标签: c# winforms checkbox combobox windows-controls


【解决方案1】:

在将每个动态分配的控件添加到 grbMateias 之后,您正在丢弃对每个动态分配控件的引用。

一个选择当然是存储这些引用,例如在List&lt;Control&gt; 中。

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

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

但是,您可以只迭代 grbMateias 中的控件

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

或使用 Linq

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

【讨论】:

    【解决方案2】:

    您可以使用as 运算符,如下所示:

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

    【讨论】:

    • 感谢您的回答和您的时间,您的回答解决了我的问题。
    【解决方案3】:

    由于您在循环中为每个控件指定了一个名称,因此可以很容易地使用它来识别每个单独的控件,只要名称是唯一的。例如,要获得第三个复选框,您可以使用如下内容:

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

    【讨论】:

      【解决方案4】:

      首先,您需要知道迭代时当前正在使用的控件,然后您可以对其进行强制转换并使用该特定控件的方法。

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

      在上面的代码片段中,我们使用is 关键字检查它是什么类型的控件。然后,如果它是一个我们知道如何处理的控件,我们将它转​​换并检查它是空的还是选中的。

      【讨论】:

        【解决方案5】:

        我需要知道 CheckBox 何时被选中(或未选中)以及 ComboBox 是否为空。

        要获取复选框和组合框的状态,包括用于创建它们的索引,您可以执行以下操作:

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

        【讨论】:

          猜你喜欢
          • 2011-03-14
          • 2011-04-13
          • 1970-01-01
          • 2014-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多