位置:海鸟网 > IT > ASP.NET >

一个实现自动求和/合并单元格/排序的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 des cription 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事件中,还有自定义分页功能等.