GridView的 RowDataBound與 RowCreated事件 #3,(PlaceHolder裡面)動態產生「編輯」、「刪除」按鈕卻不會動?

摘要:GridView的 RowDataBound與 RowCreated事件 #2,(PlaceHolder裡面)動態產生「編輯」、「刪除」按鈕卻不會動?




 

 

 

之前,已經有介紹過幾篇文章

讓大家練習 GridView的事件  -- RowDataBound與 RowCreated事件 有何差異??

 

詳見:http://www.dotblogs.com.tw/mis2000lab/Tags/RowCreated/default.aspx

 

以執行順序來講:

      RowCreated事件「早於」RowDataBound事件

 

 

 

MSDN論壇上,這個範例更棒。

值得推薦給初學者練習。

 

很適合放在書本「上集」(ASP.NET專題實務)

                      第十一章,如果您做過這個範例,那麼「大腸包小腸」的範例就會更好上手了。

因為觀念已經通囉!

 

 

1.  簡單地說,在HTML畫面上,設計 GridView + SqlDataSource(產生新增、刪除、修改的SQL指令)

2.  GridView「不」產生編輯、刪除按鈕,改為設定樣版(Template)

      並且在裡面加入 PlaceHolder控制項

 

因為我們要「動態」加入編輯、刪除按鈕,到 PlaceHolder控制項裡面。

        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            AutoGenerateColumns="False" DataKeyNames="id" 
            DataSourceID="SqlDataSource1" onrowdatabound="GridView1_RowDataBound" 
            AutoGenerateEditButton="True">
            <Columns>
 
                <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" 
                    ReadOnly="True" SortExpression="id" />
                <asp:TemplateField HeaderText="欄位B" SortExpression="欄位B">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("欄位B") %>'></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("欄位B") %>'></asp:Label>
                        <asp:PlaceHolder ID="PlaceHolder1" runat="server">
                                        註解:這裡要「動態」加入  GridView編輯、刪除的按鈕。
                        </asp:PlaceHolder>

                        <asp:PlaceHolder ID="PlaceHolder2" runat="server">
                            <asp:Button ID="Button2" runat="server" CommandName="Edit" Text="Button_Edit_可成功運作" />
                        </asp:PlaceHolder>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="欄位C" HeaderText="欄位C" SortExpression="欄位C" />
            </Columns>
        </asp:GridView>

        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ......  />

 

問題來了,此時寫在 RowDataBound事件裡面。

自己設計的 GridView編輯、刪除按鈕,的確加入了。

按下去卻不會動作......為什麼呢?

 

改為 RowCreated事件,便能成功!

 

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {    //註解:以下程式,原封不動放到 RowCreated事件就會成功。
 
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            
            if (e.Row.RowState != DataControlRowState.Edit)
            {
                PlaceHolder ph = (PlaceHolder)e.Row.FindControl("PlaceHolder1");
 
                Button b1 = new Button();
                b1.ID = "Button_Edit_1";
                b1.CommandName = "Edit";   
                b1.Text = "動態加入「編輯」按鈕";
 
                ph.Controls.Add(b1);
             }
        }
 
    }

 

這個範例真的太棒了,我上週也拿這個範例在課堂上解說。

除了自己作一個學習的記錄之外,希望也分享給大家。

 

 

MSDN網站的解說是最好的參考資料。

 

GridView各種事件 -- http://msdn.microsoft.com/zh-tw/library/hf8xwy0t.aspx

 

RowDataBound -- 資料列繫結至 GridView 控制項中的資料時發生。PostBack以後不會執行

RowCreated -- 建立 GridView 控制項中的資料列時發生。

 

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

Allen Kuo文章裡面提到:
 
    如果程式寫在RowDataBound與 RowCreated事件這兩處都可以, 是不是沒差別呢?
 
    其實還是有差別的, 若網頁第一次載入, Repeater (或GridView)會有 DataBinding 事件, 
    但若按了網頁上的 Button 導致 postback 時, 其實 Repeater(或GridView)不會觸發 DataBinding 事件, 讓我們來寫程式印證一下,......

 

 

 

 

 

 

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

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