MIS2000 Lab. -- ASP.NET学习&分享 / ASP.NET案例精编(清华大学出版社)
您好,我来自台湾。很高兴与各位分享一些成果。希望对您有帮助。出版书籍是「ASP.NET案例精编 / 清华大学出版社」。

[习题]如何触发
GridView 身体里面的「子控件」的事件?#1 (ASP.NET案例精编 / 清华大学出版社 Ch.10/11两章的补充)



這個範例是要補充書本「上集」(ASP.NET專題實務)

Ch.
10~Ch.11 都是講解 GridView的進階應用。




上述兩章的難度偏高(其他入門書很難見到這種內容!),




但您一旦學通了,各種「大型」控制項的運作原理也都會貫通。





另外,您也需要複習一下
.FindControl()方法
,專門用來抓取「大型控制項」身體裡面的  子控制項!






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






我們先來看看這個範例 test_01_error.aspx



(1).  要在
GridView身體裡面,放置新的「子控制項」。



      您必須先把
GridView的欄位,變成「樣版(Template)」


      然後動手加入。



     
這部分是很基礎的操作,如果您不會的話,真的要買書從頭學起了!




     




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



(2). 
完成之後,我們想要這樣做:






     Q :  當使用者點選 GridView身體裡面的「子控制項
(DropDownList)」,


      我們希望能觸發
DropDownList對應的事件、甚至抓到使用者點選了DropDownList哪一個選項....?




您一定覺得很簡單,對吧?






跳到 VB的後置程式碼,您可以發現您無法挑選 "GridView身體裡面的「子控制項」"的事件



怎麼辦?




     








使用 C#的人可能不會有這個困擾。

這涉及 VB的事件會使用到 Handles



C#則是在 HTML畫面原始檔裡面,把方法寫在控制項裡面了。例如:
Onclick="Button1_click"



您最好看看書本「上集」(ASP.NET專題實務)的第三章
Ch.
3-4節




在 Button控制項的
Command那一節,我有詳細說明這件事。



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



(3). 
以VB程式碼為例,我們的HTML設計畫面的原始檔,需修正如下:


01         <asp:gridview autogeneratecolumns="False" datakeynames="id" datasourceid="SqlDataSource1" id="GridView1" runat="server">
02             <columns>
03                 <asp:boundfield datafield="id" headertext="id" insertvisible="False" readonly="True" sortexpression="id">
04                 <asp:templatefield headertext="name" sortexpression="name">
05                     <edititemtemplate>
06                         <asp:textbox id="TextBox1" runat="server" text="<%# Bind("name") %>">
07                     </asp:textbox>
08                     <itemtemplate>
09                         <asp:label id="Label1" runat="server" text="<%# Bind("name") %>">
10  
11                         <asp:dropdownlist autopostback="true" id="DropDownList1" onselectedindexchanged="DropDownList1_SelectedIndexChanged" runat="server">
12                             <asp:listitem selected="True">yes</asp:listitem>
13                             <asp:listitem>No</asp:listitem>
14  
15                         </asp:dropdownlist>
16                         <asp:button id="Button1" onclick="Button1_Click" runat="server" text="Button">
17                     </asp:button>
18                 </asp:label>
19                 <asp:boundfield datafield="student_id" headertext="student_id" sortexpression="student_id">
20                 <asp:boundfield datafield="city" headertext="city" sortexpression="city">
21                 <asp:boundfield datafield="chinese" headertext="chinese" sortexpression="chinese">
22                 <asp:boundfield datafield="math" headertext="math" sortexpression="math">
23             </asp:boundfield>
24         </asp:boundfield>
25  
26  
27         <asp:sqldatasource connectionstring="<%$
ConnectionStrings:testConnectionString %>" id="SqlDataSource1"
runat="server" selectcommand="SELECT * FROM [student_test]">
28     </asp:sqldatasource></asp:boundfield></asp:boundfield></itemtemplate></edititemtemplate></asp:templatefield>
29 </asp:boundfield></columns></asp:gridview>


重點修改如下(這是採用VB語法)
                        <asp:DropDownList ID="DropDownList1"
runat="server" AutoPostBack="true"                            
OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">

                           
<asp:ListItem
Selected="True">yes</asp:ListItem>                         
<asp:ListItem>No</asp:ListItem>
                       
</asp:DropDownList>

                        <asp:Button
ID="Button1" runat="server" Text="Button" OnClick="Button1_Click"
/>






VB的後置程式碼,需修正如下:


01     Protected Sub DropDownList1_SelectedIndexChanged(sender As Object, e As System.EventArgs)
02         Response.Write("DropDownList1_SelectedIndexChanged
03 ")
04     End Sub
05  
06  
07     Protected Sub Button1_Click(sender As Object, e As System.EventArgs)
08         '=======================
09         Dim my_DDL As New DropDownList
10         my_DDL = GridView1.Rows(GridView1.SelectedIndex).FindControl("DropDownList1")
11         '==== 這兩列程式碼會出錯!==========
12  
13         Response.Write("Button1_Click
14 ")
15  
16         If my_DDL.SelectedIndex >= 0 Then
17             Response.Write("OK~~OK~~
18 ")
19         End If
20     End Sub

您可以發現:上面的VB後置程式碼,每一個事件後面的
Handles不見了。


這是為了配合 HTML設計畫面的修改。



使用 C#的朋友會覺得習以為常,但用慣 VB的朋友會不太習慣。



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



最後......執行的成果還是有誤差,不令人滿意.......


當您按下任何一個 Button會出現這樣的錯誤,



簡單的說,
您按下 Button的時候,程式無法判斷您是「按下
GridView的哪一列」??  下面的錯誤訊息講得很清楚。


     



 該怎麼修正呢?



我們打開書本「上集」(ASP.NET專題實務)

Ch.
10~Ch.11 都是講解 GridView的進階應用。




重新複習一下,當使用者按下
「GridView的某一列」時,我們都是怎麼來判斷的呢?



答案有很多.....



[习题]如何触发 GridView 身体里面的「子控件」的事件?#2 范例下载
(ASP.NET案例精编/清华大学出版社 Ch.10/11两章的补充)

http://www.dotblogs.com.tw/mis2000lab/archive/2011/03/11/gridview_inside_web_control_event_02.aspx



[习题]如何触发
GridView 身体里面的「子控件」的事件?#3 改良版

http://www.dotblogs.com.tw/mis2000lab/archive/2011/03/16/gridview_inside_web_control_event_03.aspx

posted on 2011-03-23 16:29  MIS2000 Lab.  阅读(197)  评论(0编辑  收藏  举报


ASP.NET案例精编——适用于VS 2005/2008(配光盘)
 

当当网购买 http://product.dangdang.com/product.aspx?product_id=20583373&ref=search-1-pub