C#-如何在windowform中获取具有相同标签值的文本框列表?

时间:2018-06-22 10:40:25

标签: c# .net visual-studio winforms

我的表格上有几个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();
} 

1 个答案:

答案 0 :(得分:3)

如果所有TextBox都是直接在表单上 而不是在容器中(PanelGroupBox 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();