例如,我有5个复选框,分别名为checkbox1,checkbox2等。
它们都在其他功能中分配了参数(checkbox1的字符串为text1 =“ t1”,checkbox2的字符串为text2 =“ t2”等)。这些字符串可以是随机的,但只有在如上所述的情况下才可以提供真值。
让用户选择3个复选框,单击一些按钮,然后....
如何使功能/循环仅检查那些选定的复选框,并查看checkbox1是否具有text1 = t1等? 像这样:
string text1, text2, text3, text4, text5 = null;
int a = 0;
while (a != 347)
{
text1 = SomeOperation1();
text2 = SomeOperation2();
text3 = SomeOperation3();
text4 = SomeOperation4();
text5 = SomeOperation5();
if ((checkbox1.Checked && text1 == "t1") &&
(checkbox3.Checked && text3 == "t3") &&
(checkbox5.Checked && text5 == "t5"))
{
SomeOperation6();
a = 347;
}
}
此if
是错误的,因为它必须选中复选框(用户可以选择多于或少于3个),但现在也许您明白我想要的内容了:)
答案 0 :(得分:1)
可以在表单的Controls
集合中找到表单上的所有控件(请注意,作为容器控件一部分的控件将在该容器控件的Controls
集合中找到)。
您可以使用System.Linq
扩展方法OfType
通过执行以下操作来仅获取特定类型的控件:
var allCheckboxControls = Controls.OfType<CheckBox>();
如果只想获取选中的控件,则可以在其中添加一个Where
子句:
var allCheckedCheckBoxes = Controls.OfType<CheckBox>().Where(c => c.Checked);
最后,如果您想将Name
属性与Text
属性进行比较(我不确定这一部分,您的问题尚不清楚),那么您可以执行以下操作这个:
private void button1_Click(object sender, EventArgs e)
{
// Display a message box showing the Name and Text for each Checked CheckBox
foreach (var checkbox in Controls.OfType<CheckBox>().Where(c => c.Checked))
{
MessageBox.Show($"Checkbox named {checkbox.Name}, " +
$"with Text {checkbox.Text}, is checked");
}
}
我更新了示例代码,以便对其进行编译,从而更好地表达我的想法,即您的意图基于您的评论。如果我弄错了,请更正它。
似乎您在三件事之间建立了映射-Checkbox
,方法调用的string
和比较前一个字符串的string
。 似乎您只想评估已选中复选框的字符串比较。
如果是这种情况,那么考虑到您现有的代码,最简单的操作可能是简单地向每个现有条件添加另一个条件,以便在以下情况下返回true :(未选中 复选框)或(条件为真)。请注意,如果未选中相应的复选框,则条件不会被评估,这是您当前代码隐式执行的操作。
例如:
while (a != 347)
{
text1 = SomeOperation1();
text2 = SomeOperation2();
text3 = SomeOperation3();
text4 = SomeOperation4();
text5 = SomeOperation5();
// This will only evaluate the text comparison for checkboxes that are checked
if ((!checkBox1.Checked || text1 == "t1") &&
(!checkBox2.Checked || text2 == "t2") &&
(!checkBox3.Checked || text3 == "t3") &&
(!checkBox4.Checked || text4 == "t4") &&
(!checkBox5.Checked || text5 == "t5"))
{
SomeOperation6();
a = 347;
}
}