我的表格上有几个TextBox
。我给他们分配了 same Tag
值。现在,我要访问和{em> 个这些TextBox
es的值。我尝试了以下方法,但是没有用。即使没有抛出任何异常。但是控件从 foreach循环之前的函数退出。任何帮助将不胜感激。预先感谢。
private void CalculateExpense()
{
int sum = 0;
var textBoxes = this.Controls
.OfType<TextBox>()
.Where(d => d.Tag.ToString() == "ExpenseField")
.ToList();
foreach (var item in textBoxes)
{
sum = sum + Convert.ToInt16(!string.IsNullOrEmpty(item.Text) ? item.Text : "0");
}
this.TotalExpenseLbl.Text = sum.ToString();
this.TotalMonthlyExpenses.Text = sum.ToString();
}
答案 0 :(得分:3)
如果所有TextBox
都是直接在表单上 而不是在容器中(Panel
,GroupBox
es等)。
int sum = Controls
.OfType<TextBox>()
.Where(box => string.Equals("ExpenseField", box.Tag as String))
.Select(box => int.TryParse(box.Text, out var v) ? v : 0)
.Sum();
this.TotalExpenseLbl.Text = sum.ToString();
this.TotalMonthlyExpenses.Text = sum.ToString();
似乎,代码中的主要问题出在d.Tag.ToString()
中,因为Tag
默认为null
。
编辑:如果TextBox
位于多个 中,则必须使用递归而不是Controls
集合:
private static IEnumerable<Control> GetAll(Control control) {
var controls = control.Controls.OfType<Control>();
return controls
.SelectMany(ctrl => GetAll(ctrl))
.Concat(controls);
}
...
int sum = GetAll(this)
.OfType<TextBox>()
.Where(box => string.Equals("ExpenseField", box.Tag as String))
.Select(box => int.TryParse(box.Text, out var v) ? v : 0)
.Sum();
this.TotalExpenseLbl.Text = sum.ToString();
this.TotalMonthlyExpenses.Text = sum.ToString();