NET 2.0就改用SqlDataSource和GridView了,LinkButtom一樣得放在TemplateField,但GridView沒有ItemCommand event,取而代之的是RowCommand event。
14 protected void Page_Load(object sender, EventArgs e) {
15 if (!IsPostBack)
16 GridView1_DataBind();
17 }
18
19 protected void GridView1_DataBind() {
20 SqlDataSource1.ConnectionString = @"Data Source=.\sqlexpress;Initial Catalog=pubs;Integrated Security=True";
21 SqlDataSource1.SelectCommand = "SELECT TOP 10 " +
22 "fname," +
23 "lname " +
24 "FROM employee";
25 GridView1.DataSourceID = SqlDataSource1.ID;
26 GridView1.DataKeyNames = new string[] { "lname" };
27 GridView1.AutoGenerateColumns = false;
28 }
29
30 protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) {
31 if (e.CommandName == "Select") {
32 int rowIndex = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex;
33 Label1.Text = GridView1.DataKeys[rowIndex].Value.ToString();
34 }
35 }
36</script>
37
38<html xmlns="http://www.w3.org/1999/xhtml">
39<head runat="server">
40 <title>Untitled Page</title>
41</head>
42<body>
43 <form id="form1" runat="server">
44 <div>
45 <asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_RowCommand">
46 <Columns>
47 <asp:TemplateField HeaderText="First Name">
48 <ItemTemplate>
49 <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Select" Text='<%#Eval("fname")%>'></asp:LinkButton>
50 </ItemTemplate>
51 </asp:TemplateField>
52 </Columns>
53 </asp:GridView>
54 </div>
55 <asp:Label ID="Label1" runat="server"></asp:Label>
56 <asp:SqlDataSource ID="SqlDataSource1" runat="server"></asp:SqlDataSource>
57 </form>
58</body>
59</html>
最難理解的應該是32行
int rowIndex = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex;
e.CommandSource傳的是按下去的LinkButton,不過由於傳回的是Object,就得自行轉成LinkButton,但由於我們想知道的是RowIndex,而LinkButton是包含在GridViewRow內,所以透過NamingContainer傳回目前的GridViewRow,但傳回的是Control,所以需在轉成GridViewRow後才能有RowIndex property。