本文是備份,原文請看我的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>
<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專題實務(文魁出版 / P8187)
.............................................................................................................. 寄信給我 mis2000lab (at) 雅虎.com.台灣 ........
留言列表