C# For-Each 控件

C# For-Each Controls

我的 Public Form1():

中有这段代码
foreach (Control c in Controls)
            {
                if (c is CheckBox)
                {

                }
            }

我想要做的是在单击任何一个复选框时触发一个事件,这与单击哪个复选框无关。所以,例如:

if(CheckBox.Checked == True) {
 //do something to the checked checkbox 
}

当然,这会引发错误,因为我没有指定哪个复选框:

An object reference is required for the non-static field, method, or property 'CheckBox.Checked'

有办法解决这个问题吗?因为我对每个复选框都应用了相同的事件,如下所示:

 if (TestBox.Checked == true)
 {//Do Something}
 else {//Do Something}

 if (TestBox2.Checked == true)
 {//Do Something}
 else {//Do Something}

这让我的代码效率极低。

编辑:此迭代仅循环遍历 cb.Checked == false,并忽略其他....

foreach (var cb in Controls.OfType<CheckBox>())
        {
            if (cb.Checked == false)
            {
                cb.BackgroundImage = Image.FromFile("M:\Phase IX (Jeremy, Sandima)\Icons\ CheckboxUncheck_18x.png");
                cb.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
                cb.FlatAppearance.BorderSize = 0;
                // make all four (!) BackColors transparent!
                cb.BackColor = System.Drawing.Color.Transparent;
                cb.FlatAppearance.CheckedBackColor = Color.Transparent;
                cb.FlatAppearance.MouseDownBackColor = Color.Transparent;
            }
            else
            {
                cb.BackgroundImage = Image.FromFile("M:\Phase IX (Jeremy, Sandima)\Icons\CheckBox_18x.png");
                cb.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
                cb.FlatAppearance.BorderSize = 0;
                // make all four (!) BackColors transparent!
                cb.BackColor = System.Drawing.Color.Transparent;
                cb.FlatAppearance.CheckedBackColor = Color.Transparent;
                cb.FlatAppearance.MouseDownBackColor = Color.Transparent;
            }
        }

查看下面的代码:

List<CheckBox> cboxes = new List<CheckBox>();
cboxes.Add(cb1);
cboxes.Add(cb2);
...
cboxes.Add(cbN);
...
if(cboxes.Any(b => b.Checked))
{
   ...
}

或者,您可以挂钩所有复选框的 onchange 事件。

@rbaghbanli 的回答很好,这是完成任务的正确方法。我只是想指出您收到错误的原因:

你不应该使用

if(CheckBox.Checked == True) {

你应该使用

if(((CheckBox)c).Checked == True) {

您可以使用 LINQ 迭代特定类型的控件 - 例如,所有复选框:

foreach (var cb in Controls.OfType<CheckBox>()) {
    if (cb.Checked) {
        // Do something
    }
}

如果您要向表单动态添加复选框或手动添加,只需向所有复选框添加一个事件

Protected void check_checkchanged(object sender, changedeventargs e)
{
var checkedbox  = sender as CheckBox;
//do something 
}

因此,对于未来阅读本文的人来说, 应用来自该线程和其他线程的概念。我将我的外观属性留在了它们自己的 checkchanged 事件中,而是将此过程用于我的禁用按钮,我将它们放入列表中并按以下步骤进行:

foreach(Control t in Ratingfields)
        {
            if (t.Enabled == false)
            {
                t.BackgroundImage = Image.FromFile("M:\DisableBox_18x.png");
                t.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;

                if (((CheckBox)t).Checked == true)
                {
                        t.BackgroundImage = Image.FromFile("M:\RadioGreen_Disabled18x.png");
                        t.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Center;
                    }
            }

        }