如何将整数值从 5 个不同的文本框传递到 2 个不同的文本框

我有一个带有多个按钮的 Winforms 应用程序。它要求用户单击按钮,无论需要多少次,该按钮 1 单击事件都会在文本框 1 内添加一个整数值,该整数值随着每次单击按钮 1 而递增。然后我有button2,当单击它时,它会从textbox1 内的整数值中减去。


现在我也有 textbox2、textbox3、textbox4、textbox5 和 textbox6 做同样的事情,每个都有自己的一对按钮来加和减。它们都彼此独立工作。 Txtbox1,2,3,4,5,6 是发送者。


当尝试将 txtbox1、txtbox2、txtbox3、txtbox4、txtbox5 和 txtbox6 中的整数值传递到 txtbox7 和 txtbox8(接收 txtbox)时,我的问题出现了。每个文本框还有两个用于添加值和减去值的按钮。我能够将 txtbox1 的值传递到 txtbox7 & txtbox8 没有问题。当我使用相同的代码让所有其他 txtboxes 将 int 值传递给 txtbox7 & 时,问题就开始了。 txtbox8,6 个 txtbox 之一的输入将相互覆盖。


例如如果我在 txtbox1 上点击 5 次,它会将 int 5 传递给 txtbox1、txtbox7 和 txtbox1。 txtbox8,但如果我去点击 txtbox2 两次,然后点击 txtbox7 & 8 值 5 并未消失,而是显示新值 2。我想要发生的是,当单击任何一个按钮时,传递到 2 个接收文本框的值需要添加到已经存在的 int 值中。我不知道这是否足够解释。这是我的代码。


private void button1Add_Click(object sender, EventArgs e)

{

  AddToTexBox1(1);

}


private void AddToTextBox1(int changeBy)

{

  if (int.TryParse(txtBox1.Text, out int value))

  {

     value += changeBy;

     txtBox1.Text = value.ToString();

     txtBox7.Text = value.ToString();

     txtBox8.Text = value.ToString();

  }

  else

  {

     MessageBox.Show("Invalid Integer in TextBox!");

  }


}


private void Btn2Subtract_Click(object sender, EventArgs e)

{

     AddToTextBox1(-1);

}


该代码对于 txtBox 1 和 txtBox7 & 运行良好。 txtBox8 但当我尝试对其他 txtBox 使用相同的内容时,它无法按预期工作。任何帮助将不胜感激。


饮歌长啸
浏览 133回答 3
3回答

Helenr

您当前的问题是直接对文本框中存储的值进行操作。所以当你这样做时:txtBox7.Text = value.ToString();您不检查当前存储在 txtBox7 中的值。所以你可以按照2条路径来解决它:使用与 int 相同的解析从 txtBox7 中获取值并将其放入变量中,然后向该变量添加值并然后将其保存回目标文本框。您可以在逻辑背后有一些模型(如果这些数字代表某些东西)并更新模型(通过根据您的“业务”规则将数字放入模型的属性中)。之后,通过将模型中的值放入文本框,将 UI(文本框)与模型同步。理想情况下,您希望为其使用数据绑定(以便在模型更改后自动刷新您的 UI)。以下是 1 的代码示例:if (int.TryParse(txtBox1.Text, out int value) &&    int.TryParse(txtBox7.Text, out int oldValue7) &&    int.TryParse(txtBox7.Text, out int oldValue8)    ){    value += changeBy;    oldValue7 += value;    oldValue8 += value;    txtBox1.Text = value.ToString();    txtBox7.Text = oldValue7.ToString();    txtBox8.Text = oldValue8.ToString();}如果您需要有关数据绑定的更多信息,请参阅文档。您必须花时间学习和习惯这种方法,但它可以让您将模型逻辑与 UI 解耦,这对于复杂的模型和 UI 是有益的。以下是我为业务规则引入单独的类的含义的示例:class MyModel{  public int MyFirstInputValue {get; set;}  public int MySecondInputValue {get; set;}  public int MyFirstResultValue {get; private set;}  public int MySecondResultValue {get; private set;}  public void RunMyCalculationLogic()  {    // your calculations go here...    MyFirstResultValue = MyFirstInputValue + MySecondInputValue;    MySecondResultValue = MyFirstInputValue - MySecondInputValue;  }}然后你或多或少像这样使用这个模型:var myModel = new MyModel();myModel.MyFirstInputValue = 1; // parse value from input textBox1myModel.MySecondInputValue = 2; // parse value from input textBox2myModel.RunMyCalculationLogic();// TODO: use results from MyFirstResultValue and MySecondResultValue to populate textBoxes you need我希望这足以让您开始。

千巷猫影

如果您使用 NumericUpDown 控件而不是文本框,您的生活会轻松得多。您可以将所有 NUD 设置为默认值 0,为它们编写一个值更改事件处理程序(将所有 NUD 值更改事件链接到同一个处理程序),该处理程序具有一行代码:nud7.Value = nud1.Value + nud2.Value + nud3.Value ...如果您要将 nud1 到 nud6 放入构造函数中的类范围数组中,那么您甚至可以使用 LINQ 将其简化为:nud7.Value = myNuds.Sum(n => n.Value);这是一步一步 - 在新项目中执行此操作。大约需要 10 分钟:制作一个新的 Windows 窗体应用程序在表格上输入 8 个数字选择全部,将它们的最小值和值设置为 0,将最大值设置为相关的值仅选择前 6 个转到属性网格,单击闪电,找到与值更改相关的事件(可能称为 ValueChanged,我现在不在电脑上进行测试)并写入“AllChanged”在旁边的框中按回车键出现代码视图。将我发布的第一个代码(添加所有值并将结果存储在数字 updown 7 的值中的代码)放在事件处理程序中运行项目我不确定为什么你有两个总计框..但我相信你可以解决这个问题注意不要将相同的事件处理程序添加到框 7;你会导致无限循环,导致堆栈溢出

扬帆大鱼

在尝试了我在另一个 Winforms 项目中使用的一些代码之后。我找到了解决问题的方法。这就是我所做的。       TextBox[] txtbox;        public FormOne()        {            InitializeComponent();            Sqlconn con = new Sqlconn();            txtbox = new TextBox[] { txtBox1, txtBox2, txtBox3, txtBox4, txtBox5, txtBox6, txtBox7};            foreach (TextBox text in txtbox)                text.TextChanged += new EventHandler(txtbox_TextChanged);           }           private void txtbox_TextChanged(object sender, EventArgs e)        {            int value = 0;            int total = 0;            foreach (TextBox text in txtbox)            {                if (int.TryParse(text.Text, out value))                    total += value;            }            txtBox7.Text = total.ToString();            txtBox8.Text = total.ToString();            private void FormOne_Load(object sender, EventArgs e)            {            }感谢大家的支持。
打开App,查看更多内容
随时随地看视频慕课网APP