DataGrid自动求和、合并单元格、排序

  以前在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事件中,还有自定义分页功能等.

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值