前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个页面搞定几乎所有的列表需求的实现思路和一点代码。

一个页面搞定几乎所有的列表需求的实现思路和一点代码。

作者头像
用户1174620
发布2018-02-26 10:37:41
1.2K0
发布2018-02-26 10:37:41
举报

     其实如果要单独实现一个能够显示数据的表格,那么是很简单的,写一个for循环,把DataTable里面数据循环出来就OK了。相信大家都会做吧,如果是从asp走过来的应该更不陌生吧。

     上一篇说了,我们要根据表里面的记录来确定显示哪些列,哪一列在前,哪一列在后。那么怎么做呢?我们先定义一个类来存放这些信息。

 public class GridColumnsInfo     {         public int ColumnID = 0;       public string ColSysName = "";         public string ColName = "";         public string ColType = "";         public string ColWidth = "";         public string ColAlign = "";         public string Format = "";         public int MaxLength = 0;

    }

     然后我们继承 System.Web.UI.WebControls.DataBoundControl,来创建一个自己的显示数据的控件。GridView就是继承的这个基类,我们也先照猫画虎来一个吧。public class myGrid : DataBoundControl    {}

     DataBoundControl 已经为我们做了不少的事情,比如定义了DataSource属性,还有DataBind()事件,其他的属性、事件我们暂时用不到,就先不管了。DataSource直接用就可以了,不用修改;而DataBind()就需要override一下了。

     我们还要先定义一个 Dictionary,用于存放GridColumnsInfo集合。然后写一个public void LoadGridColumnsInfo()函数来加载信息。

 public Dictionary<int, GridColumnsInfo> dic_GridCols ;

DataBind() 里面主要分为两个部分,第一部分绘制页眉,第二部分就是循环数据了。

 #region 输出页眉             str.Append("<TR class=\"css_GridTR\">");             foreach (KeyValuePair<int, GridColumnsInfo> entry in dic_GridCols)             {                 str.Append("<TD>");                 str.Append(((GridColumnsInfo)entry.Value).ColName);                 str.Append("</TD>");             }             str.Append("</TR>");             #endregion

     然后是循环输出数据,感觉这些也没有什么好说的,自己都觉得挺苦燥的。还是说一下行交替颜色的实现方法吧。用控件的形式输出一个table,首先要处理的就是样式,表格的样式要足够的灵活,否则的话就会有不好用的感觉。GridView用了很多的属性来进行描述,这个太复杂了,不和人家学了,来个简单一点的吧。样式/CSS,恩,就交给CSS来处理吧,定义几个css:

css_Grid1 :描绘table, css_GridTR:描绘页眉, td:控制td, css_TR_c1、css_TR_c2、css_TR_c3...css_TR_cn: 来定义行交替色,这个数量就看要用多少种颜色来进行

交替了。

css_TR_move :鼠标经过时的样式; css_TR_CK: 鼠标单击杭的样式。

     最后就是写几个js函数来控制鼠标经过和单击的效果。

     这里有演示效果。http://www.cnblogs.com/jyk/archive/2008/07/28/1255077.html

     好像有点乱。这里主要是想说如何根据配置信息来显示table,但是好像变成了介绍如何实现行的交替变色和点击行变色了。

     在下面就要做表单控件了。整理成一个完整一点的示例,在提供源码吧。

附源码:

代码语言:javascript
复制
/**//// <summary>
    /// 专门显示数据的控件
    /// </summary>
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:myGrid runat=server></{0}:myGrid>")]
    public class myGrid : DataBoundControl 
    {
        ==============================句柄==============================#region ==============================句柄==============================
        /**//// <summary>
        /// 访问数据库用的实例
        /// </summary>
        private DataAccessHelp dal = null;
        #endregion

        数据访问实例的设置#region 数据访问实例的设置
        /**//// <summary>
        /// 设置数据访问层的实例
        /// </summary>
        public DataAccessHelp DAL
        {
            set { dal = value; }
            get
            {
                if (dal == null)
                    dal = new DataAccessHelp();

                return dal;
            }
        }
        #endregion

        成员和属性#region 成员和属性

        模块ID#region 模块ID
        /**//// <summary>
        /// 模块ID
        /// </summary>
        private string _FunctionID = "";

        /**//// <summary>
        /// 模块ID
        /// </summary>
        [Bindable(true)]
        [Category("配置信息")]
        [Localizable(true)]
        [Description("模块ID,用于提取配置信息")]
        public string FunctionID
        {
            set { _FunctionID = value; }
            get
            {
                return _FunctionID;
            }
        }
        #endregion

        #endregion


        /**//// <summary>
        /// 存放列表用的字段的描述信息,key:字段ID,value:GridColumnsInfo
        /// </summary>
        public Dictionary<int, GridColumnsInfo> dic_GridCols ;//= new Dictionary<int, GridColumnsInfo>();

        从数据库的配置信息里面提取列表用的字段信息#region 从数据库的配置信息里面提取列表用的字段信息
        /**//// <summary>
        /// 从数据库的配置信息里面提取列表用的字段信息
        /// </summary>
        public void LoadGridColumnsInfo()
        {
            string sql = "select * from _V_Use_ListCol where FunctionID=" + FunctionID;

            DataTable dt = DAL.RunSqlDataTable(sql);
            if (dal.ErrorMsg.Length > 2)
                return;

            if (dt.Rows.Count == 0)
                return;

            dic_GridCols = new Dictionary<int, GridColumnsInfo>();

            foreach (DataRow dr in dt.Rows)
            {
                GridColumnsInfo info = new GridColumnsInfo();
                info.ColumnID  = Int32.Parse(dr["ColumnID"].ToString());
                info.ColSysName  = dr["ColSysName"].ToString();
                info.ColName  = dr["ColName"].ToString();
                info.ColWidth  = dr["ColWidth"].ToString();
                info.ColAlign = dr["ColAlign"].ToString();
                info.ColType  = dr["ColType"].ToString();
                info.Format = dr["Format"].ToString();
                info.MaxLength = Int32.Parse(dr["MaxLength"].ToString());

                dic_GridCols.Add(info.ColumnID, info);

            }

            //dal.Dispose();
        }
        #endregion

        /**//// <summary>
        /// 绑定数据
        /// </summary>
        public override void DataBind()
        {
            if ((base.Site != null) && base.Site.DesignMode)
            {
                //设计模式,退出
                return;
            }

            加载配置信息#region 加载配置信息
            if (dic_GridCols == null)
                LoadGridColumnsInfo();

            //没有配置信息,退出
            if (dic_GridCols == null)
            {
                CommandClass.MsgBox("没有设置配置信息", true);
                return;
            }
            #endregion

            System.Text.StringBuilder str = new StringBuilder(1000);
            str.Append("<Table class=\"css_Grid\">");
                   
 
            输出页眉#region 输出页眉
            str.Append("<TR class=\"css_GridTR\">");
            
            foreach (KeyValuePair<int, GridColumnsInfo> entry in dic_GridCols)
            {
                str.Append("<TD>");
                str.Append(((GridColumnsInfo)entry.Value).ColName);
                str.Append("</TD>");
            }
            str.Append("</TR>");
            #endregion

            输出数据#region 输出数据
            if (this.DataSource != null)
            {
                //输出js脚本
                System.Text.StringBuilder js = new StringBuilder();
                js.Append("<script >var myGridDataID = \"\"</script>");
                base.Page.Response.Write(js.ToString());

                if (this.DataSource is DataTable)
                {
                    DataTable dt = (DataTable)this.DataSource;
           
                    Int32 i = 0;
                    GridColumnsInfo info;   //循环里面的字段信息
                    string tmpValue;        //循环里的字段值
                    string DataID = "";     //数据主键值
                    string IDColumn = "";   //主键的字段名

                    主键的字段名#region 主键的字段名
                    IDColumn = dal.RunSqlGetFirstColValue("select IDColumn from Manage_Function_Info where FunctionID= "+ this.FunctionID);
                    #endregion

                    定义交替次数#region 定义交替次数
                    int t = 0;
                    #endregion

                    foreach (DataRow dr in dt.Rows)
                    {
                        //获取主键字段的值
                        DataID = dr[IDColumn].ToString();

                        str.Append("<TR class=\"css_TR_c");
                        str.Append(t % 2 + 1); t++;
                        str.Append("\" onmousemove=\"Move(this)\" onmouseout=\"Out(this)\" onclick=\"Ck(this,'");
                        str.Append(DataID);
                        str.Append("')\" ondblclick=\"DbCK(me)\">");

                        foreach (KeyValuePair<int, GridColumnsInfo> entry in dic_GridCols)
                        {
                            info = (GridColumnsInfo)entry.Value;

                            
                            str.Append("<TD ");
                            align#region align
                            if (info.ColAlign != "left")
                            {
                                str.Append("Align=\"");
                                str.Append(info.ColAlign);
                                str.Append("\" ");
                            }
                            #endregion

                            width#region width
                            if (info.ColWidth != "0")
                            {
                                str.Append("width=\"");
                                str.Append(info.ColWidth);
                                str.Append("\" ");
                            }
                            #endregion

                            str.Append(">");

                            设置数据的长度和格式#region 设置数据的长度和格式
                            tmpValue = dr[info.ColSysName].ToString();
                            if (info.MaxLength != 0)
                                tmpValue = Functions.strCal(tmpValue, info.MaxLength);

                            if (info.Format.Length != 0)
                            {
                                //判断数据库的字段类型,然后先转换再格式化。
                                switch (info.ColType)
                                {
                                    case "bigint":
                                        tmpValue = string.Format(info.Format, Int64.Parse(tmpValue));
                                        break;
                                    
                                    case "int":
                                    case "smallint":
                                    case "tinyint":
                                        tmpValue = string.Format(info.Format, Int32.Parse(tmpValue));
                                        break;

                                    case "datetime":
                                    case "smalldatetime":
                                        if (tmpValue.Length > 0)
                                        {
                                            DateTime tmpTime = DateTime.Parse(tmpValue);
                                            if (tmpTime <= DateTime.Parse("1900-1-2"))
                                                tmpValue = "";  //不显示1900-1-1这样的日期
                                            else
                                                tmpValue = string.Format(info.Format, tmpTime);
                                        }
                                        break;

                                    case "decimal":
                                    case "money":
                                    case "smallmoney":
                                    case "numeric":
                                        tmpValue = string.Format(info.Format, decimal.Parse(tmpValue));
                                        break;

                                    case "float":
                                    case "real":
                                        tmpValue = string.Format(info.Format, float.Parse(tmpValue));
                                        break;

                                        //其他类型不格式化
                                }
                            }
                            #endregion

                            str.Append(tmpValue);
                            str.Append("</TD>"); 
                        }
                        str.Append("</TR>");
                    }
                }
            }
            #endregion

            str.Append("</Table>");

            this.Controls.Add(new LiteralControl(str.ToString()));

        }

    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2008-07-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档