本文标签:获得RowIndex ASP.NET
为什么需要在RowCommand event获得RowIndex呢?通常一个Table的PK或FK并不会显示在GridView上,而会设定在DataKeyNames property,然后再RowCommand event根据RowIndex读出该row的PK或FK,所以第一步,必须先能在RowCommand获得RowIndex 。
ASP.NET 1.x DataGrid
在ASP.NET 1.x的DataGrid,若要使用LinkButton,一样得放在TemplateColumn内,且ItemCommand event的e.Item.ItemIndex就可抓到RowIndex 。
当在DataGrid点下FirstName后,会在下方的Label显示LastName,LastName是此例的DataKey 。 - <%@ Import Namespace="System.Data" %>
- <%@ Import Namespace="System.Data.SqlClient" %>
<%@ Page Language="C#" %> "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> /**//* (C) OOMusou 2007 http://oomusou.cnblogs.com Filename : DataGrid_DataKeyField.aspx Compiler : Visual Studio 2005 / C# 2.0 / ASP.NET 2.0 Description : Demo how to get RowIndex in DataGrids LinkButton Release : 06/26/2007 1.0 */ protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) DataGrid1_DataBind(); } protected void DataGrid1_DataBind() { string strSQL = "SELECT TOP 10 " + "fname," + "lname " + "FROM employee"; SqlConnection con = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=pubs;Integrated Security=True"); SqlDataAdapter da = new SqlDataAdapter(strSQL, con); DataSet ds = new DataSet(); try { da.Fill(ds); } catch (Exception err) { Response.Write(err.ToString()); return; } finally { if ((con != null) && (con.State == ConnectionState.Open)) con.Close(); } DataGrid1.DataSource = ds; DataGrid1.DataKeyField = "lname"; DataGrid1.AutoGenerateColumns = false; DataGrid1.DataBind(); } protected void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e) { if (e.CommandName == "Select") Label1.Text = DataGrid1.DataKeys[e.Item.ItemIndex].ToString(); } script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Untitled Pagetitle> head> <body> <form id="form1" runat="server"> <asp:DataGrid ID="DataGrid1" runat="server" OnItemCommand="DataGrid1_ItemCommand"> <Columns> <asp:TemplateColumn HeaderText="First Name"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Select" Text=<%#DataBinder.Eval(Container.DataItem,"fname")%>> asp:LinkButton> ItemTemplate> asp:TemplateColumn> Columns> asp:DataGrid> <asp:Label ID="Label1" runat="server">asp:Label> form> body> html>
只需在ItemCommand event的e.Item.ItemIndex就可以轻松的抓到RowIndex 。
ASP.NET 2.0 GridView
ASP.NET 2.0就改用SqlDataSource和GridView了,LinkButtom一样得放在TemplateField,但GridView没有ItemCommand event,取而代之的是RowCommand event 。 - <%@ Page Language="C#" %>
-
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
- <script runat="server">
- /**//*
- (C) OOMusou 2007 http://oomusou.cnblogs.com
-
- Filename : GridView_RowCommand_RowIndex.aspx
- Compiler : Visual Studio 2005 / C# 2.0 / ASP.NET 2.0
- Description : Demo how to get RowIndex in GridViews LinkButton
- Release : 06/26/2007 1.0
- */
- protected void Page_Load(object sender, EventArgs e) {
- if (!IsPostBack)
- GridView1_DataBind();
- }
-
- protected void GridView1_DataBind() {
- SqlDataSource1.ConnectionString = @"Data Source=.\sqlexpress;Initial
Catalog=pubs;Integrated Security=True"; - SqlDataSource1.SelectCommand = "SELECT TOP 10 " +
- "fname," +
- "lname " +
- "FROM employee";
- GridView1.DataSourceID = SqlDataSource1.ID;
- GridView1.DataKeyNames = new string[] { "lname" };
- GridView1.AutoGenerateColumns = false;
- }
-
- protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) {
- if (e.CommandName == "Select") {
- int rowIndex = ((GridViewRow)((LinkButton)e.CommandSource).NamingContainer).RowIndex;
- Label1.Text = GridView1.DataKeys[rowIndex].Value.ToString();
- }
- }
- script>
-
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head runat="server">
- <title>Untitled Pagetitle>
- head>
- <body>
- <form id="form1" runat="server">
- <div>
- <asp:GridView ID="GridView1" runat="server" OnRowCommand="GridView1_RowCommand">
- <Columns>
- <asp:TemplateField HeaderText="First Name">
- <ItemTemplate>
- <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Select"
Text=<%#Eval("fname")%>>asp:LinkButton> - ItemTemplate>
- asp:TemplateField>
- Columns>
- asp:GridView>
- div>
- <asp:Label ID="Label1" runat="server">asp:Label>
- <asp:SqlDataSource ID="SqlDataSource1" runat="server">asp:SqlDataSource>
- form>
- body>
- html>
CommandSource传的是按下去的LinkButton,不过由于传回的是Object,就得自行转成LinkButton,但由于我们想知道的是RowIndex,而LinkButton是包含在GridViewRow内,所以透过NamingContainer传回目前的 GridViewRow,但传回的是Control,所以需在转成GridViewRow后才能有RowIndex property 。
GridView是DataGrid的继承人,但不少写法和DataGrid并不一样,GridView很多地方比DataGrid更强更好用,但这个例子却发现GridView比DataGrid麻烦些,或许我没找到好最好的方法,若有人有更好的方式,欢迎指正,谢谢 。以上介绍如何在ASP.NET中获得RowIndex 。
|