Mega Code Archive

 
Categories / ASP.Net Tutorial / Custom Controls
 

Supporting Two-Way Databinding

Two-way databinding enables you to extract values  from a template.  You can use a two-way databinding expression not only to display the value of a data item, but also to update the value of a data item. File: ProductForm.cs using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; using System.Collections.Specialized; namespace myControls {     public class ProductForm : CompositeControl     {         public event EventHandler ProductUpdated;         private IBindableTemplate _editItemTemplate;         private ProductFormItem _item;         private IOrderedDictionary _results;         public IOrderedDictionary Results         {             get { return _results; }         }         public string Name         {             get             {                 EnsureChildControls();                 return _item.Name;             }             set             {                 EnsureChildControls();                 _item.Name = value;             }         }         public decimal Price         {             get             {                 EnsureChildControls();                 return _item.Price;             }             set             {                 EnsureChildControls();                 _item.Price = value;             }         }         [TemplateContainer(typeof(ProductFormItem), BindingDirection.TwoWay)]         [PersistenceMode(PersistenceMode.InnerProperty)]         public IBindableTemplate EditItemTemplate         {             get { return _editItemTemplate; }             set { _editItemTemplate = value; }         }         protected override void CreateChildControls()         {             _item = new ProductFormItem();             _editItemTemplate.InstantiateIn(_item);             Controls.Add(_item);         }         protected override bool OnBubbleEvent(object source, EventArgs args)         {             _results = _editItemTemplate.ExtractValues(_item);             if (ProductUpdated != null)                 ProductUpdated(this, EventArgs.Empty);             return true;         }     }     public class ProductFormItem : WebControl, IDataItemContainer     {         private string _name;         private decimal _price;         public string Name         {             get { return _name; }             set { _name = value; }         }         public decimal Price         {             get { return _price; }             set { _price = value; }         }         public object DataItem         {             get { return this; }         }         public int DataItemIndex         {             get { return 0; }         }         public int DisplayIndex         {             get { return 0; }         }     } } File: Default.aspx <%@ Page Language="C#" %> <%@ Register TagPrefix="custom" Namespace="myControls" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server">     void Page_Load()     {         if (!Page.IsPostBack)         {             ProductForm1.Name = "Laptop";             ProductForm1.Price = 433.12m;             ProductForm1.DataBind();         }     }     protected void ProductForm1_ProductUpdated(object sender, EventArgs e)     {         lblName.Text = ProductForm1.Results["Name"].ToString();         lblPrice.Text = ProductForm1.Results["Price"].ToString();     } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head id="Head1" runat="server">     <title>Show ProductForm</title> </head> <body>     <form id="form1" runat="server">     <div>     <custom:ProductForm         id="ProductForm1"         Runat="server" OnProductUpdated="ProductForm1_ProductUpdated">         <EditItemTemplate>         <asp:Label             id="lblName"             Text="Product Name:"             AssociatedControlID="txtName"             Runat="server" />         <asp:TextBox             id="txtName"             Text='<%# Bind("Name") %>'             Runat="server" />         <br /><br />         <asp:Label             id="lblPrice"             Text="Product Price:"             AssociatedControlID="txtPrice"             Runat="server" />         <asp:TextBox             id="txtPrice"             Text='<%# Bind("Price") %>'             Runat="server" />         <br /><br />         <asp:Button             id="btnUpdate"             Text="Update"             Runat="server" />         </EditItemTemplate>     </custom:ProductForm>     <hr />     New Product Name:     <asp:Label         id="lblName"         Runat="server" />     <br /><br />     New Product Price:     <asp:Label         id="lblPrice"         Runat="server" />     </div>     </form> </body> </html>