自定義Web控件(簡單的Repeater數據綁定)

現在在學習服務器控件開發,感覺有的難度,比WinForm的難的多。

今天自己做了一個簡單的Repeater控件,當然不是很好,像vs2003自己的Repeater有好HeadTempLate  和ItemTempLate 和FootTempLate 三項模板,我自己做的只有一項,那就是 ItemTemp,也只能做簡單的數據綁定,廢話也不多說了,還是請各位網友看看源代碼吧,

 

using System;
using System.Web;
using System.Web.UI;
using System.Collections;

namespace WebControlLib.CH7
{
    
/// <summary>
    
/// 簡單的數據綁定控件
    
/// </summary>

    [PersistChildren(true)]
    
public class SimpleRepeater:Control,INamingContainer
    
{
        
private ITemplate _template = null;
        
private ICollection _datasource = null;

        
public ICollection DataSource
        
{
            
get
            
{
                
return this._datasource;
            }

            
set
            
{
                
this._datasource = value;
            }

        }

        [TemplateContainer(
typeof(RepeaterItem))]
        
public ITemplate ItemTempLate
        
{
            
get
            
{
                
return this._template;
            }

            
set
            
{
                
this._template = value;
            }

        }


        
protected override void AddParsedSubObject(object obj)
        
{
            
base.AddParsedSubObject (obj);
        }


        
protected override void CreateChildControls()
        
{
            
object obj = ViewState["NumData"];
            
this.Controls.Clear();
            
if(obj!=null)
            
{
                
int num = Convert.ToInt32(obj);
                
for(int i=0;i<num;i++)
                
{
                    RepeaterItem pi  
=new RepeaterItem(i,null);
                    _template.InstantiateIn(pi);
                    
this.Controls.Add(pi);
                }

            }

        }


        
protected override void OnDataBinding(EventArgs e)
        
{
            
base.OnDataBinding (e);
            
if(DataSource != null)
            
{
                Controls.Clear();
                ClearChildViewState();
                IEnumerator data 
= DataSource.GetEnumerator();
                
int i =0;
                
while(data.MoveNext())
                
{
                    RepeaterItem item 
= new RepeaterItem(i,data.Current);
                    _template.InstantiateIn(item);
                    
this.Controls.Add(item);
                    i
++;
                }

                ChildControlsCreated 
= true;
                ViewState[
"NumData"]  =i;
                
            }

        }


    }


    
public class RepeaterItem:Control,INamingContainer
    
{
        
private int _index;
        
private object _dataitem;

        
public RepeaterItem(int index, object dataitem)
        
{
            
this._index = index;
            
this._dataitem = dataitem;
        }


        
public int Index
        
{
            
get
            
{
                
return this._index;
            }

        }


        
public object DataItem
        
{
            
get
            
{
                
return this._dataitem;
            }

            
set
            
{
                
this._dataitem =value;
            }

        }

    }

}

 

 

下面是在網頁中課戶端調用的代碼:

 

<%@ Register TagPrefix="ableit" Namespace="WebControlLib.CH4" Assembly="WebControlLib" %>
<%@ Page language="c#" Codebehind="WebImageDemo.aspx.cs" AutoEventWireup="false" Inherits="WebControlDemo.CH4.WebImageDemo" %>
<%@ Register TagPrefix="cc1" Namespace="AbleControlsLib" Assembly="WebControlLib" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    
<HEAD>
        
<title>WebImageDemo</title>
        
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
        
<meta name="CODE_LANGUAGE" Content="C#">
        
<meta name="vs_defaultClientScript" content="JavaScript">
        
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    
</HEAD>
    
<body MS_POSITIONING="GridLayout">
        
<form id="Form1" method="post" runat="server">
            
<cc1:SimpleRepeater id="SimpleRepeater1" runat="server">
                
<ITEMTEMPLATE>
                    
<TABLE borderColor="#ff3333" border="1">
                        
<TR>
                            
<TD><%# Container.DataItem%></TD>
                        
</TR>
                    
</TABLE>
                
</ITEMTEMPLATE>
            
</cc1:SimpleRepeater>
        
</form>
    
</body>
</HTML>

 

下面是服務器代碼:

 

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace WebControlDemo.CH4
{
    
/// <summary>
    
/// WebImageDemo 的摘要說明。
    
/// </summary>

    public class WebImageDemo : System.Web.UI.Page
    
{
        
protected AbleControlsLib.SimpleRepeater SimpleRepeater1;
    
        
private void Page_Load(object sender, System.EventArgs e)
        
{
            
// 在此處放置用戶代碼以初始化頁面
            System.Collections.ArrayList array = new ArrayList();
            array.Add(
"AAA");
            array.Add(
"BBB");
            array.Add(
"CCC");
            array.Add(
"DDD");
            array.Add(
"EEE");
            array.Add(
"FFF");
            array.Add(
"GGG");
            array.Add(
"JJJ");
            array.Add(
"HHH");
            
this.SimpleRepeater1.DataSource = array;
            
this.SimpleRepeater1.DataBind();
        }


        
Web 窗體設計器生成的代碼
    }

}

 

因爲我用的數據源是ICollection,所以綁定時,也只能是ICollection他派生的數據源;

如果大家有什麼意見,請多多指教和留言!!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章