问题描述
我有一个由三个分组框组成的表格。其中两个组框内部有两个复选框,第三个组框内部有三个复选框。每个复选框都有一个金额,如果选中该复选框,则需要计算总金额。
我知道我可以用一堆 if/else 语句来做到这一点,但我想知道我的程序是否有一种更简单的方法来循环遍历每个组框,将选中的框相加,然后显示总数。
如果这不是提出此问题的正确平台,请说明这一点,我将删除此问题。
预先感谢您的任何帮助或建议。
解决方法
假设您有 CheckBox
控件,由某些 GroupBox
中的不同 Form
控件托管,并且复选框的 Text
属性包含您想要求和的数字。如果这听起来是正确的,那么您可以通过一个单行 LINQ
查询来实现:
void SomeCaller()
{
var total = Controls.OfType<GroupBox>()
.SelectMany(g => g.Controls.OfType<CheckBox>()
.Where(c => c.Checked && int.TryParse(c.Text,out _)))
.Sum(c => int.Parse(c.Text));
txtOutput.Text = total.ToString();
}
或者……
void SomeCaller()
{
var total = new[] { groupBox1,groupBox2,groupBox3 }
.SelectMany(g => g.Controls.OfType<CheckBox>()
.Where(c => c.Checked && int.TryParse(c.Text,out _)))
.Sum(c => int.Parse(c.Text));
txtOutput.Text = total.ToString();
}
如果您不喜欢 LINQ
方式,您可以改为:
void SomeCaller()
{
var total = 0;
foreach (var g in Controls.OfType<GroupBox>())
foreach (var chk in g.Controls.OfType<CheckBox>())
if (chk.Checked && int.TryParse(chk.Text,out var value))
total += value;
txtOutput.Text = total.ToString();
}
如果要求和的数据类型不同,请使用正确的解析器来转换文本。像 decimal.TryParse(..)
和 decimal.Parse(..)
。
待办事项:
创建一个求和并返回总数的函数。