是否可以在同一个 'if' 语句中有多个复选框?
Is it possible to have multiple checkboxes in the same 'if' statement?
我对编码还很陌生,目前正在学习 C#。更具体地说,我目前正在努力在组框中使用复选框。我想知道是否可以在同一个 'if' 语句中有多个复选框?
我的意思是,不仅仅是(例如):
private void button1_Click(object sender, Eventargs e)
{
float optionACheckBox = 149.00f;
if (checkBox1.Checkstate == CheckState.Checked)
{
finalPrice = (optionACheckBox + 60)
}
MessageBox.Show(finalPrice);
}
我该怎么做才能变成这样:
if (checkBox1 & checkBox2 = CheckState.Checked)
{
((Value of checkBox1) + (Value of checkBox2) + 60)
}
如果用户选中 checkBox1 和 checkBox2,那么这两个值都可以用在等式中?
关于这个,是否也可以编写代码来检查是否检查了 GroupBox 中 CheckBoxes 的 any/what 组合?而不是我为不同 CheckBox 的每个组合编写一个 'if' 语句?
感谢所有花时间阅读本文并提供任何提示的人
更多上下文(抱歉,这是我第二次使用 Whosebug post,所以我不太擅长正确的格式设置):
使用 Visual Studio 2019
一共有三个CheckBox,三个都在一个GroupBox里
已使用工具箱功能将 CheckBoxes 和 GroupBox 添加到表单中
您可以使用 switch case
判断来为这些不同的选择分配不同的结果。
但是因为每一个组合都是一种判断情况,所以不管你用什么判断方法,都需要分别判断。
判断两者都选中的判断应该是这样的:
if (checkBox1.Checked && checkBox2.Checked)
{
//To do something
}
首先,您不能将 checkbox
本身与 CheckState
进行比较,因此您必须使用 checkBox1.CheckState == CheckState.Checked
或更好地使用布尔“已检查” 属性 : if(checkBox1.Checked)
将检查复选框是否被选中。
关于如何检测是否选中任何复选框的最后一个问题,您可以使用 ||
逻辑“或”运算符:
if(checkBox1.Checked || checkBox2.Checked || checkBox3.Checked)
更新
逻辑运算符与条件短路运算符
- 逻辑运算符:
&
用于确保评估和检查所有操作数。
- 条件短路运算符:
&&
用于跳过右侧操作数。
如评论中所述,在绝大多数情况下两者都适用,但我会尽可能使用“条件短路运算符”,以跳过不必要的右侧操作数检查。
你并没有真正告诉我们你的逻辑,但你似乎想要一个假设的场景,比如:
- 披萨的一些固定底价
- 每种浇头的价格
- 应用任意数量浇头的固定价格
因此我会看积累:
float price = 100;
if(anchoviesCheckbox.Checked)
basePrice += 20;
if(olivesCheckbox.Checked)
basePrice += 30;
if(chilliesCheckbox.Checked)
basePrice += 40;
//if anchovies AND chillies are chosen there is a surcharge because the most of the chefs are allergic to this combination and we have to get the manager to do it
if(anchoviesCheckbox.Checked && chilliesCheckBox.Checked)
basePrice += 50;
//if any one OR more topping has been applied, there is a surcharge
if(anchoviesCheckbox.Checked || olivesCheckbox.Checked || chilliesCheckbox.Checked)
basePrice += 60;
这些累积是因为没有 else
- 如果选中该复选框,成本将添加到最终价格中。每个复选框都是单独查看的。后来有的还联合行动
请注意,您当然也可以检查基本价格是否大于 100 以了解是否要收取附加费..
一旦您清楚了它的工作原理,您可以通过将组框中的复选框视为一个集合来为自己节省一些 if
s
您可以在表单构造函数中执行此操作:
//put the prices in the checkbox Tag:
anchoviesCheckbox.Tag = 20;
olivesCheckbox.Tag = 30;
chilliesCheckbox.Tag = 20;
然后在您的价格计算方法中,您可以执行如下操作:
float basePrice = 100:
foreach(var cb in toppingsGroupBox.Controls.OfType<CheckBox>().Where(cb => cb.Checked))
basePrice += (int)cb.Tag;
这使用 LINQ 仅提取选中的复选框,然后从其标签中提取价格并将其添加。你甚至可以这样做:
float basePrice = 100 +
toppingsGroupBox.Controls
.OfType<CheckBox>()
.Where(cb => cb.Checked)
.Sum(cb => (int)cb.Tag);
如果您选择任何浇头,请添加附加费:
if(toppingsGroupBox.Controls
.OfType<CheckBox>()
.Any(cb => cb.Checked)))
basePrice += 60;
您现在可以在表单中添加 100 个不同的配料复选框,只要您将价格放入标签中,就无需在计算价格的方法中添加更多代码
“经理必须添加凤尾鱼和辣椒”附加费也可以使用 LINQ 完成。为此,您必须定义一组自定义复选框,如果它们都被选中,则应用附加费:
class PizzaForm:Form{
CheckBox[] managerSurcharge;
PizzaForm() { // constructor
...
managerSurcharge = new[]{ anchoviesCheckBox, chilliesCheckBox };
}
然后在价格中:
if(managerSurcharge.All(cb => cb.Checked))
basePrice += 50;
看不到 if
! (是的,真的很难消除每一个 if..)
但是要好好命名你的控件和变量;由于名称的缘故,这里的代码易于阅读并且很明显它的作用。如果您这样写:
,经理附加费的情况会更加混乱
CheckBox array1 = new[]{ checkbox12, checkbox7 }
我对编码还很陌生,目前正在学习 C#。更具体地说,我目前正在努力在组框中使用复选框。我想知道是否可以在同一个 'if' 语句中有多个复选框?
我的意思是,不仅仅是(例如):
private void button1_Click(object sender, Eventargs e)
{
float optionACheckBox = 149.00f;
if (checkBox1.Checkstate == CheckState.Checked)
{
finalPrice = (optionACheckBox + 60)
}
MessageBox.Show(finalPrice);
}
我该怎么做才能变成这样:
if (checkBox1 & checkBox2 = CheckState.Checked)
{
((Value of checkBox1) + (Value of checkBox2) + 60)
}
如果用户选中 checkBox1 和 checkBox2,那么这两个值都可以用在等式中?
关于这个,是否也可以编写代码来检查是否检查了 GroupBox 中 CheckBoxes 的 any/what 组合?而不是我为不同 CheckBox 的每个组合编写一个 'if' 语句?
感谢所有花时间阅读本文并提供任何提示的人
更多上下文(抱歉,这是我第二次使用 Whosebug post,所以我不太擅长正确的格式设置):
使用 Visual Studio 2019
一共有三个CheckBox,三个都在一个GroupBox里
已使用工具箱功能将 CheckBoxes 和 GroupBox 添加到表单中
您可以使用 switch case
判断来为这些不同的选择分配不同的结果。
但是因为每一个组合都是一种判断情况,所以不管你用什么判断方法,都需要分别判断。
判断两者都选中的判断应该是这样的:
if (checkBox1.Checked && checkBox2.Checked)
{
//To do something
}
首先,您不能将 checkbox
本身与 CheckState
进行比较,因此您必须使用 checkBox1.CheckState == CheckState.Checked
或更好地使用布尔“已检查” 属性 : if(checkBox1.Checked)
将检查复选框是否被选中。
关于如何检测是否选中任何复选框的最后一个问题,您可以使用 ||
逻辑“或”运算符:
if(checkBox1.Checked || checkBox2.Checked || checkBox3.Checked)
更新
逻辑运算符与条件短路运算符
- 逻辑运算符:
&
用于确保评估和检查所有操作数。 - 条件短路运算符:
&&
用于跳过右侧操作数。
如评论中所述,在绝大多数情况下两者都适用,但我会尽可能使用“条件短路运算符”,以跳过不必要的右侧操作数检查。
你并没有真正告诉我们你的逻辑,但你似乎想要一个假设的场景,比如:
- 披萨的一些固定底价
- 每种浇头的价格
- 应用任意数量浇头的固定价格
因此我会看积累:
float price = 100;
if(anchoviesCheckbox.Checked)
basePrice += 20;
if(olivesCheckbox.Checked)
basePrice += 30;
if(chilliesCheckbox.Checked)
basePrice += 40;
//if anchovies AND chillies are chosen there is a surcharge because the most of the chefs are allergic to this combination and we have to get the manager to do it
if(anchoviesCheckbox.Checked && chilliesCheckBox.Checked)
basePrice += 50;
//if any one OR more topping has been applied, there is a surcharge
if(anchoviesCheckbox.Checked || olivesCheckbox.Checked || chilliesCheckbox.Checked)
basePrice += 60;
这些累积是因为没有 else
- 如果选中该复选框,成本将添加到最终价格中。每个复选框都是单独查看的。后来有的还联合行动
请注意,您当然也可以检查基本价格是否大于 100 以了解是否要收取附加费..
一旦您清楚了它的工作原理,您可以通过将组框中的复选框视为一个集合来为自己节省一些 if
s
您可以在表单构造函数中执行此操作:
//put the prices in the checkbox Tag:
anchoviesCheckbox.Tag = 20;
olivesCheckbox.Tag = 30;
chilliesCheckbox.Tag = 20;
然后在您的价格计算方法中,您可以执行如下操作:
float basePrice = 100:
foreach(var cb in toppingsGroupBox.Controls.OfType<CheckBox>().Where(cb => cb.Checked))
basePrice += (int)cb.Tag;
这使用 LINQ 仅提取选中的复选框,然后从其标签中提取价格并将其添加。你甚至可以这样做:
float basePrice = 100 +
toppingsGroupBox.Controls
.OfType<CheckBox>()
.Where(cb => cb.Checked)
.Sum(cb => (int)cb.Tag);
如果您选择任何浇头,请添加附加费:
if(toppingsGroupBox.Controls
.OfType<CheckBox>()
.Any(cb => cb.Checked)))
basePrice += 60;
您现在可以在表单中添加 100 个不同的配料复选框,只要您将价格放入标签中,就无需在计算价格的方法中添加更多代码
“经理必须添加凤尾鱼和辣椒”附加费也可以使用 LINQ 完成。为此,您必须定义一组自定义复选框,如果它们都被选中,则应用附加费:
class PizzaForm:Form{
CheckBox[] managerSurcharge;
PizzaForm() { // constructor
...
managerSurcharge = new[]{ anchoviesCheckBox, chilliesCheckBox };
}
然后在价格中:
if(managerSurcharge.All(cb => cb.Checked))
basePrice += 50;
看不到 if
! (是的,真的很难消除每一个 if..)
但是要好好命名你的控件和变量;由于名称的缘故,这里的代码易于阅读并且很明显它的作用。如果您这样写:
,经理附加费的情况会更加混乱CheckBox array1 = new[]{ checkbox12, checkbox7 }