asp.net中显示DataGrid控件列序号的几种方法

asp.net中显示DataGrid控件列序号的几种方法

作者:郑佐 2004-9-10

aps.net中多数据绑定的控件很多,论功能来说,应该属DataGrid最为齐全,但它没有提供现成的显示记录序号的功能,不过我们可以通过它所带的一些参数来间接得到序号,下面来看看怎样得到和显示序号值计算方式如下:

(1)在后台

DataGrid.CurrentPageIndex * DataGrid.PageSize + e.Item.ItemIndex + 1

(2)在前台

DataGrid1.CurrentPageIndex * DataGrid1.PageSize + Container.ItemIndex + 1

说明:

e表示System.Web.UI.WebControls.DataGridItemEventArgs参数类的实例;

DataGrid1这里表示前台的一个实例;

DataGrid.CurrentPageIndex:获取或设置当前显示页的索引;

DataGrid.PageSize :获取或设置要在 DataGrid 控件的单页上显示的项数。

 

下面我使用了4种方法来在前台显示序号,不过都是围绕上面的计算式展开。

(1)         使用DataGridItemCreated设置值,而前台的单元格可以是绑定列或者模板列(包括空模板)

(2)         使用DataGridItemDataBound设置值,而前台的单元格可以是绑定列或者模板列(包括空模板)

(3)         在前台直接绑定计算表达式;

(4)         在后台类中编写方法计算表达式由前台页面类继承调用。

备注:在数据库中获取数据时设置额外的序号列这里不做讨论,我认为这是最糟糕的实现方法。

下面以获取Northwind数据库的Customers表的数据为列,显示如下:

下面是WebFormPaging.aspx文件代码,

<%@ Page language="c#" Codebehind="WebFormPaging.aspx.cs" AutoEventWireup="false" Inherits="AspnetPaging.WebForm1" %>

<!DOCTYPE HTML PUBLIC "-//W 3C //DTD HTML 4.0 Transitional//EN" >

<HTML>

         <HEAD>

                   <title>WebForm1</title>

                   <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">

                   <meta content="C#" name="CODE_LANGUAGE">

                   <meta content="JavaScript" name="vs_defaultClientScript">

                   <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">

         </HEAD>

         <body>

                   <form id="Form1" method="post" runat="server">

                            <TABLE id="Table1" cellSpacing="1" cellPadding="1" width="400" align="center" border="1">

                                     <TR>

                                               <TD><asp:datagrid id="DataGrid1" runat="server" AutoGenerateColumns="False" Width="100%" AllowPaging="True">

                                                                 <Columns>

                                                                           <asp:BoundColumn HeaderText="序号1"></asp:BoundColumn>

                                                                           <asp:TemplateColumn HeaderText="序号2"></asp:TemplateColumn>

                                                                           <asp:TemplateColumn HeaderText="序号3">

                                                                                    <ItemTemplate>

                                                                                             <asp:Label ID="itemIndex" runat="server"></asp:Label>

                                                                                    </ItemTemplate>

                                                                           </asp:TemplateColumn>

                                                                           <asp:TemplateColumn HeaderText="序号4">

                                                                                    <ItemTemplate>

                                                                                             <%# (DataGrid1.CurrentPageIndex * DataGrid1.PageSize + Container.ItemIndex + 1) %>

                                                                                    </ItemTemplate>

                                                                           </asp:TemplateColumn>

                                                                           <asp:TemplateColumn HeaderText="序号5">

                                                                                    <ItemTemplate>

                                                                                             <%# GetRecordIndex( Container.ItemIndex ) %>

                                                                                    </ItemTemplate>

                                                                           </asp:TemplateColumn>

                                                                           <asp:BoundColumn DataField="CustomerID" HeaderText="CustomerID"></asp:BoundColumn>

                                                                 </Columns>

                                                                 <PagerStyle Mode="NumericPages"></PagerStyle>

                                                        </asp:datagrid></TD>

                                     </TR>

                                     <TR>

                                               <TD></TD>

                                     </TR>

                                     <TR>

                                               <TD></TD>

                                     </TR>

                            </TABLE>

                   </form>

         </body>

</HTML>

 

后台WebFormPaging.aspx.cs代码如下:

using System;

using System.Collections;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Web;

using System.Web.SessionState;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.HtmlControls;

 

namespace AspnetPaging

{

     public class WebForm1 : System.Web.UI.Page

     {

         private int recordCount = 0;

 

         protected System.Web.UI.WebControls.DataGrid DataGrid1;

    

         private void Page_Load(object sender, System.EventArgs e)

         {

              if(!Page.IsPostBack)

              {

                   DataGridDataBind();

              }

         }

 

         //绑定数据

         private void DataGridDataBind()

         {

              DataSet ds = DataAccess.GetCustomersData();

              this.DataGrid1.DataSource = ds;

              this.DataGrid1.DataBind();

         }

 

        

 

         #region Web 窗体设计器生成的代码

         override protected void OnInit(EventArgs e)

         {

              InitializeComponent();

              base.OnInit(e);

         }

        

         /// <summary>

         /// 设计器支持所需的方法 - 不要使用代码编辑器修改

         /// 此方法的内容。

         /// </summary>

         private void InitializeComponent()

         {   

              this.DataGrid1.ItemCreated += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemCreated);

              this.DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.DataGrid1_PageIndexChanged);

              this.DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid1_ItemDataBound);

              this.Load += new System.EventHandler(this.Page_Load);

 

         }

         #endregion

 

         //翻页

         private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)

         {

              DataGrid1.CurrentPageIndex = e.NewPageIndex;

              DataGridDataBind();

         }

         //获取当前项

         protected int GetRecordIndex(int itemIndex)

         {

              return (DataGrid1.CurrentPageIndex * DataGrid1.PageSize + itemIndex + 1);

         }

                   private void DataGrid1_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)

         {

              DataGrid dg = (DataGrid)sender;

              if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)

              {

                   e.Item.Cells[0].Text = (dg.CurrentPageIndex * dg.PageSize + e.Item.ItemIndex + 1).ToString();

                   e.Item.Cells[1].Text = (dg.CurrentPageIndex * dg.PageSize + e.Item.ItemIndex + 1).ToString();

              }

         }

 

         private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)

         {

              DataGrid dg = (DataGrid)sender;

              if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)

              {

                   ((Label)e.Item.FindControl("itemIndex")).Text = (dg.CurrentPageIndex * dg.PageSize + e.Item.ItemIndex + 1).ToString();

              }

         }

     }

}

 

数据层代码如下:

using System;

using System.Data;

using System.Data.SqlClient;

using System.Configuration;

 

namespace AspnetPaging

{

     public class DataAccess

     {

         private static string connString = ConfigurationSettings.AppSettings["ConnString"];

         private DataAccess()

         {

             

          }

 

         public static DataSet GetCustomersData()

         {

              SqlConnection conn = new SqlConnection(connString);

              SqlCommand comm = new SqlCommand("GetCustomers",conn);

              comm.CommandType = CommandType.StoredProcedure;

              SqlDataAdapter dataAdapter = new SqlDataAdapter(comm);

              DataSet ds = new DataSet();

              dataAdapter.Fill(ds);

              return ds;

         }

     }

}

 

总结,上面的四种方法前两种其实处理起来是一样的,只是处理的时间不同而已;对于第三种我认为最简单,直接在前台页面绑定,不需要额外的辅助;对于第四种的方法绑定到前台我认为最为灵活,需要注意的是GetRecordIndex方法需要protectedpublic,使它的继承类能访问的到。

 

你可能感兴趣的:(datagrid,object,Microsoft,asp.net,asp,dataset)