【问题标题】:C# - how to get list of textboxes with same tag value in windowform?C# - 如何以窗口形式获取具有相同标签值的文本框列表?
【发布时间】:2018-06-22 10:40:25
【问题描述】:

我有几个TextBoxes 在表单上。我已经为他们分配了 same Tag 值。现在我想访问并总结这些TextBoxes 的值。我尝试了以下方法,但没有奏效。即使它没有抛出任何异常。但是控件在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();
} 

【问题讨论】:

  • 您是否尝试过调试您的代码并检查textBoxes 是否为空?
  • a) tbox 是直接在表单上还是在某个容器中,例如 groupbox 或 panel?调试器对textBoxes.Count 等有什么看法? - 如果它们是嵌套的,并且您知道将this.Controls 替换为the container.Controls 的位置。如果它们在许多容器中,您可能需要查看recursive function..
  • `我尝试了以下方法,但没有成功`你能详细说明它是如何失败的吗?
  • 所有文本框都放在不同的组框中。当我调试代码时,当它到达 var textBoxes = this.Controls.OfType().Where(d => d.Tag.ToString() == "ExpenseField").ToList 时,代码块中存在调试器();
  • @mubsher 这不太可能发生。

标签: c# .net visual-studio winforms


【解决方案1】:

如果所有TextBoxes 都直接在表单上,​​而不是在容器中(Panels、GroupBoxes 等)。

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(),因为默认情况下Tagnull

编辑:如果TextBoxes 在多个包含中,您必须使用递归而不是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();

【讨论】:

  • 谢谢@Dmitry。它使我的代码正常工作,但总和为 0。可能是因为它们位于不同的组框中。
  • @mubsher:那么(如果TextBoxes 在不同的容器中)你应该把Controls.OfType&lt;TextBox&gt;() 改成递归版本,见stackoverflow.com/questions/3419159/…
猜你喜欢
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多