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

C# 如何将一个整数值从5个不同的文本框传递到2个不同的文本框,c#,winforms,C#,Winforms,我有一个Winforms应用程序,它有几个按钮。它要求用户单击一个按钮,不管他们需要多少次,该按钮1单击事件然后在textbox1中添加一个整数值,该整数值随着每次单击按钮1而递增。然后我有一个按钮2,当点击时,它会从textbox1中的整数值中减去 现在我还有textbox2、textbox3、textbox4、textbox5和textbox6,它们各自用自己的一对按钮进行加法和减法运算。他们都独立工作。Txtbox1、2、3、4、5、6是发送方 我的问题出现在尝试将txtbox1、txtb

我有一个Winforms应用程序,它有几个按钮。它要求用户单击一个按钮,不管他们需要多少次,该按钮1单击事件然后在textbox1中添加一个整数值,该整数值随着每次单击按钮1而递增。然后我有一个按钮2,当点击时,它会从textbox1中的整数值中减去

现在我还有textbox2、textbox3、textbox4、textbox5和textbox6,它们各自用自己的一对按钮进行加法和减法运算。他们都独立工作。Txtbox1、2、3、4、5、6是发送方

我的问题出现在尝试将txtbox1、txtbox2、txtbox3、txtbox4、txtbox5和txtbox6中的整数值传递到接收txtbox7和txtbox8时。这些txtbox中的每一个都有两个按钮,用于加值和减值。我能够将txtbox1传递值毫无问题地传递到txtbox7和txtbox8。当我使用相同的代码让所有其他txtbox将int值传递给txtbox7和txtbox8时,问题就开始了,来自6个txtbox之一的输入将相互覆盖

e、 g.如果我在txtbox1上单击5次,它会将int 5传递到txtbox1、txtbox7和txtbox8,但是如果我在txtbox2上单击2次,那么txtbox7和8的值5不会消失,而是显示新的值2。我想要发生的是,当这些按钮中的任何一个被点击时,传递到2个接收txtboxs的值需要被添加到已经存在的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使用相同的代码时,它并没有像预期的那样工作。任何帮助都将不胜感激。

您当前的问题是直接对文本框中存储的值进行操作。所以当你这样做的时候:

txtBox7.Text = value.ToString();
您不检查当前存储在txtBox7中的值

因此,您可以通过以下两种途径解决此问题:

  • 使用与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 textBox1
    myModel.MySecondInputValue = 2; // parse value from input textBox2
    myModel.RunMyCalculationLogic();
    // TODO: use results from MyFirstResultValue and MySecondResultValue to populate textBoxes you need
    

    我希望这就足够让你开始了。

    如果你使用数字上下控件而不是文本框,你的生活会轻松得多。您可以将所有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,我现在不在pc上测试),并在旁边的框中写入“AllChanged”,然后按return
    • 此时会出现代码视图。将我发布的第一个代码(添加所有值并将结果存储为数字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)
                {
    
                }
    
    

    感谢大家的支持。

    Stas Ivanov我尝试了您的代码,但它会导致txtbox7和8显示的数字比txtbox1上显示的数字增加5、6或9倍。换句话说,我在txtbox1上单击了两次按钮,应该传递给txtbox7和8的值应该是2,而它显示的是6。@Yorelis,您想要实现的逻辑对我来说并不完全清楚。你能在你的问题中简单而准确地描述一下规则吗?你可以做的另一件事是玩我的代码,看看你是否能让它工作。它现在给了你新的行为,对吗?斯塔斯·伊万诺夫我想要的是,在每个文本框中输入的值被传递到另外两个文本框中。在这种情况下,这些框将是txtBox7和txtBox8,它们需要来自其他文本框的值。因此,如果我在txtbox1中输入值5,然后在txtbox2中输入值4,然后在txtbox3中输入值2,在txtbox4中输入值1,在txtbox5中输入值2,在txtbox6中输入值3,那么结果将是txtbox7和txtbox8都应显示值17,但txtbox7&8是否要计算它们的总和?那么这与“加减法”有什么关系呢?Kyle Wang是的,我需要将值传递给tex