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

时间:2015-01-15 02:21:38

标签: c# winforms math textbox

我正在创建一个包含2个存储数字的文本框的应用程序,但是catch是他们存储的数字加起来固定的总和。我试图使用textchanged事件处理程序来执行此操作,因此当我键入时,其他文本框更新时使用正确的数字添加到我当前正在输入的文本框的总和。到目前为止我的代码是< / p>

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();

}

它起初工作,但我也有一个计算租金的文本框,我希望它会根据这两个文本框之间的差异进行加或减。因此,例如,如果一个人在另一个账单上支付额外的50美元,那么如果一个人支付额外的50美元,那么如果租金被分成2个方式,1000美元(每个500美元),它会减去一个人的租金成本,然后将其加上。那么租金将为一个人花费550,而另一个人花费450。如果不搞砸文本框中的文本,我无法想办法做到这一点。任何帮助将不胜感激:D

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

编辑:如果我可以尝试并提供一些观点,可以添加几个GIF

enter image description here

这是我想做的事情,它起初工作正常,但我希望它从“Patti”中取走100美元,并增加她必须支付的租金金额而“迈克”的租金将被减去,因为他不得不在公用事业上额外支付100美元。 但后来我也遇到了这个问题:

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

2 个答案:

答案 0 :(得分:1)

这是您完成此任务的另一种方式。这似乎有点矫枉过正,但如果您开始添加更多需要更新的租户,费用或控件,它可能会使其更容易实现。

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

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; }
    }
}

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

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();
        }
    }
}

答案 1 :(得分:0)

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

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;

    }
}

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