[GridView]動態加入CheckBox控制項,卻抓不到? (RowDataBound與RowCreated事件的差異)

ASP.NET 4.5專題實務(I)--入門實戰篇(松崗出版)

第十一章送的範例, GridView RowDataBound事件的七個小範例

 


 

 

 

 

讀者來信詢問,

想要做的功能,圖片上方有講:

第一,在Gridview樣板裡面,按下「編輯」之後,這一列動態加入 CheckBox控制項

第二,User勾選 CheckBox的,可以抓的到

 

      

 

 

寫在GridView  RowDataBound事件裡面

           (RowUpdating事件底下有一段程式,我註解掉了,那段可運作,可抓到)

 

程式碼如下:

(注意!GridView又是「隔列換色(Alternating)」、又要進入「編輯(Edit)」模式,這裡的程式有點怪!)

 

===  C#   =================================================================================

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {

        //重點!!改用 RowCreated事件就成功了

        if (e.Row.RowType == DataControlRowType.DataRow)        {
            //***下列程式,請參閱上集Ch.11 範例GridView_RowDataBound_6_CaseStudy.aspx。***(start)
            if (e.Row.RowState == DataControlRowState.Edit ||
                e.Row.RowState == (DataControlRowState.Edit | DataControlRowState.Alternate))   //**注意這裡!!or 的用法不同,分別是「||」與「|」
            {
                CheckBox CB = new CheckBox();
                CB.ID = "DynaAdd_CB1";
                CB.Text = "請選我";
 
                e.Row.Cells[2].Controls.Add(CB);
                //Response.Write("<h3>" + CB.UniqueID + "</h3>");          //測試用
            }
            //*********************************************************************(end)
        }
    }
 
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {   //*** 按下「更新」按鈕。 ***
        CheckBox CB = (CheckBox)GridView1.Rows[e.RowIndex].FindControl("DynaAdd_CB1");
        Response.Write("<h3>" + CB.Checked.ToString() + "</h3>");
        Response.End(); //抓不到,因為PostBack的緣故。
 
 
        //*** 另一種作法(可抓到值)**************************************        //測試用
        //Response.Write("<h3>" + (e.RowIndex + 2).ToString() + "</h3>");
        //Response.End();
 
        //if ((e.RowIndex + 2) < 10)   {
        //    Response.Write("<h3>" + Request["GridView1$ctl0" + (e.RowIndex + 2).ToString() + "$DynaAdd_CB1"] + "</h3>");
        //    //有勾選的話,就會出現「on」字樣
        //}
        //else   {
        //    Response.Write("<h3>" + Request["GridView1$ctl" + (e.RowIndex + 2).ToString() + "$DynaAdd_CB1"] + "</h3>");
        //    //有勾選的話,就會出現「on」字樣
        //}               
        //Response.End();
    }

 

===  VB 語法  =================================================================================

    Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound

        '重點!!改用 RowCreated事件就成功了

 
        If e.Row.RowType = DataControlRowType.DataRow Then
            '*** 下列程式,請參閱上集Ch.11 範例GridView_RowDataBound_6_CaseStudy.aspx。***(start)
            '*** 重點!既是「偶數列(Alternate)」、又進入編輯模式。
            If e.Row.RowState = DataControlRowState.Edit Or
                                 (e.Row.RowState = (DataControlRowState.Edit Or DataControlRowState.Alternate)) Then
                Dim CB As CheckBox = New CheckBox()
                CB.ID = "DynaAdd_CB1"
                CB.Text = "請選我"
 
                e.Row.Cells(2).Controls.Add(CB)
                ' Response.Write("<h3>" & CB.UniqueID & "</h3>")      ' 測試用
            End If
        End If
        '*********************************************************************(end)
    End Sub
 
    Protected Sub GridView1_RowUpdating(sender As Object, e As GridViewUpdateEventArgs) Handles GridView1.RowUpdating
        '*** 按下「更新」按鈕。 ***
        Dim CB As CheckBox = GridView1.Rows(e.RowIndex).FindControl("DynaAdd_CB1")
        Response.Write("<h3>" & CB.Checked.ToString() & "</h3>")
        Response.End()   ' 抓不到,因為PostBack的緣故。
 
        ''*** 另一種作法(可抓到值)**************************************        ' ''測試用
        'Response.Write("<h3>" & (e.RowIndex + 2).ToString() & "</h3>")
        'Response.End();
 
        'If ((e.RowIndex + 2) < 10) Then
        '    Response.Write("<h3>" & Request("GridView1$ctl0" & (e.RowIndex + 2).ToString() & "$DynaAdd_CB1") & "</h3>")
        '    '有勾選的話,就會出現「on」字樣
        'Else
        '    Response.Write("<h3>" & Request("GridView1$ctl" & (e.RowIndex + 2).ToString() & "$DynaAdd_CB1") & "</h3>")
        '    '有勾選的話,就會出現「on」字樣        '       
        'End If
        'Response.End()
    End Sub

 

 

執行時出現錯誤「並未將物件參考設定為物件的執行個體。 」

簡單的說,抓不到這個「動態加入的CheckBox控制項」

 

想想看,改成寫在GridView  RowCreated事件裡面就會成功。

為什麼?

 

請看我的書本上集

ASP.NET 專題實務 (I) --入門實戰篇(松崗出版)

第十一章送的範例,  GridView RowDataBound事件的七個小範例

 

 

我第一次其實也愣住了,

幸好有一位前輩出手才讓我醒過來

而且也更認識  RowDataBound與RowCreated事件 兩者的差異

 

答案在這裡有講

http://www.allenkuo.com/EBook5/view.aspx?a=1&TreeNodeID=82&id=1373

 

 

 

 

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

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----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小時)完整內容,"免費"讓您評估