CS 3870 Web User Control Events
Adding Items to Shopping Bag DataTable bag = (DataTable)Session["Prog7_Bag"]; DataRow row = bag.NewRow(); row[0] = txtID.Text; row[1] = txtName.Text; row[2] = txtQuantity.Text; //row[3] = txtPrice.Text; //row[4] = txtSubTotal.Text; row[3] = double.Parse(txtPrice.Text.Replace("$", "")); row[4] = double.Parse(txtSubTotal.Text.Replace("$", ""));
Public Event Define event Raise event Handle event
TextChanged for txtQuantity TextChanged event is defined by for txtQuantity Raised when the text changed We only need to handle it Inside Class Prog7_ShoppingItem AutoPostBack to True
TextChanged for txtQuantity protected void txtQuantity_TextChanged(object sender, EventArgs e) { int quantity; if(int.TryParse(txtQuantity.Text, out quantity) && quantity >= 0) // update the object and display new cost _theQuantity = quantity; _theCost = _theQuantity * _thePrice; lblMsg.Text = ""; txtCost.Text = string.Format("{0:C}", _theCost); } else // Error message on label and clear Cost txtCost.Text = “” lblMessage.Text = “Invalid”
Checkout.aspx The total cost not updated when one ShoppingItem has changed. We need an event!
Define Event VB.NET Public Event ItemChanged(ByVal x As Prog7_ShoppingItem, ByVal valid As Boolean) C# //Declaration of delegate. public delegate void ItemChangedHandler(Prog7_ShoppingItem x, bool valid); //Instance of delegate used in declaring event. public event ItemChangedHandler ItemChanged;
Raise Event protected void txtQuantity_TextChanged(. . .) { int quantity; if(int.TryParse(txtQuantity.Text, out quantity) && quantity >= 0) // update the object and display new cost ItemChanged(this, true); } else // Error message on label and clear Cost ItemChanged(this, false);
Event Handler //Handler for an item quantity changing. private void HandleChangeEvent(Prog7_ShoppingItem x, bool valid) { if(valid) } else txtTotal.Text = "";
private void HandleChangeEvent(Prog7_ShoppingItem x, bool valid) { if (valid) DataTable theTable = (DataTable)Session["Prog5_Bag"]; double total = 0; DataRow row; for (int i = 0; i < theTable.Rows.Count; i++) row = theTable.Rows[i]; if (row[0].ToString() == x.TheID) row[2] = x.TheQuantity; row[4] = x.TheCost; } total += double.Parse(row[4].ToString()); txtTotal.Text = string.Format("{0:C}", total); else txtTotal.Text = "";
Add Event Handler // Page Checkout protected void Page_Load(object sender, EventArgs e) { for (int i = 0; i < theTable.Rows.Count; i ++) . . . item.ItemChanged += HandleChangeEvent; Panel1.Controls.Add(item); }
Page Shopping.aspx Focus must be correct at all times