c# – 根据选中的复选框,有更有效的方法吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 根据选中的复选框,有更有效的方法吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4240字,纯文字阅读大概需要7分钟。
内容图文
![c# – 根据选中的复选框,有更有效的方法吗?](/upload/InfoBanner/zyjiaocheng/809/8960013ce59a451fa46ef6fdcd20a3be.jpg)
我最近刚刚遇到这个问题,搜索这个问题却没有结果……
所以,假设我有四个复选框,作为一个例子,我想根据哪些东西随时检查来做某些事情……
if (CB1.Checked)
{
//Do things here if only checkbox 1 is checked.
}
else if (CB2.Checked)
{
//Do things here if only checkbox 2 is checked.
}
else if (CB3.Checked)
{
//Do things here if only checkbox 3 is checked.
}
else //if (CB4.Checked)
{
//Do things here if only checkbox 4 is checked.
}
我敢肯定大多数人会倾向于使用类似上面的示例代码段或其变体.看起来很简单吧?但是如果……你不只是单独检查一个复选框呢?
if (CB1.Checked && CB2.Checked)
{
//Do things here if only checkbox 1 & 2 is checked.
}
else if (CB2.Checked && CB3.Checked)
{
//Do things here if only checkbox 2 & 3 is checked.
}
else if (CB3.Checked && CB1.Checked)
{
//Do things here if only checkbox 3 & 1 is checked.
}
else if (CB4.Checked && CB1.Checked)
{
//Do things here if only checkbox 4 & 1 is checked.
}
else if (CB4.Checked && CB2.Checked)
{
//Do things here if only checkbox 4 & 2 is checked.
}
else //if (CB4.Checked && CB3.Checked)
{
//Do things here if only checkbox 4 & 3 is checked.
}
可以看出… if-else语句的数量已经增加……如果你想比较4个或更多的复选框,或者4个中的更多复选框……它会…这会使事情复杂化(可能)大多数程序员都无法避免它.
我还要提一下,我知道在给定时间检查了多少个复选框,这要归功于以下代码:
private int GetNumberOfCheckboxesChecked()
{
int NumberofCheckBoxesChecked = 0;
foreach (Control c in groupBox1.Controls)
{
if ((c is CheckBox) && ((CheckBox)c).Checked)
NumberofCheckBoxesChecked++;
}
return NumberofCheckBoxesChecked;
}
他们还需要随时检查其中一个复选框,因为每个复选框的checkchanged事件都会调用以下代码:
private void OneAtLeast(object originalSender)
{
CheckBox tempCB = (CheckBox)originalSender;
if (!CB1.Checked && !CB2.Checked && !CB3.Checked && !CB4.Checked)
{
tempCB.Checked = true;
MessageBox.Show("You must select at least one option!", "Invalid Operation", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
所以,我的问题是……是否有更好的(或者更有效,或者可以减少代码行)的方式根据哪个复选框/复选框进行检查?或者我们真的坚持这种方法(或这种方法的变化)?
请注意,对于此示例,无论您根据哪个复选框进行检查,都不能简单地“添加”或“附加”.
还应该注意的是,开关盒方法或多或少与这种方法相同……所以它很可能没有区别.它也是concluded elsewhere that if-statements are more efficient that switch-case.
解决方法:
我不确定你能做多少分支机构.如果逻辑允许,您可以通过嵌套if语句来处理其中的一些.但这仅在某些情况下有用,而在其他情况下则更糟糕.
如果您真正拥有16个不同的,不相关的4个复选框选项,那么最好使用开关,或者像@Damien_The_Unbeliever建议的查找词典.切换或查找丢失的一件事是可读性,因为您基本上最终将复选框值转换为位掩码并基于最终的“魔术”整数值执行操作.当然,如果复选框实际上是按照您的方式进行编号,那么跟踪哪一个是哪一位可能很容易.但是,如果名称类似于ApplesCheckBox,SeedsCheckBox,SoilCheckBox,那么您将很难将其与整数位掩码匹配.
你可以用标志枚举来获得一些.例如,捎带@Damien_The_Unbeliever’s answer:
[Flags]
enum CheckboxActions
{
None = 0,
CheckBox1 = 1,
CheckBox2 = 2,
CheckBox3 = 4,
CheckBox4 = 8,
DoJustCB1 = 1,
DoJustCB2 = 2,
DoCB1AndCB2ButNeverCB4 = 3
}
然后,
var option = CheckboxActions.None;
if(CB1.Checked) option = option | CheckboxActions.CheckBox1;
if(CB2.Checked) option = option | CheckboxActions.CheckBox2;
if(CB3.Checked) option = option | CheckboxActions.CheckBox3;
if(CB4.Checked) option = option | CheckboxActions.CheckBox4;
要使用它,例如在交换机中:
switch (option)
{
case CheckboxActions.None:
DoNothingNoOptionsSet();
break;
case CheckBoxActions.DoJustCB1:
DoJustCB1();
break;
case CheckBoxActions.DoJustCB2:
DoJustCB2();
break;
case CheckBoxActions.DoCB1AndCB2ButNeverCB4:
DoCB1AndCB2ButNeverCB4();
break;
}
或者只是设置一个字典< CheckboxActions,Action>并将其用作查找.
您可以为枚举值使用适当的名称,以便准确了解正在发生的事情,并且复选框的顺序由枚举值CheckboxActions.CheckBox1到CheckboxActions.CheckBox4封装.作为奖励,你可以获得更多的类型安全性,将CheckboxActions传递给不同的类和方法,而不是使用普通的旧int.
事实上,在玩这个时,我刚学会了你可以从同一个枚举中引用枚举值.所以你可以完全删除神奇的值,上面就变成了(是的,这个编译):
[Flags]
enum CheckboxActions
{
None = 0,
CheckBox1 = 1,
CheckBox2 = 2,
CheckBox3 = 4,
CheckBox4 = 8,
DoJustCB1 = CheckboxActions.CheckBox1,
DoJustCB2 = CheckboxActions.CheckBox2,
DoCB1AndCB2ButNeverCB4 = CheckboxActions.CheckBox1 | CheckboxActions.CheckBox2
}
内容总结
以上是互联网集市为您收集整理的c# – 根据选中的复选框,有更有效的方法吗?全部内容,希望文章能够帮你解决c# – 根据选中的复选框,有更有效的方法吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。