 |
个实现自动求和/合并单元格/排序的DataGrid |
热 ★★★★ |
| 个实现自动求和/合并单元格/排序的DataGrid |
|
作者:佚名 文章来源:网贝整理|http://www.netbei.com/ 点击数: 更新时间:2005-1-11 0:40:26  |
以前在asp很难实现代码重用,asp.net很好的解决了这个问题,以下是我写的DataGrid,继承DataGrid,加进了升降序/全并单元格/自动求和功能,原理很简单,但很好的实现的代码重用. using System; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; using System.Data; using System.Data.SqlClient; namespace SunService { /// <summary> /// Summary description for DataGrid. /// </summary> [DefaultProperty("Text"), ToolboxData("<{0}:DataGrid runat=server></{0}:DataGrid>")] public class DataGrid : System.Web.UI.WebControls.DataGrid { private string text; private SqlDataAdapter adp; private DataSet ds; private DataView view; private string[] arritem; [Bindable(true), Category("Appearance"), DefaultValue("")] public string Text { get { return text; }
set { text = value; } } /// <summary> /// protect SortDirection 排序方向 /// </summary>
public string SortDirection { get { if(ViewState["SortDirection"]==null) { return null; } else { if(ViewState["SortDirection"].ToString()=="") { return null; } else { return ViewState["SortDirection"].ToString(); } } } set { ViewState["SortDirection"]=value; } } /// <summary> /// protect SortField 排序字段 /// </summary> public string SortField { get { if(ViewState["SortField"]==null) { return null; } else { if(ViewState["SortField"].ToString()=="") { return null; } else { return ViewState["SortField"].ToString(); } } } set { ViewState["SortField"]=value; } } /// <summary> /// sql 查询字串 /// </summary> public string selectCommandText { get { if(ViewState["selectCommandText"]==null) { return null; } else { if(ViewState["selectCommandText"].ToString()=="") { return null; } else {
return ViewState["selectCommandText"].ToString(); } } } set { ViewState["selectCommandText"]=value; } } /// <summary> /// 连接字串 /// </summary> public string selectConnectionString { get { if(ViewState["selectConnectionString"]==null) { return null; } else { return ViewState["selectConnectionString"].ToString(); } } set { ViewState["selectConnectionString"]=value; } } public DataTable Bindtable; public DataGrid() { this.Init+=new System.EventHandler(this.DataGrid_Init); } private void DataGrid_Init(object sender,EventArgs e) {
this.Load+= new System.EventHandler(this.DataGrid_Load); this.SortCommand+=new System.Web.UI.WebControls.DataGridSortCommandEventHandler(this.DataGrid_SortCommand); this.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.DataGrid_ItemDataBound);
} private void DataGrid_Load(object sender,EventArgs e) { this.HorizontalAlign=HorizontalAlign.Center; this.AllowSorting=true; arritem=new string[256]; ds=new DataSet(); }
/// <summary> /// GRID绑定 /// </summary> /// <param name="selectCommandText">查询字串</param> /// <param name="selectConnectionString">连接字串</param> public void BindGrid(string selectCommandText,string selectConnectionString) { this.selectCommandText=selectCommandText; this.selectConnectionString=selectConnectionString; BindGrid(); } /// <summary> /// grid绑定 /// </summary> /// <param name="selectCommandText">查询字串</param> /// <param name="cn">连接对象</param> public void BindGrid(string selectCommandText,SqlConnection cn) { this.selectCommandText=selectCommandText; this.selectConnectionString=cn.ConnectionString; BindGrid(); } /// <summary> /// grid绑定,必须先设置 selectCommmandText 及SelectConnectionString 属性 /// </summary> public void BindGrid() { if(this.selectCommandText!=null&&this.selectConnectionString!=null) { adp=new SqlDataAdapter(this.selectCommandText,this.selectConnectionString); adp.Fill(ds,"temp"); view=ds.Tables["temp"].DefaultView;
if(this.SortField!=null) { view.Sort=this.SortField+" "+this.SortDirection; int sortfieldindex=0; for( int i=0;i<ds.Tables["temp"].Columns.Count;i++) { if(ds.Tables["temp"].Columns.ColumnName==this.SortField) { sortfieldindex=i; break; } } string SortDirectionImg="▲"; if(this.SortDirection==" DESC") { SortDirectionImg="▼";
} if(this.SortField!=this.DataKeyField) { ds.Tables["temp"].Columns[sortfieldindex].ColumnName+=SortDirectionImg; } } Bindtable=ds.Tables["temp"]; DataRow row=Bindtable.NewRow(); row[0]="总计:"; for(int i=1;i<Bindtable.Columns.Count;i++) { Type t=Bindtable.Columns.DataType; if(t==typeof(Decimal)||t==typeof(Double)||t==typeof(Int16)||t==typeof(Int32)||t==typeof(Int64)||t==typeof(UInt16)||t==typeof(UInt32)||t==typeof(Int64)) { row=0; foreach( DataRow r in Bindtable.Rows) { try { row=double.Parse(row.ToString())+double.Parse(r.ToString()); } catch(Exception et) { } } } } Bindtable.Rows.Add(row); this.DataSource=view; this.DataBind(); } else { } } private void DataGrid_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e) { if( this.SortDirection==" DESC") { this.SortDirection=" ASC"; } else { this.SortDirection=" DESC"; } this.SortField=e.SortExpression; this.SortField=this.SortField.Replace("▲",""); this.SortField=this.SortField.Replace("▼",""); BindGrid(); }
private void DataGrid_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { try { string txt=""; for(int i=0;i<e.Item.Cells.Count;i++) { // e.Item.Cells.Wrap=false; txt=e.Item.Cells.Text.Trim(); if(myClass.IsDouble(txt)) { e.Item.Cells.HorizontalAlign=HorizontalAlign.Right; } else { if(txt==arritem&&txt!=""&&txt!=null) { e.Item.Cells.Text=""; } else { arritem=txt; } } } } catch(Exception et) { }
}
} }
调用简单: 把组件拖到页面中 ,假设ID为 DataGrid1: 调用:DataGrid1.BindGrid(string selectCommandText,string selectConnectionString) 这样省了建 conntion DataAdapter DataSet再绑定的时间. 大家还可把显示时间显示格式/数字显示格式等加进ItemDataBound事件中,还有自定义分页功能等. |
| 文章录入:admin 责任编辑:admin |
|
上一篇文章: 使用SQLDMO从SQL Server中获取信息
下一篇文章: .net中的事务处理 |
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |