初用DataGrid控件,想实现点击表头来对数据进行双向排序,费了老半天工夫才摸索出如下的东东来,请看效果图:
DataGrid设置如下:
<asp:DataGrid id="faggruppeGrid" runat="server" BorderColor="Black" BorderWidth="1px" CellPadding="3"
Width="300px" HeaderStyle-BackColor="#7f9db9" HorizontalAlign="Center" AutoGenerateColumns="False"
AllowSorting="True">
<HeaderStyle BackColor="#7F9DB9"></HeaderStyle>
<Columns>
<!-- 第一列 -->
<asp:TemplateColumn>
<HeaderTemplate>
<asp:LinkButton id="lbFag" runat="server" CommandName="sort" CommandArgument="Fag" CausesValidation="False">Fag</asp:LinkButton>
<asp:Image Runat="server" ID="ImgFag" ImageUrl="../images/Up.gif" Visible="False" /> <!--箭头图标-->
</HeaderTemplate>
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Fag") %>' ID="Label1"/>
</ItemTemplate>
</asp:TemplateColumn>
<!-- 第二列 -->
<asp:TemplateColumn>
<HeaderTemplate>
<asp:LinkButton id="lbNavn" runat="server" CommandName="sort" CommandArgument="Navn" CausesValidation="False">Navn</asp:LinkButton>
<asp:Image Runat="server" ID="ImgNavn" ImageUrl="../images/Up.gif" Visible="False" />
</HeaderTemplate>
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Navn") %>' ID="Label2"/>
</ItemTemplate>
</asp:TemplateColumn>
<!-- 第三列 -->
<asp:HyperLinkColumn DataNavigateUrlField="Fag" DataNavigateUrlFormatString="JavaScript:ReturnFagnummer('{0}');" Text="Indsæt" />
</Columns>
</asp:DataGrid>
Width="300px" HeaderStyle-BackColor="#7f9db9" HorizontalAlign="Center" AutoGenerateColumns="False"
AllowSorting="True">
<HeaderStyle BackColor="#7F9DB9"></HeaderStyle>
<Columns>
<!-- 第一列 -->
<asp:TemplateColumn>
<HeaderTemplate>
<asp:LinkButton id="lbFag" runat="server" CommandName="sort" CommandArgument="Fag" CausesValidation="False">Fag</asp:LinkButton>
<asp:Image Runat="server" ID="ImgFag" ImageUrl="../images/Up.gif" Visible="False" /> <!--箭头图标-->
</HeaderTemplate>
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Fag") %>' ID="Label1"/>
</ItemTemplate>
</asp:TemplateColumn>
<!-- 第二列 -->
<asp:TemplateColumn>
<HeaderTemplate>
<asp:LinkButton id="lbNavn" runat="server" CommandName="sort" CommandArgument="Navn" CausesValidation="False">Navn</asp:LinkButton>
<asp:Image Runat="server" ID="ImgNavn" ImageUrl="../images/Up.gif" Visible="False" />
</HeaderTemplate>
<ItemTemplate>
<asp:Label runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Navn") %>' ID="Label2"/>
</ItemTemplate>
</asp:TemplateColumn>
<!-- 第三列 -->
<asp:HyperLinkColumn DataNavigateUrlField="Fag" DataNavigateUrlFormatString="JavaScript:ReturnFagnummer('{0}');" Text="Indsæt" />
</Columns>
</asp:DataGrid>
后台处理代码:
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;
using Pensam.Praesentation.BMSWIService;
using Pensam.GenNS;
using Microsoft.ApplicationBlocks.ExceptionManagement;
namespace Pensam.Praesentation.Medarbejder
{
/// <summary>
/// Summary description for FaggruppeListe.
/// </summary>
public class FaggruppeListe : BaseWebPage
{
#region member variables
protected System.Web.UI.WebControls.DataGrid faggruppeGrid;
protected System.Web.UI.WebControls.Image ImgArrow = null;
private DataTable dt = null;
#endregion
private void Page_Load(object sender, System.EventArgs e)
{
VisFagGrps();
if(!this.IsPostBack) BindGrid();
//if(this.IsPostBack) Response.Write("post back");
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.faggruppeGrid.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.faggruppeGrid_SortCommand);
this.faggruppeGrid.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.faggruppeGrid_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
#region private functions
//生成绑定数据
private void VisFagGrps()
{
/*
using(PSLog logger = new PSLog())
{
try
{
if(this.ServiceDelegate == null) return;
ArrayList list1 = new ArrayList(this.ServiceDelegate.GetFaggruppeListe());
if(list1 == null)
{
this.VisErrorMessage("Get professional category list failed.");
}
}
catch(Exception ex)
{
VisErrorMessage(ex.Message);
ExceptionManager.Publish(ex);
}
}
*/
dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("Fag", typeof(string)));
dt.Columns.Add(new DataColumn("Navn", typeof(string)));
dr = dt.NewRow();
dr["Fag"] = "Fag01000001";
dr["Navn"] = "Fag0101";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag01000002";
dr["Navn"] = "Fag0102";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag01000003";
dr["Navn"] = "Fag0103";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag02000001";
dr["Navn"] = "Fag0201";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag02000002";
dr["Navn"] = "Fag0202";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag02000003";
dr["Navn"] = "Fag0203";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag03000001";
dr["Navn"] = "Fag0301";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag03000002";
dr["Navn"] = "Fag0302";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag03000003";
dr["Navn"] = "Fag0303";
dt.Rows.Add(dr);
}
private void faggruppeGrid_SortCommand(Object sender, DataGridSortCommandEventArgs e)
{
System.Web.UI.Control control = ((DataGridItem)e.CommandSource).FindControl("ImgArrow");
//Response.Write(control.ToString());
ImgArrow = (System.Web.UI.WebControls.Image)control;
string SortField = (string)e.SortExpression;
string oldSortParam = faggruppeGrid.Attributes["SortExpression"];
if(oldSortParam.StartsWith(SortField))
{
//order by the same column.
if(oldSortParam.EndsWith("ASC"))
{
oldSortParam = oldSortParam.Replace("ASC","DESC");
//ImgArrow.ImageUrl = "../Images/Up.gif"; //实践证明在此设置图像行不通,需在ItemDataBound事件中实现。
}
else
{
oldSortParam = oldSortParam.Replace("DESC","ASC");
//ImgArrow.ImageUrl = "../Images/Up.gif"; //实践证明在此设置图像行不通,需在ItemDataBound事件中实现。
}
}
else
{
oldSortParam = SortField + " ASC";
}
faggruppeGrid.Attributes["SortExpression"] = oldSortParam;
BindGrid();
}
//绑定数据
private void BindGrid()
{
//设置初始排序字段
if(faggruppeGrid.Attributes["SortExpression"] == null)
faggruppeGrid.Attributes["SortExpression"] = "Fag ASC";
DataView dv = dt.DefaultView;
//按指定的排序字段排序
dv.Sort = faggruppeGrid.Attributes["SortExpression"];
faggruppeGrid.DataSource = dt;
faggruppeGrid.DataBind();
}
private void faggruppeGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType != ListItemType.Header) return;
//以下获取排序表达式
if(faggruppeGrid.Attributes["SortExpression"]==null) return;
string sortExpression = faggruppeGrid.Attributes["SortExpression"];
string[] orderParams = sortExpression.Split(' ');
//获取Image对象
System.Web.UI.Control control = (e.Item).FindControl("Img" + orderParams[0]);
if(control == null) return;
ImgArrow = (System.Web.UI.WebControls.Image)control;
ImgArrow.Visible = true;
//设置图像Url
if(sortExpression.EndsWith("ASC"))
ImgArrow.ImageUrl = "../Images/Up.gif";
else
ImgArrow.ImageUrl = "../Images/Down.gif";
}
#endregion
}
}
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;
using Pensam.Praesentation.BMSWIService;
using Pensam.GenNS;
using Microsoft.ApplicationBlocks.ExceptionManagement;
namespace Pensam.Praesentation.Medarbejder
{
/// <summary>
/// Summary description for FaggruppeListe.
/// </summary>
public class FaggruppeListe : BaseWebPage
{
#region member variables
protected System.Web.UI.WebControls.DataGrid faggruppeGrid;
protected System.Web.UI.WebControls.Image ImgArrow = null;
private DataTable dt = null;
#endregion
private void Page_Load(object sender, System.EventArgs e)
{
VisFagGrps();
if(!this.IsPostBack) BindGrid();
//if(this.IsPostBack) Response.Write("post back");
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.faggruppeGrid.SortCommand += new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.faggruppeGrid_SortCommand);
this.faggruppeGrid.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.faggruppeGrid_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
#region private functions
//生成绑定数据
private void VisFagGrps()
{
/*
using(PSLog logger = new PSLog())
{
try
{
if(this.ServiceDelegate == null) return;
ArrayList list1 = new ArrayList(this.ServiceDelegate.GetFaggruppeListe());
if(list1 == null)
{
this.VisErrorMessage("Get professional category list failed.");
}
}
catch(Exception ex)
{
VisErrorMessage(ex.Message);
ExceptionManager.Publish(ex);
}
}
*/
dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("Fag", typeof(string)));
dt.Columns.Add(new DataColumn("Navn", typeof(string)));
dr = dt.NewRow();
dr["Fag"] = "Fag01000001";
dr["Navn"] = "Fag0101";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag01000002";
dr["Navn"] = "Fag0102";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag01000003";
dr["Navn"] = "Fag0103";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag02000001";
dr["Navn"] = "Fag0201";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag02000002";
dr["Navn"] = "Fag0202";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag02000003";
dr["Navn"] = "Fag0203";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag03000001";
dr["Navn"] = "Fag0301";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag03000002";
dr["Navn"] = "Fag0302";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Fag"] = "Fag03000003";
dr["Navn"] = "Fag0303";
dt.Rows.Add(dr);
}
private void faggruppeGrid_SortCommand(Object sender, DataGridSortCommandEventArgs e)
{
System.Web.UI.Control control = ((DataGridItem)e.CommandSource).FindControl("ImgArrow");
//Response.Write(control.ToString());
ImgArrow = (System.Web.UI.WebControls.Image)control;
string SortField = (string)e.SortExpression;
string oldSortParam = faggruppeGrid.Attributes["SortExpression"];
if(oldSortParam.StartsWith(SortField))
{
//order by the same column.
if(oldSortParam.EndsWith("ASC"))
{
oldSortParam = oldSortParam.Replace("ASC","DESC");
//ImgArrow.ImageUrl = "../Images/Up.gif"; //实践证明在此设置图像行不通,需在ItemDataBound事件中实现。
}
else
{
oldSortParam = oldSortParam.Replace("DESC","ASC");
//ImgArrow.ImageUrl = "../Images/Up.gif"; //实践证明在此设置图像行不通,需在ItemDataBound事件中实现。
}
}
else
{
oldSortParam = SortField + " ASC";
}
faggruppeGrid.Attributes["SortExpression"] = oldSortParam;
BindGrid();
}
//绑定数据
private void BindGrid()
{
//设置初始排序字段
if(faggruppeGrid.Attributes["SortExpression"] == null)
faggruppeGrid.Attributes["SortExpression"] = "Fag ASC";
DataView dv = dt.DefaultView;
//按指定的排序字段排序
dv.Sort = faggruppeGrid.Attributes["SortExpression"];
faggruppeGrid.DataSource = dt;
faggruppeGrid.DataBind();
}
private void faggruppeGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType != ListItemType.Header) return;
//以下获取排序表达式
if(faggruppeGrid.Attributes["SortExpression"]==null) return;
string sortExpression = faggruppeGrid.Attributes["SortExpression"];
string[] orderParams = sortExpression.Split(' ');
//获取Image对象
System.Web.UI.Control control = (e.Item).FindControl("Img" + orderParams[0]);
if(control == null) return;
ImgArrow = (System.Web.UI.WebControls.Image)control;
ImgArrow.Visible = true;
//设置图像Url
if(sortExpression.EndsWith("ASC"))
ImgArrow.ImageUrl = "../Images/Up.gif";
else
ImgArrow.ImageUrl = "../Images/Down.gif";
}
#endregion
}
}