繁体   English   中英

有没有办法在 Visual Studio 中使用 C# 动态更改文本框的文本,以便该值是来自其他文本框的值的总和?

[英]Is there a way to dynamically change the text of a textBox in Visual Studio with C# so that the value is a sum of values from other textboxes?

我需要有一个文本框,该文本框随着其他文本框中的值的更改而动态更改,并且“总计”文本框的值(将是 integer 转换为字符串)必须具有其他值的总和。 有没有办法做到这一点而不必为每个其他文本框创建一个 TextChanged 事件?

一种“无需”连接所有事件的可能解决方案是使用每个文本框的DataBindings属性。 唯一的问题是我们需要某种DataSource 一个简单的 Class 可能是一个简单的解决方案。 例子…

我们可以创建一个 class,它对每个文本框都有一个string属性,它代表每个文本框中的每个string 然后一个Total属性是所有文本框的总和。 一旦我们实例化了这个 class object,我们就可以将每个文本框DataBindings分配给 class 中的匹配属性。 这个简化TextBoxTotals class 可能看起来像……

public class TextBoxesTotal {
  public string TB1 { get; set; }
  public string TB2 { get; set; }
  public string TB3 { get; set; }

  public string Total {
    get {
      int.TryParse(TB1, out int v1);
      int.TryParse(TB2, out int v2);
      int.TryParse(TB3, out int v3);
      return (v1 + v2 + v3).ToString();
    }
  }
}

然后在 forms 加载事件中,您可以实例化一个新的TextBoxesTotal object,然后将其用作文本框DataBindingsDataSource 用法可能看起来像……

TextBoxesTotal TextBoxTotals = new TextBoxesTotal();

public Form2() {
  InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e) {
  textBox1.DataBindings.Add(new Binding("Text", TextBoxTotals, "TB1"));
  textBox2.DataBindings.Add(new Binding("Text", TextBoxTotals, "TB2"));
  textBox3.DataBindings.Add(new Binding("Text", TextBoxTotals, "TB3"));
  textBox4.DataBindings.Add(new Binding("Text", TextBoxTotals, "Total"));
}

当用户更改文本框中的文本然后“离开”文本框时,这将“更新”总计文本框。 抱歉,如果这没有太大帮助,因为在我看来,我们仍然必须分配每个文本框。 但它可能会少一点代码。 如果这没有帮助,请告诉我,我将删除它。

我假设您不想为每个TextBox创建TextChanged事件处理程序,因为这是一项乏味的工作。 有一种方法可以让它变得简单。

从这样的字段开始:

private TextBox[] textBoxes = null;

然后您可以像这样设置所有TextChanged事件处理程序:

textBoxes = new []
{
    textBox1, textBox2, textBox3,
    textBox4, textBox5,
};

foreach (var tb in textBoxes)
{
    tb.TextChanged += (_, _) => UpdateTotal();
}

现在可以按照您想要的任何方式定义UpdateTotals 这是我的版本:

private void UpdateTotal()
{
    var value =
        textBoxes
            .Select(x =>
                double.TryParse(x.Text, out double value)
                    ? value
                    : 0.0)
            .Sum();
            
    textBoxTotal.Text = value.ToString();
}

应该是这样的

标签1.text= textbox1.value + textbox2.value + textbox3.value +.....

在 Visual Studio 中,go 到 Form1.cs[Design] 并左键单击一个文本框,然后在右侧下侧单击显示“事件”的闪电。 搜索“TextChanged”并输入您希望如何命名事件(例如“textBox1_TextChanged”)。 点击回车后,您应该会自动被发送到 Form1.cs,在那里创建了一个新的 void。 在那里,插入 Stefanovici 提出的代码并冲洗并为每个文本框重复

private void textBox1_TextChanged(object sender, EventArgs e) //should automatically be created
{
    Label1.text= textbox1.text + textbox2.text + textbox3.text +.....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM