FormView動態加入 ItemTemplate #2 -- 動態產生 ItenTemplate樣版(負責創造 Template的 .InstantiateIn()方法)

摘要:FormView動態加入 ItemTemplate #2 -- 動態產生 ItenTemplate樣版(負責創造 Template的 .InstantiateIn()方法)





 

 

建議您完成上一篇文章之後,再來繼續下去:

 

下面的重點:

1.  動態加入一個 Template。會用到 .InstantiateIn()方法

2. 在樣版裡面的 Web控制項也是動態加入的。所以要搭配的 [事件],EventHandler 也會動態給予。

    VB ----

            Dim Label1 As New Label()
            Label1.ID = "Label1"
            AddHandler Label1.DataBinding, AddressOf Label1_DataBinding

    C# ----

            Label Label1 = new Label();
            Label1.ID = "Label1";
            Label1.DataBinding += new EventHandler(Label1_DataBinding);

 

3. 因為要搭配 HTML畫面的 SqlDataSource,作 DataBinding。

    所以 ItemTemplate樣版裡面的控制項,必須進行 DataBinding

 

 

..............................................................................................................................................................

 

VB

 

'-- 自己宣告 ----
Imports System.Data

 

    '===========================透過類別,動態產生 ItenTemplate樣版 ==(Start) ==
    '==資料來源:
http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.formview.dataitem.aspx

    '-- 動態加入一個 Template for FormView
    Private NotInheritable Class MSDNTemplate
        Implements ITemplate

        '-- 負責創造 Template的 .InstantiateIn()方法
        '-- 資料來源:
http://msdn.microsoft.com/zh-tw/library/system.web.ui.itemplate.instantiatein(v=VS.100).aspx
        '-- 當類別實作時,定義子控制項和樣板所屬的 Control 物件。這些子控制項依次定義在內嵌樣板內。

        Sub InstantiateIn(ByVal container As Control) Implements ITemplate.InstantiateIn
            '================================
            '-- 動態產生 "樣版"裡面的「子控制項」,如:Label。
            '================================
            '-- 因為這些 Label必須搭配 SqlDataSource資料來源,進行 DataBinding,
            '-- 所以必須為這些 Label搭配「DataBinding事件」。

            Dim Label1 As New Label()
            Label1.ID = "Label1"
            AddHandler Label1.DataBinding, AddressOf Label1_DataBinding
            '== 重點!!這個 Label1的 DataBinding事件,就寫在下面。

            Dim lineBreak As LiteralControl = New LiteralControl("<br /><br />")

            Dim Label2 As New Label()
            Label2.ID = "Label2"
            AddHandler Label2.DataBinding, AddressOf Label2_DataBinding
            '== 重點!!這個 Label2的 DataBinding事件,就寫在下面。

            '== 動態加入三個 Label控制項

            container.Controls.Add(Label1)
            container.Controls.Add(lineBreak)
            container.Controls.Add(Label2)

        End Sub


        '**** Label1的 DataBinding事件。****
        Private Sub Label1_DataBinding(ByVal sender As Object, ByVal e As EventArgs)

            Dim id_LabelControl As Label = CType(sender, Label)

            Dim formViewContainer As FormView = CType(id_LabelControl.NamingContainer, FormView)

            Dim rowView As DataRowView = CType(formViewContainer.DataItem, DataRowView)

            id_LabelControl.Text = rowView("id").ToString()
        End Sub


        '**** Label2的 DataBinding事件。****
        Private Sub Label2_DataBinding(ByVal sender As Object, ByVal e As EventArgs)

            Dim title_LabelControl As Label = CType(sender, Label)

            Dim formViewContainer As FormView = CType(title_LabelControl.NamingContainer, FormView)

            Dim rowView As DataRowView = CType(formViewContainer.DataItem, DataRowView)

            title_LabelControl.Text = rowView("title").ToString()
            title_LabelControl.Text &= "<hr />" & rowView("article").ToString()
        End Sub

    End Class
    '=============================透過類別,動態產生 ItenTemplate樣版 ==(End) ==

 

 

..............................................................................................................................................................

C#

 

//-- 自己宣告 ----
using System.Data;

 

    //===========================透過類別,動態產生 ItenTemplate樣版 ==(Start) ==
    //==資料來源:
http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.formview.dataitem.aspx#Y557

    //-- 動態加入一個 Template for FormView

    private sealed class MSDNTemplate : ITemplate
    {
        //-- 負責創造 Template的 .InstantiateIn()方法
        //-- 資料來源:
http://msdn.microsoft.com/zh-tw/library/system.web.ui.itemplate.instantiatein(v=VS.100).aspx
        //-- 當類別實作時,定義子控制項和樣板所屬的 Control 物件。這些子控制項依次定義在內嵌樣板內。

        void ITemplate.InstantiateIn(Control container)
        {
            //================================
            //-- 動態產生 "樣版"裡面的「子控制項」,如:Label。
            //================================
            //-- 因為這些 Label必須搭配 SqlDataSource資料來源,進行 DataBinding,
            //-- 所以必須為這些 Label搭配「DataBinding事件」。

            Label Label1 = new Label();
            Label1.ID = "Label1";
            Label1.DataBinding += new EventHandler(Label1_DataBinding);
            //== 重點!!這個 Label1的 DataBinding事件,就寫在下面。

            LiteralControl lineBreak = new LiteralControl("<br /><br />");

            Label Label2 = new Label();
            Label2.ID = "Label2";
            Label2.DataBinding += new EventHandler(Label2_DataBinding);
            //== 重點!!這個 Label2的 DataBinding事件,就寫在下面。

            // == 動態加入三個 Label控制項

            container.Controls.Add(Label1);
            container.Controls.Add(lineBreak);
            container.Controls.Add(Label2);

        }

        //**** Label1的 DataBinding事件。****
        private void Label1_DataBinding(Object sender, EventArgs e)
        {
            Label id_LabelControl = (Label)sender;

            FormView formViewContainer = (FormView)id_LabelControl.NamingContainer;

            DataRowView rowView = (DataRowView)formViewContainer.DataItem;

            id_LabelControl.Text = rowView["id"].ToString();
        }

        //**** Label2的 DataBinding事件。****
        private void Label2_DataBinding(Object sender, EventArgs e)
        {
            Label title_LabelControl = (Label)sender;

            FormView formViewContainer = (FormView)title_LabelControl.NamingContainer;
            DataRowView rowView = (DataRowView)formViewContainer.DataItem;
 
            title_LabelControl.Text = rowView["title"].ToString();
            title_LabelControl.Text += "<hr />" + rowView["article"].ToString();
        }
    }
    //=============================透過類別,動態產生 ItenTemplate樣版 ==(End) ==

 

 

 

 

http://blog.blueshop.com.tw/uni2tw/archive/2006/10/03/41327.aspx

NamingContainer 使用時機

譬如 GridView裏的TemplateField 放了1個TextBox,1個CheckBox(設定AutoPostBack = "true")
畫面上的GridView假設有5筆資料,當其中一筆的CheckBox的事件CheckedChanged觸發時,可以藉由事件的參數 object sender,找到他是畫面上的哪一列,及該列的其它控制項。

 


http://msdn.microsoft.com/zh-tw/library/system.web.ui.control.namingcontainer(v=VS.100).aspx

[MSDN] Control.NamingContainer 屬性

 

 

 

 

 

 

 

 

 

 

我將思想傳授他人, 他人之所得,亦無損於我之所有;

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson

線上課程,遠距教學 (Web Form 49hr)  https://dotblogs.com.tw/mis2000lab/2016/02/01/aspnet_online_learning_distance_education_VS2015

線上課程,遠距教學 (ASP.NET MVC 75hr)  https://dotblogs.com.tw/mis2000lab/2018/08/14/ASPnet_MVC_Online_Learning_MIS2000Lab

ASP.NET MVC線上課程 第一天 免費看 (5.5小時) 

寫信給我,不要私訊 --  mis2000lab (at) yahoo.com.台灣  或  school (at) mis2000lab.net


ASP.NET遠距教學、線上課程(Web Form + MVC)。 第一天課程, "完整" 試聽。 

................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................  YouTube (ASP.NET) 線上教學影片  https://www.youtube.com/channel/UC6IPPf6tvsNG8zX3u1LddvA/

 

Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download

請看我們的「售後服務」範圍(嚴格認定)

......................................................................................................................................................

...................................................................................................................................................... 

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課

 

ASP.NET MVC 5 線上教學

累積時數約 75小時...... 第一天(5.5小時)完整內容,"免費"讓您評估