【问题标题】:Function or loop for checkboxes复选框的功能或循环
【发布时间】:2019-02-08 01:44:39
【问题描述】:

所以我有例如 5 个复选框,分别命名为 checkbox1、checkbox2 等。

他们都在其他函数中分配了参数(复选框1有字符串text1 =“t1”,复选框2字符串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 个),但现在也许你明白我想要什么了 :)

【问题讨论】:

  • “checkbox1 有字符串 text1 = t1”是什么意思?那没有意义。你的意思是checkbox1.Text = "t1";?如果您展示一些代码,或者更具体地描述您想要做什么(即使用真实世界的示例),这可能会有所帮助。
  • 不要手写代码。复制和粘贴。您发布的代码将无法编译。并且不要让它比它需要的更冗长。不要写if (checkBox1.Checked == true),它应该只是if (checkBox1.Checked) 重复问题的邮政编码。 “一些操作”留下了很多漏洞。
  • 好吧,关键是我没有“复制和粘贴”代码。写它是为了让你知道我想要得到什么。不要编译它。 IF 是我想要得到的,但如何使它正确?

标签: c# checkbox


【解决方案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");
    }
}

我更新了您的示例代码,使其能够编译,因此它更好地表达了我认为您的意图是基于您的 cmets 的。如有错误请指正。

您似乎在三件事之间有一个映射 - 一个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;
    }
}

【讨论】:

  • 添加了一些可能有助于您理解的代码;)
  • 您添加的代码无法编译,也没有真正的帮助(至少对我来说,这让这变得更加混乱)。如果some operation 是一个字符串,为什么some operationif 内单独一行?为什么将所有 5 个textN 变量分配给相同的值?那你为什么要将它们的值与不同的变量(t1t2 等)进行比较? t1t2 等在哪里定义?您能否发布一个描述您想要的实际示例(可编译)?
  • 对不起,我的错,忘记了“”。 “某些操作”是检查文件中文本的某些部分,没什么重要的。 T1、t2 等是文本,忘记了“”,但我已经写过了,谢谢!
  • 您能否更新您的代码以便编译?因为您没有将“某些操作”定义为方法。应该是SomeOperation()?您的意思是要将相同SomeOperation() 方法的结果分配给每个字符串,还是它们是不同的操作(如SomeOperation1()SomeOperation2() 等)。
  • @user3057699 我修改了您的示例代码,以便它可以编译。如果我没有正确表达您的意图,请更新它。
猜你喜欢
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-03-03
  • 1970-01-01
相关资源
最近更新 更多