C# 我需要一种更有效的方法来检查多个复选框中的值以更改 bool
C# I need a more efficient way to check values in multiple checkboxes to change a bool
所以我有这个小任务,如果我的任何复选框被打开,我试图更改一个布尔值。
所以我有一个布尔值
Boolean YourAllowedToWork = false;
还有一组复选框
private void 001_Click(object sender, EventArgs e)
{
if (001.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 002_Click(object sender, EventArgs e)
{
if (002.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 003_Click(object sender, EventArgs e)
{
if (003.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 004_Click(object sender, EventArgs e)
{
if (004.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 005_Click(object sender, EventArgs e)
{
if (005.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 006_Click(object sender, EventArgs e)
{
if (006.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
虽然我还没有测试过,但在我看来这会导致自身冲突的问题,而且显然效率不高。我对编程还是很陌生,接触 C# 才 6 天。
谁能告诉我完成上述任务的更好方法?我假设有一些方法可以将所有这些复选框放入列表中并监听其中任何一个的更改,然后检查列表以查看是否有任何复选框值为真,如果它们为真,则将单个布尔值更改为真!
谢谢
您可以将复选框存储在 generic list
甚至 array
中
我认为最简单的方法是使用数组
bool YourAllowedToWork = false;
public void Check()
{
CheckBox[] checkboxes = { chck1, chck2, chck3 };
foreach(CheckBox checkbox in checkboxes){
if(checkbox.Checked == true){
YourAllowedToWork = true
}
}
}
所有复选框只能有一个事件。在该单个事件中,使用 OR 条件检查复选框的选中状态。
我认为您正在使用 windows 应用程序。在您的设计器文件中,将所有复选框的单击事件更改为一个事件,如下所示
this.001.Click += new System.EventHandler(this.checkBox1_Click);
this.002.Click += new System.EventHandler(this.checkBox1_Click);
this.003.Click += new System.EventHandler(this.checkBox1_Click);
在代码隐藏文件中,点击事件中所有复选框的使用或条件
private void checkBox1_Click(object sender, EventArgs e)
{
YourAllowedToWork = 001.Checked || 002.Checked || 003.Checked;
}
就像 AndreiSolero 的回答一样,但是 windows 表格已经根据它的工作原理将它们存储在一个集合中;控件存在于层次结构中以便出现在表单上,它们必须已经存储在您可以查询的集合中
bool youreAllowedToWork = x.Controls.OfType<CheckBox>().Where(cb => RegEx.IsMatch("^\d{3}$", cb.Name).Any(cb => cb.Checked)
x
是复选框所在的控件(例如表单本身或面板/组框) - 您应该将其更改为例如this
如果复选框在表单上,或者面板名称(如果它们在面板中)。
我假设复选框都在表单内,并且还与其他出于工作原因计算不感兴趣的复选框混合在一起,所以那里有一个正则表达式来检查控件的名称是 3 位数字(虽然我认为你一定已经掩盖了问题代码中的真实姓名,因为它甚至不应该编译 - c# 禁止以数字开头的名称)这将检查限制为我们感兴趣的工作原因复选框。这个正则表达式可能需要更改以说明您的控件名称的真实含义 - 请继续阅读以获取有关这一点的更多建议,因为我建议您不使用正则表达式让您的生活更轻松:
如果您想将所有复选框放在它们自己的面板中并且该面板中没有其他非工作原因复选框,那么您可以删除 .Where(...)
并让例如:
bool youreAllowedToWork = workReasonsPanel.Controls.OfType<CheckBox>().Any(cb => cb.Checked)
如果您将复选框与其他不属于“您被允许工作”原因的复选框混在一起,也许通过给它们命名比数字更好的名称来简化您的生活会有所帮助。
将它们全部命名为例如 workReason1
、workReason2
...
那么代码可以是:
bool youreAllowedToWork = x.Controls.OfType<CheckBox>().Where(cb => cb.Name.StartsWith("workReason")).Any(cb => cb.Checked)
我会使用面板方法或带有一致前缀的简单名称方法,因为这意味着添加更多工作原因所需要做的就是向 panel/add 添加另一个复选框另一个具有相同名称一致性的复选框
如果您的复选框都在 UI 中的同一位置,请使用面板方法;如果它们分散在 UI 中并与其他非工作原因混在一起,请使用名称方法复选框
所以我有这个小任务,如果我的任何复选框被打开,我试图更改一个布尔值。
所以我有一个布尔值
Boolean YourAllowedToWork = false;
还有一组复选框
private void 001_Click(object sender, EventArgs e)
{
if (001.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 002_Click(object sender, EventArgs e)
{
if (002.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 003_Click(object sender, EventArgs e)
{
if (003.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 004_Click(object sender, EventArgs e)
{
if (004.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 005_Click(object sender, EventArgs e)
{
if (005.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
private void 006_Click(object sender, EventArgs e)
{
if (006.Checked)
{
YourAllowedToWork = true;
}
else
{
YourAllowedToWork = false;
}
}
虽然我还没有测试过,但在我看来这会导致自身冲突的问题,而且显然效率不高。我对编程还是很陌生,接触 C# 才 6 天。
谁能告诉我完成上述任务的更好方法?我假设有一些方法可以将所有这些复选框放入列表中并监听其中任何一个的更改,然后检查列表以查看是否有任何复选框值为真,如果它们为真,则将单个布尔值更改为真!
谢谢
您可以将复选框存储在 generic list
甚至 array
我认为最简单的方法是使用数组
bool YourAllowedToWork = false;
public void Check()
{
CheckBox[] checkboxes = { chck1, chck2, chck3 };
foreach(CheckBox checkbox in checkboxes){
if(checkbox.Checked == true){
YourAllowedToWork = true
}
}
}
所有复选框只能有一个事件。在该单个事件中,使用 OR 条件检查复选框的选中状态。
我认为您正在使用 windows 应用程序。在您的设计器文件中,将所有复选框的单击事件更改为一个事件,如下所示
this.001.Click += new System.EventHandler(this.checkBox1_Click);
this.002.Click += new System.EventHandler(this.checkBox1_Click);
this.003.Click += new System.EventHandler(this.checkBox1_Click);
在代码隐藏文件中,点击事件中所有复选框的使用或条件
private void checkBox1_Click(object sender, EventArgs e)
{
YourAllowedToWork = 001.Checked || 002.Checked || 003.Checked;
}
就像 AndreiSolero 的回答一样,但是 windows 表格已经根据它的工作原理将它们存储在一个集合中;控件存在于层次结构中以便出现在表单上,它们必须已经存储在您可以查询的集合中
bool youreAllowedToWork = x.Controls.OfType<CheckBox>().Where(cb => RegEx.IsMatch("^\d{3}$", cb.Name).Any(cb => cb.Checked)
x
是复选框所在的控件(例如表单本身或面板/组框) - 您应该将其更改为例如this
如果复选框在表单上,或者面板名称(如果它们在面板中)。
我假设复选框都在表单内,并且还与其他出于工作原因计算不感兴趣的复选框混合在一起,所以那里有一个正则表达式来检查控件的名称是 3 位数字(虽然我认为你一定已经掩盖了问题代码中的真实姓名,因为它甚至不应该编译 - c# 禁止以数字开头的名称)这将检查限制为我们感兴趣的工作原因复选框。这个正则表达式可能需要更改以说明您的控件名称的真实含义 - 请继续阅读以获取有关这一点的更多建议,因为我建议您不使用正则表达式让您的生活更轻松:
如果您想将所有复选框放在它们自己的面板中并且该面板中没有其他非工作原因复选框,那么您可以删除 .Where(...)
并让例如:
bool youreAllowedToWork = workReasonsPanel.Controls.OfType<CheckBox>().Any(cb => cb.Checked)
如果您将复选框与其他不属于“您被允许工作”原因的复选框混在一起,也许通过给它们命名比数字更好的名称来简化您的生活会有所帮助。
将它们全部命名为例如 workReason1
、workReason2
...
那么代码可以是:
bool youreAllowedToWork = x.Controls.OfType<CheckBox>().Where(cb => cb.Name.StartsWith("workReason")).Any(cb => cb.Checked)
我会使用面板方法或带有一致前缀的简单名称方法,因为这意味着添加更多工作原因所需要做的就是向 panel/add 添加另一个复选框另一个具有相同名称一致性的复选框
如果您的复选框都在 UI 中的同一位置,请使用面板方法;如果它们分散在 UI 中并与其他非工作原因混在一起,请使用名称方法复选框