如何使用動態創建模板列並綁定數據(GridView,Repeater,DataGrid)

很長一段時間中,不管是使用DataGrid還是GridView都是通過拖放的方式。而這兩天有個需求必須使用自定義的GridView,動態創建GridView的Columns,折騰了數小時,終於搞定,下面來說說具體的方法,希望能夠幫助新手,也希望高手指點,畢競我也夠菜的;入正題:

一、來看看在VS2005自帶的幫助文檔中在Repeater使用動態創建的的方法:

要創建動態模板,請創建以後需要時可實例化的模板類。

創建模板類

  1. 創建實現System.Web.UI.ITemplate接口的新類。

  2. 您也可以將值傳遞到類的構造函數,類可以使用該值來確定要創建的模板類型(ItemTemplate、AlternatingItemTemplate等)。

    ListItemType的參數。ListItemType枚舉爲Repeater、DataList和其他控件定義可能的模板類型。

     

  3. 在類中,實現InstantiateIn方法,該方法是ITemplate接口的成員。

    此方法提供將文本實例和控件實例插入指定容器的方法。

  4. 在InstantiateIn方法中,爲模板項創建控件,設置其屬性,然後將它們添加到父級的Controls集合。

    您可以通過傳遞到InstantiateIn方法的引用訪問父控件。

    Literal控件或LiteralControl控件的控件,設置它們的Text屬性,然後向父集合添加這些控件。

     

    下面的代碼示例闡釋完整的模板類,該類顯示某些靜態文本(“Itemnumber:”)和計數器。計數器是名爲itemcount的靜態值(在VisualBasic中爲共享值),在每次創建新項時都會遞增。該類定義一個接受ListItemType枚舉值以指示所創建模板類型的顯式構造函數。根據所創建的模板類型,代碼創建不同類型的控件並將其添加到父控件的Controls集合。最終結果是一個HTML表,其中的交替項模板具有不同的背景色。

    publicclassMyTemplate:ITemplate
    ...{
    staticintitemcount=0;
    ListItemTypetemplateType;

    publicMyTemplate(ListItemTypetype)
    ...{
    templateType=type;
    }

    publicvoidInstantiateIn(System.Web.UI.Controlcontainer)
    ...{
    Literallc=newLiteral();
    switch(templateType)
    ...{
    caseListItemType.Header:
    lc.Text="<TABLEborder=1><TR><TH>Items</TH></TR>";
    break;
    caseListItemType.Item:
    lc.Text="<TR><TD>Itemnumber:" itemcount.ToString()
    "</TD></TR>";
    break;
    caseListItemType.AlternatingItem:
    lc.Text="<TR><TDbgcolor=lightblue>Itemnumber:"
    itemcount.ToString() "</TD></TR>";
    break;
    caseListItemType.Footer:
    lc.Text="</TABLE>";
    break;
    }
    container.Controls.Add(lc);
    itemcount =1;
    }
    }

     

使用動態模板有了可用的動態模板,就可以在代碼中將其實例化了。

 

創建動態模板
  1. 創建動態模板的實例,假如合適的話,將一個項類型值傳遞給它。

  2. 將該實例分配給模板化控件的模板屬性之一,如ItemTemplate、AlternatingItemTemplate和HeaderTemplate屬性。

    下面的代碼示例演示如何與Repeater控件一起使用動態模板。在此示例中,在加載頁時,而且是在控件綁定到數據源之前,將模板實例化。

    privatevoidPage_Load(objectsender,System.EventArgse)
    ...{
    SqlConnectionconn=
    newSqlConnection(ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString);

    SqlDataAdaptersqlDataAdapter1;
    DataSetdsCategories1;

    sqlDataAdapter1=newSqlDataAdapter("SELECTCategoryID,CategoryNameFROMCategories",conn);
    dsCategories1=newDataSet();

    Repeater1.HeaderTemplate=newMyTemplate(ListItemType.Header);
    Repeater1.ItemTemplate=newMyTemplate(ListItemType.Item);
    Repeater1.AlternatingItemTemplate=
    newMyTemplate(ListItemType.AlternatingItem);
    Repeater1.FooterTemplate=newMyTemplate(ListItemType.Footer);
    sqlDataAdapter1.Fill(dsCategories1,"Categories");
    Repeater1.DataSource=dsCategories1.Tables["Categories"];
    Repeater1.DataBind();
    }

     

向模板添加數據綁定

根據創建類的方法,可以用多種方法訪問模板類中的數據。一種方法是頁框架自行實現數據綁定-當您向模板添加控件時,也會爲這些控件的DataBinding事件添加處理程序。在創建了模板項及其所有控件後,會引發此事件,這樣您就有機會獲取數據並在控件中使用數據。

添加數據綁定事件處理程序
  • 在動態模板中創建控件後,添加對控件的DataBinding事件的事件處理程序的引用。(接下來您將創建事件處理程序)。

    下面的代碼示例演示了模板類的一部分,該部分闡釋瞭如何將新創建的控件綁定到名爲TemplateControl_DataBinding的方法:

     

    caseListItemType.Item:

    lc.Text="<TR><TD>";
    lc.DataBinding =newEventHandler(TemplateControl_DataBinding);
    break;

    在上例中,您添加到文本控件的Text屬性的文本不同於前一示例。該示例只包含了項模板的錶行和單元格的開頭。您將在數據綁定事件處理程序中填寫單元格和行。

下一步是創建事件處理程序,在控件處於數據綁定狀態時將調用該事件處理程序。

爲DataBinding事件創建處理程序
  1. 創建屬於模板類的方法,它還是該類的其他方法(如InstantiateIn)的對等方法。處理程序的名稱必須與早期綁定事件時使用的名稱相匹配。該方法應該具有以下簽名:

    privatevoidTemplateControl_DataBinding(objectsender,
    System.EventArgse)

     

  2. 通過執行以下操作獲取對包含數據的DataItem對象的引用:

    1. 獲取對模板項的引用。創建變量來保存該引用,然後將從控件的NamingContainer屬性獲取的值分配給它。

    2. 使用該引用來獲取命名容器的(模板項的)DataItem屬性。

    3. 從DataItem對象提取單個數據元素(例如數據列),並使用它來設置您要綁定的控件的屬性。

      下面的代碼示例闡釋在動態模板內執行數據綁定的一種方式。它演示了在Repeater控件的模板中創建的Literal控件的完整數據綁定事件處理程序。

      privatevoidTemplateControl_DataBinding(objectsender,
      System.EventArgse)
      ...{

      Literallc;

      lc=(Literal)sender;
      RepeaterItemcontainer=(RepeaterItem)lc.NamingContainer;
      lc.Text =DataBinder.Eval(container.DataItem,"CategoryName");
      lc.Text ="</TD></TR>";
      }

       

      創建模板類publicclassGaugeValueTemplate:ITemplate
      ...{
      ITemplate成員#regionITemplate成員

      publicvoidInstantiateIn(Controlcontainer)
      ...{
      LinkButtonlbGaugeMakeValue=newLinkButton();
      lbGaugeMakeValue.ID="LB_GaugeMakeValue";
      lbGaugeMakeValue.DataBinding =newEventHandler(lbGaugeMakeValue_DataBinding);
      lbGaugeMakeValue.CommandName="GaugeMakeValue";

      container.Controls.Add(lbGaugeMakeValue);
      }

      voidlbGaugeMakeValue_DataBinding(objectsender,EventArgse)
      ...{
      LinkButtonlbGaugeMakeValue=(LinkButton)sender;
      GridViewRowcontainer=(GridViewRow)lbGaugeMakeValue.NamingContainer;

      //綁定GaugeMakeValue字段的值
      lbGaugeMakeValue.Text=DataBinder.Eval(container.DataItem,"GaugeMakeValue").ToString();
      }

      #endregion
      }使用模板   TemplateFieldGaugeMakeValueColumn=newTemplateField();
      GaugeMakeValueColumn.HeaderText="指標制定值";
      GaugeMakeValueColumn.ItemTemplate=newGaugeValueTemplate();從這裏可以看出GridView與Repeater控件中的區別在於:

       

      Repeater:RepeaerItemcontainer=(RepeaterItem)lc.NamingContainer;
      lc.Text =DataBinder.Eval(container.DataItem,"CategoryName");

       

      GridView:GridViewRowcontainer=(GridViewRow)lbGaugeMakeValue.NamingContainer;

      //綁定GaugeMakeValue字段的值
      lbGaugeMakeValue.Text=DataBinder.Eval(container.DataItem,"GaugeMakeValue").ToString();

       

      三、關於DataGrid的方法,可參見http://www.cnblogs.com/lovecherry/archive/2005/03/25/125526.html

      備註:

      作者:sweet_chenqiang

      本文引用自http://blog.csdn

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