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表的数据为列,显示如下:
<%@ 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); }
/// <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方法需要protected或public,使它的继承类能访问的到。 源代码网推荐 源代码网推荐 源代码网推荐 源代码网供稿. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
