本文是備份,原文請看我的BLOG---- [習題]GridView裡面,樣版(Template)內的控制項,怎麼抓取?使用FindControl就對啦~

http://www.dotblogs.com.tw/mis2000lab/archive/2008/10/29/gridview_template_findcontrol.aspx

 

 

 

強烈建議您看完這一篇文章( [習題] "選取" Gridview的某一列 & 那一列對應資料表的P.K.值)後,才來觀賞本文。 

 

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

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

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

當您讀完本書 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各種變化,這是本書一大特色。相信很多初學者都有興趣,希望對各位有幫助!

 

 

 

 

 

 

 

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

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

 

 

           

.....................................................................................................................................................................................
ASP.NET專題實務ASP.NET專題實務(文魁出版 / P8187)

2008/八月份 天瓏書局排行榜前十名

.............................................................................................................. 寄信給我    mis2000lab (at) 雅虎.com.台灣 ........

arrow
arrow
    全站熱搜

    MIS2000 Lab 發表在 痞客邦 留言(2) 人氣()