[習題]GridView裡面,樣版(Template)內的控制項,怎麼抓取?使用FindControl就對啦~

要在 GridView的樣版裡面,抓住「子控制項」。有兩種作法:
第一,不知道子控制項的ID名稱,要用 .Controls(數字)來撈取
第二,知道子控制項的ID名稱(例如本文的範例),則改用 .FindControl("子控制項的ID名稱")

本範例是給讀者的售後服務,適合放在本書10.4節的後面,最為課後練習。





 

FindControl的用法,對於初學者來說,有一點小小地難度。

底子不夠,會學不好。 

強烈建議您看完這幾篇文章後,才來觀賞本文。

 

================================================================================

 

 

一位很用功的讀者來信詢問了這個問題,

我原本以為很簡單,但作起來,還真的有點不順手。

為了服務讀者,我把這習題公開如下。 

當您讀完本書 10.4節的時候,可以搭配這個習題來玩一下。

 

Q:GridView 1 裡面(樣版 Template),自己加入下拉式選單(DropDownList)

當使用者一點選DropDownList,畫面下方的 GridView 2會隨之連動。

 

 

.....該怎麼作呢?先看看下面執行結果。

點選GridView 1某一列資料後,會出現 DropDownList控制項,點選「文章分類」,底下的 GridView2會隨之連動!

 

 ===========================================================

HTML畫面設計重點:

    設計第一個 GridView 1 + SqlDataSource。然後把某一個欄位轉成「樣版(Template)

    樣版裡面,自己手動拉進 DropDownList與Button。    然後設計這兩個控制項為「看不見(Visibile=false)」

     <div>
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True"
            AutoGenerateColumns="False" DataKeyNames="id"
            DataSourceID="SqlDataSource1" PageSize="5">
            <Columns>
                <asp:CommandField ButtonType="Button" ShowSelectButton="True" />
                <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True"  />
                <asp:BoundField DataField="test_time" HeaderText="test_time"  />
                <asp:TemplateField HeaderText="class">
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("class") %>'></asp:Label>
                        <br />
                        <asp:DropDownList ID="DropDownList1" runat="server" Visible="false">
                            <asp:ListItem>科技</asp:ListItem>
                            <asp:ListItem>政治</asp:ListItem>
                            <asp:ListItem>娛樂</asp:ListItem>
                            <asp:ListItem>教育</asp:ListItem>
                            <asp:ListItem>其他</asp:ListItem>
                        </asp:DropDownList>
                        

                        &nbsp;
                        <asp:Button ID="Button1" runat="server" CommandName="DDL_Submit" Text="Submit" Visible="false"/>                        
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:BoundField DataField="title" HeaderText="title" SortExpression="title">
                    <ItemStyle Font-Bold="True" Font-Size="Medium" />
                </asp:BoundField>
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
                ConnectionString="<%$ 你自己的連線字串DataBase_Connection_String %>"
                SelectCommand="SELECT [id], [test_time], [class], [title] FROM [test]">
        </asp:SqlDataSource>
   
        <br />
        您選取的類別是 --
        <asp:Label ID="Label_YourClass" runat="server" Font-Bold="True" ForeColor="Red"></asp:Label>

    <br />
    <asp:GridView ID="GridView2" runat="server">
    </asp:GridView>

    </div>

 ===========================================================

後置程式碼(VB語法)如下:

'----自己寫的----
Imports System
Imports System.Web.Configuration
Imports System.Data
Imports System.Data.SqlClient
'----自己寫的----

Partial Class test_xxx_yyy
    Inherits System.Web.UI.Page

    Dim u_DDL As DropDownList = Nothing

Protected Sub GridView1_SelectedIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSelectEventArgs) Handles GridView1.SelectedIndexChanging
        '--這些判別式,只是要讓「剛剛點選過的每一列」的下拉式選單, 暫時從畫面消失而已
        If ViewState("Old_RowNo") <> Nothing Then
            GridView1.Rows(ViewState("Old_RowNo")).Cells(3).FindControl("DropDownList1").Visible = False
            GridView1.Rows(ViewState("Old_RowNo")).Cells(3).FindControl("Button1").Visible = False
        Else
            GridView1.Rows(0).Cells(3).FindControl("DropDownList1").Visible = False
            GridView1.Rows(0).Cells(3).FindControl("Button1").Visible = False
        End If

        GridView1.Rows(e.NewSelectedIndex).Cells(3).FindControl("DropDownList1").Visible = True
        GridView1.Rows(e.NewSelectedIndex).Cells(3).FindControl("Button1").Visible = True

        ViewState("Old_RowNo") = e.NewSelectedIndex

End Sub

 

'--下面的程式,很簡單,請看本書第八章,專門解釋 GridView的樣版。 

Protected Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand


        If e.CommandName = "DDL_Submit" Then
            u_DDL = GridView1.Rows(GridView1.SelectedIndex).Cells(3).FindControl("DropDownList1")
            '==重點在這裡。能抓到 GridView樣版裡面的 DropDownList控制項。

            '==如果您不會計算GridView的各個格子(.Cells())的話,請看書的P.10-20與P.10-21這兩頁的圖片解釋的很詳細! 

            Label_YourClass.Text = u_DDL.SelectedValue  '--抓到使用者點選了 DropDownList的哪一個子選項了!

            DbInit()          '==使用者點選裡面的哪一個子選項,就會執行 DbInit()程式,
                                    '==重新作資料繫結(DataBind),讓GridView 2隨之連動。
        End If
End Sub

 

Sub DbInit()
        '----上面已經事先寫好 Imports System.Web.Configuration ----
        '----(資料庫的連線字串)----

        Dim Conn As New SqlConnection("資料庫的連線字串")
        Dim myAdapter As SqlDataAdapter = New SqlDataAdapter("select * from test where class like '%" & u_DDL.SelectedValue & "%' order by id", Conn)
        Dim ds As New DataSet

        Try 
            'Conn.Open()   '---- 不用寫,DataAdapter會自動開啟
            myAdapter.Fill(ds, "test")    '---- 這時候執行SQL指令。取出資料,放進 DataSet。
            GridView2.DataSource = ds
            GridView2.DataBind()

        Catch ex As Exception   '---- 如果程式有錯誤或是例外狀況,將執行這一段
            Response.Write("<b>Error Message----  </b>" + ex.ToString() + "<HR/>")
        Finally
            '---- 不用寫,DataAdapter會自動關閉
            'If (Conn.State = ConnectionState.Open) Then
            '    Conn.Close()
            '    Conn.Dispose()
            'End If

        End Try
End Sub

End Class
 

 

程式本身很簡單,但為了執行的畫面比較美觀

 小弟使用了好幾個 IF判別式,來作檢查。讓 GridView樣版裡面的DropDownList與Button能暫時消失

 這部份我個人比較不滿意,但時間匆促,只能請讀者見諒。

 

 這個範例雖然簡單,卻應用到我書本裡面的各種章節,是一個整合性的範例。 

大部分的用法,都可以參考本書的 10.4節。基本上這個章節你(初學者)讀熟了、作熟了,大概沒啥能困住你了!

 

要在 GridView的樣版裡面,抓住「子控制項」。有兩種作法:

   第一,不知道子控制項的 ID名稱,要用 .Controls(數字)來撈取

   第二,知道子控制項的 ID名稱(例如本文的範例),則改用 .FindControls("子控制項的ID名稱")

如果您不會計算GridView的各個格子(第幾行?第幾列?  .Cells())的話,請看本書的P.10-20與P.10-21這兩頁的圖片,解釋的很詳細! 

最後還是要廣告一下,市面上所有 ASP.NET的書都很少見到,我的書花了五大章(約250頁)專門介紹GridView各種變化,這是本書一大特色。相信很多初學者都有興趣,希望對各位有幫助!

 ASP.NET專題實務,文魁出版(有vb與c#兩種版本)

 

 

 2009/1/6補充抓取UC(使用者控制項 / User Controls)裡面,控制項的值

http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=4276708&SiteID=14

 

 

 

 

 

 

 

 

 

今日值班正妹,日本女優,戶田惠理香(電影版的死亡筆記本第二集,她是女主角)

圖片來源:http://farm2.static.flickr.com/1427/1431236197_4b09dcc936.jpg

 

 

           

 

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

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