以前在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 description for DataGrid. /// [DefaultProperty("Text"), ToolboxData("<{0}:datagrid runat="server">")] 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; } } /// /// protect SortDirection 排序方向 ///
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; } } /// /// protect SortField 排序字段 /// 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; } } /// /// sql 查询字串 /// 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; } } /// /// 连接字串 /// 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();
}
/// /// GRID绑定 /// /// 查询字串 /// 连接字串 public void BindGrid(string selectCommandText,string selectConnectionString) { this.selectCommandText=selectCommandText; this.selectConnectionString=selectConnectionString; BindGrid();
} /// /// grid绑定 /// /// 查询字串 /// 连接对象 public void BindGrid(string selectCommandText,SqlConnection cn) { this.selectCommandText=selectCommandText; this.selectConnectionString=cn.ConnectionString; BindGrid(); } /// /// grid绑定,必须先设置 selectCommmandText 及SelectConnectionString 属性 /// 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 { if(ds.Tables["temp"].Columns[i].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 { Type t=Bindtable.Columns[i].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[i]=0; foreach( DataRow r in Bindtable.Rows) { try { row[i]=double.Parse(row[i].ToString())+double.Parse(r[i].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[i].Wrap=false; txt=e.Item.Cells[i].Text.Trim();
if(myClass.IsDouble(txt)) { e.Item.Cells[i].HorizontalAlign=HorizontalAlign.Right; } else { if(txt==arritem[i]&&txt!=""&&txt!=null) { e.Item.Cells[i].Text=""; } else { arritem[i]=txt; } } } } catch(Exception et) {
}
} } }
调用简单: 把组件拖到页面中 ,假设ID为 DataGrid1: 调用:DataGrid1.BindGrid(string selectCommandText,string selectConnectionString) 这样省了建 conntion DataAdapter DataSet再绑定的时间. 大家还可把显示时间显示格式/数字显示格式等加进ItemDataBound事件中,还有自定义分页功能等. |