NET峰

打造.net开发第一品牌!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

一个实现自动求和、合并单元格、排序的DataGrid(转)

Posted on 2006-09-08 11:48  NET峰  阅读(1120)  评论(0编辑  收藏  举报
一个实现自动求和、合并单元格、排序的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>
 /// 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[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<Bindtable.Columns.Count;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.Count;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事件中,还有自定义分页功能等.