如何使文本框保持相同的总和
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();
}
}
}
我正在制作一个应用程序,它有 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();
}
}
}