zoukankan      html  css  js  c++  java
  • 动态表单之数据分页

      我们很常会在项目中提到一个动态表单的概念,比如学校里面学生的考试成绩,当学生登录系统的时候,他当然是希望看到他自己所有科目 的成绩;又或者是班主任,他需要看到本班同学所有科目的成绩;这些时候我们一般都会在页面中呈现如下的效果。

       但是问题来了,不同科系的同学的科目是不一样的,那么我们在数据库设计的时候通常是把学生、某科成绩作为一条记录,那么这个时候我们就需要做一个行转列的 逻辑处理了。

    • 解决方法:
    1. 使用GridView来生成表单,这个实现起来会比较麻烦,如果要在列表里面显示链接就更不可能了;
    2. 生成html再输出到页面中,这个实现起来比较灵活、方便;
    • 基本功能点:
    1. 动态生成表 头;
    2. 数据进行分页;
    3. 查询数 据;
    4. 对每个成绩进行超链接,查看明细;


    • 页面代码
    <div id="dataDiv1">
      <asp:Literal ID="labtable" runat="server"></asp:Literal>
      <div class="toolBlock" style="border-top:solid 1px #C0CEDF; padding-top:5px">
    <bw:VirtualPager ID="VirtualPager1" runat="server" ItemsPerPage="10" OnPageIndexChanged="VirtualPager1_PageIndexChanged" />   
       
    </div>   
    </div>


    • 后台代码(生 成html字符串)
        /// <summary>
        
    /// table方式加载考核成绩.
        
    /// Step1:通过年月来获取唯一的批次.
        
    /// Step2:生成表头.
        
    /// Step3:开始循环每个用户.
        
    /// Step4:循环每个用户的考核项.
        
    /// </summary>
        protected void BindTable()
        {
            labtable.Text = string.Empty;
            
    //通过年月来获取唯一的批次.
            string year = DropDownImportYear.SelectedValue;
            
    string month = DropDownImportMonth.SelectedValue;
            
    string group_KH_Date = year + month;
            GroupService groupService = new GroupService();
            DataTable dtGroup = groupService.GetByTemplateCodeAndGroup_KH_Date(TemplateCode, group_KH_Date);
            
    if (dtGroup.Rows.Count > 0)
            {
                Guid groupID = (Guid)DbUtils.ToGuid(dtGroup.Rows[0]["ID"]);
                
    int groupStutas = DbUtils.ToInt32(dtGroup.Rows[0]["GroupStutas"].ToString());
                DataTable dtCells = personalGradeService.GetDistinctTemplateItemNameByGroupID(groupID);
                GroupID = groupID.ToString();

                
    if (dtCells.Rows.Count > 0)
                {
                    
    int cellsCount = 0;//考核项数.
                    StringBuilder strtable = new StringBuilder();
                    strtable.AppendFormat("<table cellpadding=\"0\" cellspacing=\"0\" class=\"tblClass\">");
                    strtable.AppendFormat("<tr>");
                    strtable.AppendFormat("<th>用户名</th>< /span>");
                    cellsCount = dtCells.Rows.Count;
                    
    for (int i = 0; i < cellsCount; i++)
                    {
                        strtable.AppendFormat("<th>{0}</th>", dtCells.Rows[i]["Name"].ToString());
                    }
                    strtable.AppendFormat("</tr>");

                    DataTable dtGradeData = GetData(cellsCount);
                    
    int cursor = 1;//表示一个用户的第一条记录.
                    string userName = string.Empty;
                    
    string realName = string.Empty;
                    
    for (int i = 0; i<dtGradeData.Rows.Count; i++)
                    {
                        
    if (cursor == 1)
                        {
                            userName = dtGradeData.Rows[i]["UserName"].ToString();
                            realName = dtGradeData.Rows[i]["RealName"].ToString();
                            strtable.AppendFormat("<td width=\"12%\">{0}</td>", realName);
                        }
                        
    string id = dtGradeData.Rows[i]["ID"].ToString();
                        
    string templateItemCode = dtGradeData.Rows[i]["TemplateItemCode"].ToString();
                        strtable.AppendFormat("<td width=\"50px\">");


                        
    string GradeData = dtGradeData.Rows[i]["GradeData"].ToString();
                        
    if (!string.IsNullOrEmpty(GradeData) && GradeData != "0")
                        {
                            GradeData=Math.Round(decimal.Parse(GradeData), 2).ToString();
                            
    //转换成两位小数
                        }

                        strtable.AppendFormat("{0}", GradeData);
                        
    //未发布的成绩才能修改
                        if (groupStutas != (int)Botwave.MRPS.Constants.GroupStutas.FinishPush)
                        {
                            strtable.AppendFormat("<br /><a style=\"text-decoration:underline\" class=\"thickbox\" href='UserGradeDataEdit.aspx?ID={0}&BeModifer={1}&KeepThis=true&TB_iframe=true&height=250&width=500'>", id, userName);
                            strtable.AppendFormat("<img src=\"../res/gradeedit.gif\" align=\"baseline\" title=\"修改成绩\" />");
                            strtable.AppendFormat("</a>");
                        }
                        strtable.AppendFormat("&nbsp;<a target=\"_blank\" style=\"text-decoration:underline\" href='http://www.cnblogs.com/CheckObjectManager/pages/LogScoreChangeDetail.aspx?GroupId={0}&TemplateCode={1}&TemplateItemCode={2}&UserName={3}&returnUrl='>", groupID, TemplateCode, templateItemCode, userName);
                        strtable.AppendFormat("<img src=\"../res/gradelog.gif\" align=\"baseline\" title=\"查看日志\" />");
                        strtable.AppendFormat("</a>");
                        strtable.AppendFormat("</td>");

                        
    if (cursor < cellsCount)
                            cursor++;
                        
    else
                        {
                            strtable.AppendFormat("</tr>");
                            cursor = 1;
                        }
                    }
                    strtable.AppendFormat("</table>");
                    labtable.Text = strtable.ToString();
                }
            }
        }


    • 几个辅助方法(如何处理好分页问题,这就关系到cellsCount参数的使用 了,cellsCount表示科目数)
        protected void btnSearch_Click(object sender, EventArgs e)
        {
            SearchNow = true;
            VirtualPager1.CurrentPageIndex = 1;
            BindTable();
        }

        
    protected void VirtualPager1_PageIndexChanged(object sender, Botwave.Web.Controls.PageChangedEventArgs e)
        {
            BindTable();
        }

        
    /// <summary>
        
    /// 获取考核成绩.
        
    /// </summary>
        
    /// <returns></returns>
        private DataTable GetData(int cellsCount)
        {
            
    int nRecordCount = 0;
            
    string condition = "";
            
    string filterName = txtUserName.Text.Trim();//姓名搜索.
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat(" GroupID ='{0}'", GroupID);
            
    if (!string.IsNullOrEmpty(filterName))
                sb.AppendFormat(" AND (UserName like '%{0}%' OR RealName like '%{0}%')", filterName);
            condition = sb.ToString();
            
    if (SearchNow)//当在很多页的时候,或者是最后一页,这个时候来点击查询,就会报错了CurrentPageIndex,这个做法就是为了防止 这个.
                VirtualPager1.CurrentPageIndex = 0;
            DataTable dt = personalGradeService.GetGradeData(VirtualPager1.CurrentPageIndex, VirtualPager1.ItemsPerPage * cellsCount, condition, ref nRecordCount);

            VirtualPager1.TotalRecordCount = nRecordCount / cellsCount;
            VirtualPager1.DataBind();
            SearchNow = false;//要重新复制.
            return dt;
        }


    • 业务逻辑(分页)
    public System.Data.DataTable GetGradeData(int currentPageIndex, int pageSize, string condition, ref int nRecordCount)
            {
                
    string fieldShow = " UserID,TemplateCode,TemplateItemCode,GradeData,ID,UserName,RealName ";
                
    string fieldOrder = " UserName ASC,TemplateItemCode ASC ";
                
    string where = condition;
                
    if (String.IsNullOrEmpty(where))
                {
                    
    where = "1=1";
                }
                
    return IBatisDbHelper.GetPagedList("dbo.vw_UserGradeData""ID", currentPageIndex, pageSize, fieldShow, fieldOrder, whereref nRecordCount);
            }
    • 注意事项:
    1. 在使用<asp:Literal ID="labtable" runat="server"></asp:Literal>来在页面输出html来显示表单的话,要注意字 符串的长度,如果html太长的话,就会出错了,因为Literal的有8000个字符的限制的;
    2. 在数据库中对数据进行好排序,这样才能保证数据跟表头是一一对应的;
    3. 这里有个前提,那就是 查询出来的数据都是包含同等多的记录的,比如同学A和同学B的科目是一样多的;因为不一样多,那这个动态表单就没什么意义了。如果真的有不同,也是可以做 出来的,但是会麻烦一点;
  • 相关阅读:
    实现图片加载时显示百分比思路——serverpush
    我对大项目的看法(定义)
    lucene
    Access常用内置SQL函数
    闰年算法
    DotFuscator使用步骤
    软件加密狗破解思路和方法
    Lucene(.net)学习
    .Net 代码安全保护产品DNGuard HVM使用
    为什么动态创建的控件没有显示出来
  • 原文地址:https://www.cnblogs.com/gaizai/p/1687566.html
Copyright © 2011-2022 走看看