使用textchange事件从文本框中添加/减去

伊恩·伦德伯格

对于每种需要支付的账单,我有6个文本框2:

在此处输入图片说明

如果我在两个数字之一中输入数字,则会用不同之处更新另一个数字: 在此处输入图片说明

面板中的文本框将始终添加为相同的总和,如果更改值,它将自动更改其相邻文本框的值,但是RENT文本框不同。

我正在尝试使RENT文本框在其他3对其他文本框之间采用(差异/ 2)。因此,如果帕蒂比迈克多付100美元的水费,迈克必须偿还这100美元的租金,这也从帕蒂减去了100美元的租金。

我当前的代码结果如下:

在此处输入图片说明

As you can see it doesn't update the rent textboxes properly. I have been trying to do this for a little over half a day, and I just can't see what I am doing wrong or what might be wrong with my math. Here is all of the code for my textboxes' textchanged events

    private void txtMikeWater_TextChanged(object sender, EventArgs e)
    {
        double num;
        bool parse = Double.TryParse(txtMikeWater.Text, out num);
        if (txtMikeWater.Focused == true)
            if (parse && num >= 0 && num <= expenses[2])
                txtPattiWater.Text = (expenses[2] - num).ToString();
            else
                textBoxValidator(txtMikeWater, expenses[2], 0);

        double difference = Math.Abs(num - Convert.ToDouble(txtPattiWater.Text)) / 2;
        if (num > Convert.ToDouble(txtPattiWater.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) + difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) - difference).ToString();
        }
        else
            txtPattiRent.Text = ((expenses[0] / 2) - difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) + difference).ToString();
    }

    private void txtMikeElectric_TextChanged(object sender, EventArgs e)
    {
        double num;
        bool parse = Double.TryParse(txtMikeElectric.Text, out num);
        if (txtMikeElectric.Focused)
            if (parse && num >= 0 && num <= expenses[3])
                txtPattiElectric.Text = (expenses[3] - num).ToString();
        double difference = Math.Abs(num - Convert.ToDouble(txtPattiElectric.Text)) / 2;


        if (num > Convert.ToDouble(txtPattiElectric.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) + difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) - difference).ToString();
        }
        else if (num < Convert.ToDouble(txtPattiElectric.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) - difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) + difference).ToString();
        }
    }

    private void txtMikeInternet_TextChanged(object sender, EventArgs e)
    {


        double num;
        bool parse = Double.TryParse(txtMikeInternet.Text, out num);
        if (txtMikeInternet.Focused)
            if (parse && num >= 0 && num <= expenses[1])
                txtPattiInternet.Text = (expenses[1] - num).ToString();
        double difference = Math.Abs(num - Convert.ToDouble(txtPattiInternet.Text)) / 2;


        if (num > Convert.ToDouble(txtPattiInternet.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) + difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) - difference).ToString();
        }
        else if (num < Convert.ToDouble(txtPattiInternet.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) - difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) + difference).ToString();
        }
    }

    private void txtPattiWater_TextChanged(object sender, EventArgs e)
    {

        double num;
        bool parse = Double.TryParse(txtPattiWater.Text, out num);
        if (txtPattiWater.Focused == true)
            if (parse && num >= 0 && num <= expenses[2])
                txtMikeWater.Text = (expenses[2] - num).ToString();
        double difference = Math.Abs(num - Convert.ToDouble(txtMikeWater.Text)) / 2;


        if (num < Convert.ToDouble(txtMikeWater.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) + difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) - difference).ToString();
        }
        else
        {
            txtPattiRent.Text = ((expenses[0] / 2) - difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) + difference).ToString();
        }

    }

    private void txtPattiElectric_TextChanged(object sender, EventArgs e)
    {

        double num;
        bool parse = Double.TryParse(txtPattiElectric.Text, out num);
        if (txtPattiElectric.Focused)
            if (parse && num >= 0 && num <= expenses[3])
                txtMikeElectric.Text = (expenses[3] - num).ToString();
        double difference = Math.Abs(num - Convert.ToDouble(txtMikeElectric.Text)) / 2;
        if (num < Convert.ToDouble(txtMikeElectric.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) + difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) - difference).ToString();
        }
        else if (num > Convert.ToDouble(txtMikeElectric.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) - difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) + difference).ToString();
        }
    }

    private void txtPattiInternet_TextChanged(object sender, EventArgs e)
    {
        double num;
        bool parse = Double.TryParse(txtPattiInternet.Text, out num);
        if (txtPattiInternet.Focused)

            if (parse && num >= 0 && num <= expenses[1])
                txtMikeInternet.Text = (expenses[1] - num).ToString();

        double difference = Math.Abs(num - Convert.ToDouble(txtMikeWater.Text)) / 2;
        if (num < Convert.ToDouble(txtMikeWater.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) + difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) - difference).ToString();
        }
        else if (num > Convert.ToDouble(txtMikeWater.Text))
        {
            txtPattiRent.Text = ((expenses[0] / 2) - difference).ToString();
            txtMikeRent.Text = ((expenses[0] / 2) + difference).ToString();
        }

    }

The expenses variable just stores the sum the pairs of the textboxes are supposed to have.

If anyone can please help I would appreciate it.

EDIT Just for some more clarity regarding the expenses variable.

expenses[0] = total rent 
expenses[1] = total internet 
expenses[2] = total water
expenses[3] = total electricity
Chris Sinclair

Looks like your rent recalculations are only changing based on the difference of a single expense, not the total difference of all of them aggregated.

I suggest you create a single UpdateRent() method which sums up the total expenses paid for each person then calculates the difference:

private void txtPattiElectric_TextChanged(object sender, EventArgs e)
{

    double num;
    bool parse = Double.TryParse(txtPattiElectric.Text, out num);
    if (txtPattiElectric.Focused)
        if (parse && num >= 0 && num <= expenses[3])
            txtMikeElectric.Text = (expenses[3] - num).ToString();

    UpdateRent();
}

Your rent calculation might look like:

private void UpdateRent()
{
    double pattiPaid = GetPattiWater() + GetPattiElectric() + GetPattiInternet();
    double mikePaid = GetMikeWater() + GetMikeElectric() + GetMikeInternet();

    double difference = pattiPaid - mikePaid;
    double baseRent = GetRequiredMonthlyRent() / 2;

    double pattiRent = baseRent - difference;
    double mikeRent = baseRent + difference;

    txtPattiRent.Text = pattiRent.ToString();
    txtMikeRent.Text = mikeRent.ToString();
}

I also suggest you move most of the parsing/handling code to helper methods (indicated above) just to make it easier to track and debug the logic in general.

EDIT: Also note that the code eliminates the checking to see who paid more. It all works out in the math. For example, if Mike paid more, then difference is negative. Then that negative number is "subtracted" from Patti's base rent effectively increasing it. Feel free to re-introduce if checks to do the same work if you find it makes your code easier to understand, debug, and maintain.

EDITx2:在我的原始答案中并不太清楚。GetPattiWater()GetRequiredMonthlyRent()应该只读取/返回当前值的方法:

private double GetPattiWater()
{
    double amount;
    Double.TryParse(txtPattiWater.Text, out amount);
    return amount;
}

private double GetRequiredMonthlyRent()
{
    return expenses[3];
}

您可能需要对文本字段中的临时/空白/无效的不可解析的输入进行一些特殊处理(上面将仅返回0),但是将其临时视为零可能更简单。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在#EmberJs文本框中添加键击或键击事件的延迟

使用引导程序和JavaScript在文本框区域的onfocus事件中添加图标

当仅在JavaScript中读取文本框时,如何将键盘事件添加到文本框?

使用MVVM框架中的按钮动态添加文本框

使用Javascript从PHP附带的文本框中添加值

使用jquery在文本框中动态添加值

当事件“ MouseHover”处于活动状态时,将文本添加到文本框中

一种通过单击按钮将 int 值添加到文本框,然后使用另一个按钮从 int 值中减去的方法

如何从PHP变量中减去HTML文本框?

在WPF中动态添加文本框

在jQuery中添加文本框

在文本框css中添加图像

在HTML中动态添加文本框

在文本框中添加日历

随后在文本框中添加值

HTML在文本框中添加值

使用JavaScript添加文本框

将点击事件添加到WPF中的所有文本框

使用单个按钮单击事件的多个文本框值添加

如何使用动态单选按钮添加事件以显示文本框

C#如何在每次点击时使用文本框减去并显示在另一个文本框中

如何使用双击事件单击列表框中的文本以使该文本显示在空文本框中

如何使用onPaste事件将粘贴在文本框中的文本传递给javascript函数?

WPF中的文本框文本更改事件

文本框中是否有选择文本事件

按键事件并删除文本框和RichTextBox中的文本

如何在Python中添加减去的日期值

文本框KeyPress事件?

使用AngularJS单击事件时如何将行值填充到文本框中