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

在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)         使用DataGrid的ItemCreated设置值,而前台的单元格可以是绑定列或者模板列(包括空模板);

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

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

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

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

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

下面是WebFormPaging.aspx文件代码,

<%@ Page language="c#" Codebehind="WebFormPaging.aspx.cs" AutoEventWireup="false" Inherits="AspnetPaging.WebForm1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//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);
		}
		
		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方法需要protected或public,使它的继承类能访问的到。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值