我有一个TextChanged甚至在文本框中,当我输入数据时,它会更新另一个文本框,而这个文本框又应该触发TextChanged事件,但是直到我将光标放在TextBox中才会触发。有解决方案吗?
数量变更时更新延长价格的代码:
protected void txtQty1_TextChanged(object sender, EventArgs e)
{
if (txtQty1.Text != string.Empty && txtUnitPrice1.Text != string.Empty)
{
int qty = Convert.ToInt32(txtQty1.Text);
double unitPrice = Convert.ToDouble(txtUnitPrice1.Text);
double extendTotal1 = qty * unitPrice;
txtExtPrice1.Text = extendTotal1.ToString();
}
}
单位价格变动时更新延伸价格的代码:
protected void txtUnitPrice1_TextChanged(object sender, EventArgs e)
{
if (txtQty1.Text != string.Empty && txtUnitPrice1.Text != string.Empty)
{
int qty = Convert.ToInt32(txtQty1.Text);
double unitPrice = Convert.ToDouble(txtUnitPrice1.Text);
double extendTotal1 = qty * unitPrice;
txtExtPrice1.Text = extendTotal1.ToString();
}
}
最后,这应该在延长价格变化时更新总计:
protected void txtExtPrice1_TextChanged(object sender, EventArgs e)
{
if (txtExtPrice1.Text != string.Empty)
{
double extendedTotal1 = Convert.ToDouble(txtExtPrice1.Text);
double grandTotal = Convert.ToDouble(txtGrandTotal.Text);
grandTotal += extendedTotal1;
txtGrandTotal.Text = grandTotal.ToString();
}
}
我是否应该将Grand Total变为静态变量?
答案 0 :(得分:1)
不知道这是否有帮助,因为代码(大多数)对我有用,但我在总计中得到奇数总数,所以我将事件处理程序更改为“Validating”for Quantity和UnitPrice(并且挂钩)他们都是同一个事件处理程序,因为他们正在做同样的事情......)(编辑:是的,我伪造了一些逻辑,包括如果它是空的则设置了GrandTotal)。
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (!String.IsNullOrEmpty(textBox1.Text) && !String.IsNullOrEmpty(textBox2.Text))
{
int qty = int.Parse(textBox1.Text);
double price = double.Parse(textBox2.Text);
double totalPrice = qty * price;
textBox3.Text = totalPrice.ToString();
}
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
double bTotal = double.Parse(textBox3.Text);
if (String.IsNullOrEmpty(textBox4.Text)) textBox4.Text = "100.00";
double gTotal = double.Parse(textBox4.Text);
gTotal += bTotal;
textBox4.Clear();
textBox4.Text = gTotal.ToString();
}
答案 1 :(得分:1)
textchanged事件不会在第二个文本框中被触发,因为它没有焦点。
之前添加此行,当您想要将textchanged触发时。
txtBox2.Focus();
//在第二个文本框中执行您需要执行的操作。
txtBox1.Focus();
这应该有效
Sujay
答案 2 :(得分:0)
只需调用代码来更新第一个textchanged事件的总计,并且不要担心当你尝试级联到另一个时它不起作用。
答案 3 :(得分:0)
可能是一个愚蠢的问题,但所有这些事件都与相应的控制相关联吗?
如果是这样,每个事件第一行的断点应该可以帮助您快速追踪问题。
如果没有,那就是你的问题:)。
更新:
我相信我找到了你的问题。如果您以编程方式将文本框值设置为已包含的相同值,则TextChanged事件将 NOT 触发。
因此,在您的情况下,如果要将txtQty1或txtUnitPrice1文本框中的值更改为它们已包含的相同值,则txtExtPrice1文本框中的值以编程方式更新为相同的值它已经包含的价值;因此,您的txtGrandTotal.Text属性未更新,因为更新它的事件( txtExtPrice1_TextChanged )而不是被触发。
答案 4 :(得分:0)
这里的基本问题是您正在尝试使用GUI控件来执行业务逻辑。这总是一个坏主意。 GUI控件旨在只做一件事,一件事:与用户交互。尝试用它们做任何其他事情,例如执行计算,只会导致问题。
尝试阅读MVP(或MVVM)模式。它将向您展示如何在模型中存储视图的逻辑数据,这也是您进行所有计算的地方。仅当模型中的相应数据改变时才更新GUI控件。例如,模型的部分实现可能如下所示:
public class Model : INotifyPropertyChanged {
#region INotifyPropertyChanged implementation
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName) {
var handler = PropertyChanged;
if(null != handler)
handler(this, new PropertyChangedEventArgs(propertyName));
switch(propertyName){
case Quantity:
case UnitPrice:
OnPropertyChanged("ExtendedPrice");
break;
case ExtendedPrice:
OnPropertyChanged("Tax");
OnPropertyChanged("GrandTotal");
break;
case Tax:
OnPropertyChanged("GrandTotal");
break;
}
}
#endregion
private int _quantity;
public int Quantity{
get { return _quantity; }
set {
if (value != _quantity) {
_quantity = value;
OnPropertyChanged("Quantity");
}
}
}
private decimal _unitPrice;
public decimal UnitPrice {
get { return _unitPrice; }
set {
if (value != _unitPrice) {
_unitPrice = value;
OnPropertyChanged("UnitPrice");
}
}
}
public decimal ExtendedPrice {
get { return Quantity * UnitPrice; }
}
public decimal Tax {
get { return ExtendedPrice * TaxRate; }
}
public decimal GrandTotal {
get { return ExtendedPrice + Tax; }
}
}
现在,视图中的控件可以绑定到模型的属性,无论数量或单位价格如何更改(无论是由用户通过控件还是由您自己的代码),您都可以确定,衍生金额将相应更改。