如何使文本框保持相同的总和

how to make text boxes keep the same sum

我正在制作一个应用程序,它有 2 个存储数字的文本框,但要注意的是它们存储的数字加起来是一个固定的总和。我正在尝试使用 textchanged 事件处理程序来执行此操作,因此在我键入时,其他文本框会更新为正确的数字,该数字会添加到我当前输入的文本框的总和中。到目前为止我的代码是

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

}

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

}

一开始它可以工作,但我还有一个计算租金的文本框,我希望它会根据这两个文本框之间的差异进行加减。因此,例如,如果租金以 1000 美元(即每人 500 美元)的方式分成 2 种方式,如果一个人在另一张账单上额外支付 50 美元,它会从一个人身上减去租金成本,然后再增加。那么一个人的房租是 550,另一个人是 450。如果不搞砸文本框中的文本,我想不出一种方法来做到这一点。任何帮助将不胜感激:D

编辑:费用数组包含该特定账单的最大值。我有它的设置所以它最初将账单分成两半

编辑:如果可以的话,添加几张 gif 来尝试给出一些观点

这有点像我想做的事情,一开始效果很好,但我希望它能把从 "Patti" 中扣除的 100 美元加到房租中她必须支付,而 "Mike's" 租金将被减去,因为他必须额外支付 100 美元的水电费。 但是后来我也 运行 遇到了这个问题:

一旦我点击另一个项目(它应该加载该项目的值),它就会搞砸文本框。我认为这与当我切换 selecteditems 时仍然调用 textchanged 处理程序有关。

您可以在 TextChanged 事件中将一个 TextBox 的文本从另一个 TextBox 中更新,如果您暂时取消分配您正在修改的 TextChanged 事件,修改它,然后再次重新分配它:

private void txtMikeWater_TextChanged(object sender, EventArgs e)
{
    int amount;
    if (int.TryParse(txtMikeWater.Text, out amount))
    {
        txtPattiWater.TextChanged -= txtPattiWater_TextChanged;
        txtPattiWater.Text = (water - amount).ToString();
        txtPattiWater.TextChanged += txtPattiWater_TextChanged;
    }
}

private void txtPattiWater_TextChanged(object sender, EventArgs e)
{
    int amount;
    if (int.TryParse(txtMikeWater.Text, out amount))
    {
        txtMikeWater.TextChanged -= txtMikeWater_TextChanged;
        txtMikeWater.Text = (water - amount).ToString();
        txtMikeWater.TextChanged += txtMikeWater_TextChanged;

    }
}

但这很快就会变得丑陋。您可以考虑创建一个 class 或两个来表示费用,然后为每个租户实例化一个。

这是完成此操作的另一种方法。这可能看起来有点矫枉过正,但如果您开始添加更多需要更新的租户、费用或控件,从长远来看,它可能会变得更容易 运行。

首先,创建一个简单的 class 来存储费用:

public class Expenses
{
    public double Rent { get; set; }
    public double Internet { get; set; }
    public double Groceries { get; set; }
    public double Water { get; set; }
    public double Electricity { get; set; }
    public double TV { get; set; }

    public double Total
    {
        get { return Rent + Internet + Groceries + Water + Electricity + TV; }
    }
}

您可以创建一个 class 的实例来表示家庭总开支,也可以为每个租户创建一个实例:

private Expenses totalExpenses = new Expenses
{
    Electricity = 100,
    Groceries = 300,
    Internet = 65,
    Rent = 1300,
    TV = 45,
    Water = 20
};

private Expenses pattiExpenses;
private Expenses mikeExpenses;

然后,当您的应用启动时(假设您没有从其他数据源加载数据),您可以将每个人的开支设置为家庭开支的平均份额:

public Form1()
{
    InitializeComponent();

    int tenantCount = 2;

    // Start each person out splitting the total expenses
    pattiExpenses = new Expenses
    {
        Electricity = totalExpenses.Electricity / tenantCount,
        Groceries = totalExpenses.Groceries / tenantCount,
        Internet = totalExpenses.Internet / tenantCount,
        Rent = totalExpenses.Rent / tenantCount,
        TV = totalExpenses.TV / tenantCount,
        Water = totalExpenses.Water / tenantCount
    };

    mikeExpenses = new Expenses
    {
        Electricity = totalExpenses.Electricity / tenantCount,
        Groceries = totalExpenses.Groceries / tenantCount,
        Internet = totalExpenses.Internet / tenantCount,
        Rent = totalExpenses.Rent / tenantCount,
        TV = totalExpenses.TV / tenantCount,
        Water = totalExpenses.Water / tenantCount
    };

    UpdateTextBoxes();
}

接下来,您可以使用一个全局变量来跟踪文本是否正在从代码中更新,而不是为文本框添加和删除事件处理程序:

private bool textUpdatingFromCode = false;

并且您可以创建一个将此变量设置为 true 的方法,更新所有文本框,然后再次将变量设置为 false:

private void UpdateTextBoxes()
{
    textUpdatingFromCode = true;

    txtPattiWater.Text = pattiExpenses.Water.ToString();
    txtMikeWater.Text = mikeExpenses.Water.ToString();

    // . . .
    // Continue for any other text boxes, including 
    // one that displays each person's total

    txtPattiTotal.Text = pattiExpenses.Total.ToString();
    txtMikeTotal.Text = mikeExpenses.Total.ToString();

    textUpdatingFromCode = false;
}

最后,在您的 TextChanged 事件中,您可以使用仅更新对象然后刷新所有文本框的代码。这将允许您从任何 TextChanged 事件更新多个文本框:

private void txtMikeWater_TextChanged(object sender, EventArgs e)
{
    if (!textUpdatingFromCode)
    {
        double amount;
        if (double.TryParse(txtMikeWater.Text, out amount))
        {
            mikeExpenses.Water = amount;
            pattiExpenses.Water = totalExpenses.Water - mikeExpenses.Water;
            UpdateTextBoxes();
        }
    }
}

private void txtPattiWater_TextChanged(object sender, EventArgs e)
{
    if (!textUpdatingFromCode)
    {
        double amount;
        if (double.TryParse(txtMikeWater.Text, out amount))
        {
            pattiExpenses.Water = amount;
            mikeExpenses.Water = totalExpenses.Water - pattiExpenses.Water;
            UpdateTextBoxes();
        }
    }
}