TextChanged事件仅在我将光标放在文本框中并更改文本时触发

时间:2009-06-03 16:50:54

标签: c# asp.net

我有一个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变为静态变量?

5 个答案:

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

现在,视图中的控件可以绑定到模型的属性,无论数量或单位价格如何更改(无论是由用户通过控件还是由您自己的代码),您都可以确定,衍生金额将相应更改。