创建数据绑定模板控件 Asp.net
|  这是我很久以前翻译的,做为我博客园的第一篇文章发一下。 Download Source Code (代码下载)  
 
 创建一个像Gridview一样可以绑定数据的控件,以此提高开发效率.     简介        数据绑定控件在开发人员中是最流行的,因为他们都很直接. 而像Gridview和DataList的流行不是因为他们的丰富功能,而是因为他们都允许更多的个性化.用在此处的模板,可以提供很好的定制外观和感受.  当然模板概念也可以用于更广的自定义控件 .而你也可以用模板的方式把你的数据展现给用户.下面图解的方式讲述如何去做.  数据绑定和模板       确切的讲模板控件不必总是绑定数据, 但无论怎样,现实世界案例中,更多的是数据驱动表现层.因此,还是有必要去关注学习如何让模板控件绑定数据的. 这就意味着你可以在你的控件里使用流行的 Eval()Bind()这样的数据绑定表达式.         接下来要开发一个数据绑定模板控件需要你的自定义控件继承CompositeDataBoundControl 这个基类.CompositeDataBoundControl 是所有二维数据绑定控件的的基类(比如GridView).继承CompositeDataBoundControl 必须 覆盖CreateChildControls(IEnumerable, Boolean)这个方法用以创建控件层.单独子控件需要引用Controls命名空间.     实例      接下来 我们创建一个模板控件 ,首先建立一个站点,并在App_Code内创建一个新类     ---------------  namespace BinaryIntellect  {     public class MyTemplatedControl:CompositeDataBoundControl     {  -------------------  MyTemplatedControl 就是我们的新模板主控件  接下来我们创建一个新类  ---------------  public class TemplateItem:Control,IDataItemContainer  {  ---------------  这个类,继承自Control 类 和实现了 接口IDataItemContainer  他将在模板控件里独立表现数据集  IDataItemContainer 接口将促使这个类可以实现3个属性.(DataItem, DataItemIndex and DisplayIndex)  先要在这个类里声明一些需要的变量  -------------------  private object _DataItem;  private int _DataItemIndex;  private int _DisplayIndex;  ------------------  _DataItem 是object 表示 可以接收单独的数据集 比如DataRow 等...那就是用来跟模板控件绑定的.  DataItemIndex表示数据源里数据集的索引 而_DisplayIndex 是用于在模板控件里显示定位索引的.记住,它可以作为数据源中的第100个定位. 因为像和模块控件里排序,分页的显示出来的索引Id.  这里要把3个变量包装到只读属性里  ----------------  public object DataItem   {   get { return _DataItem; }   }      public int DataItemIndex   {   get { return _DataItemIndex; }   }      public int DisplayIndex   {   get { return _DisplayIndex; }   }             --------------  接下来我们要在构造函数里接受这3个变量的值  ----------------  public TemplateItem(object dataItem, int index)  {  _DataItem = dataItem;             _DataItemIndex = _DisplayIndex = index;            }  -----------------  注意的是我们的例子不会具体使用DisplayIndex这个属性.     现在我们打开原来我们创建的模板控件声明下面的属性  ----  private ITemplate _itemtemplate;  [TemplateContainer(typeof(TemplateItem))]  public ITemplate MyItemTemplate  {  get { return _itemtemplate; }  set { _itemtemplate = value; }  }     ----  这里我们 声明了ITemplate类型的一个变量 ,这个变量用MyItemTemplate 属性进行包装.  MyItemTemplate被声明为我们自定义控件里的一个模板  这里嵌入的控件类似于Gridview里的ItemTemplate 控件一样..而我们在这里定义了名为MyItemTemplate 的控件.   注意MyItemTemplate 控件使用 Attribute TemplateContainer 装饰了的.Attribute TemplateContainer 是用来指定 一个类可以与数据集进行绑定行为.     接下来我们覆盖CreateChildControls() 方法.  --------------------  protected override int CreateChildControls   (System.Collections.IEnumerable dataSource,    bool dataBinding)   {   int index=0;   if (dataBinding)   {   foreach (object dataItem in dataSource)   {   if (_itemtemplate != null)   {   TemplateItem container = new    TemplateItem(dataItem, index);   _itemtemplate.InstantiateIn(container);   Controls.Add(container);   index++;   container.DataBind();   }   }   }   return index;   }  --------------------  CreateChildControls 接受了2个参数,一个是数据源 还有一个是用来判断是否进行数据绑定操作的布尔值.     在这里,我们要反复穿梭于数据源中.在每一次的重复中我们都会创建TemplateItem 对象的实例.   记住这些数据源将被来自Web或来自模板中可以作为数据源提供的数据集的每一个元素.  然后,我调用ITemplate 中的InstantiateIn() 方法,具体说就是模板中的控件用来接受像container这样的TemplateItem对象.     最后DataBind() 对象将会被TemplateItem 对象调用.  注意的是index 只是简单的保持对数据集索引的跟踪.并在CreateChildControls()中返回.     到此我们圆满的创建完毕了一个自定义的控件 .我们会用到WebFrom上,我们会把他跟Employee对象的集合进行绑定.  Employee类如下  ---------------------    public class Employee     {         public Employee(string fname, string lname)         {             _firstname = fname;             _lastname = lname;         }         private string _firstname;         public string FirstName         {             get { return _firstname; }             set { _firstname = value; }         }         private string _lastname;         public string LastName         {             get { return _lastname; }             set { _lastname = value; }         }     }  -------------------     在这里我们定义了2个简单的属性即FirstName LastName ,我们用构造函数对这2个属性进行了初始化.     下面我们打开webform 并添加Register指令声明  -----  <%@ Register   Namespace="BinaryIntellect"   TagPrefix="cc1" %>        --------------  接下来声明MyTemplatedControl 的实例  -------       <cc1:MyTemplatedControl runat="server" ID="control1">         <MyItemTemplate>             <h1>             <%# Eval("FirstName") %>             <%# Eval("LastName") %>             </h1>         </MyItemTemplate>     </cc1:MyTemplatedControl>  -------  注意 <MyItemTemplate> 标签 是因为我们在MyTemplatedControl 控件里创建了MyItemTemplate 属性并且是一个ITemplate类型  在此我们的控件继承了CompositeDataBoundControl类 因此我们可以在我们的模板里使用像Eval() 这样的表达式.  ,而后我们要在Page_Load事件处理里定义模板  ---------------------    protected void Page_Load(object sender, EventArgs e)     {         List<Employee> data = new List<Employee>();         Employee e1 = new Employee("Nancy", "Davalio");         Employee e2 = new Employee("Andrew", "Fuller");         data.Add(e1);         data.Add(e2);         control1.DataSource = data;         control1.DataBind();     }        ----------------------     这里我们创建了Employee对象集合并于控件进行了数据绑定  运行代码我们会看到如下截图          
 
 作者简介:  
 
 | 
 
                     
                    
                 
                    
                
 500){this.resized=true;this.style.width=500;}" border=0>
500){this.resized=true;this.style.width=500;}" border=0> 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号