首页 > 开发 > 综合 > 正文

一个实现自动求和/合并单元格/排序的DataGrid

2024-07-21 02:16:46
字体:
来源:转载
供稿:网友
,欢迎访问网页设计爱好者web开发。以前在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事件中,还有自定义分页功能等.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表