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;
}
}
}
我的 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;
}
}
}