为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
饮歌长啸 2023-12-17 16:54:36
我有一个带有多个按钮的 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 使用相同的内容时,它无法按预期工作。任何帮助将不胜感激。
查看完整描述

3 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

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

txtBox7.Text = value.ToString();

您不检查当前存储在 txtBox7 中的值。

所以你可以按照2条路径来解决它:

  1. 使用与 int 相同的解析从 txtBox7 中获取值并将其放入变量中,然后向该变量添加值并然后将其保存回目标文本框。

  2. 您可以在逻辑背后有一些模型(如果这些数字代表某些东西)并更新模型(通过根据您的“业务”规则将数字放入模型的属性中)。之后,通过将模型中的值放入文本框,将 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

我希望这足以让您开始。


查看完整回答
反对 回复 2023-12-17
?
千巷猫影

TA贡献1829条经验 获得超7个赞

如果您使用 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;你会导致无限循环,导致堆栈溢出


查看完整回答
反对 回复 2023-12-17
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

在尝试了我在另一个 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)

            {


            }


感谢大家的支持。


查看完整回答
反对 回复 2023-12-17
  • 3 回答
  • 0 关注
  • 68 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信