当前位置:Gxlcms > asp.net > asp.net 动态表单之数据分页

asp.net 动态表单之数据分页

时间:2021-07-01 10:21:17 帮助过:8人阅读

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

解决方法:
使用GridView来生成表单,这个实现起来会比较麻烦,如果要在列表里面显示链接就更不可能了;
生成html再输出到页面中,这个实现起来比较灵活、方便;
基本功能点:
动态生成表头;
数据进行分页;
查询数据;
对每个成绩进行超链接,查看明细;
 
页面代码
代码如下:
  1. <br><div id="dataDiv1"> <br>  <asp:Literal ID="labtable" runat="server"></asp:Literal> <br>  <div class="toolBlock" style="border-top:solid 1px #C0CEDF; padding-top:5px"> <br><bw:VirtualPager ID="VirtualPager1" runat="server" ItemsPerPage="10" OnPageIndexChanged="VirtualPager1_PageIndexChanged" /> <br></div> <br></div> <br> <br><br>后台代码(生成html字符串) <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>/// <summary> <br>/// table方式加载考核成绩. <br>/// Step1:通过年月来获取唯一的批次. <br>/// Step2:生成表头. <br>/// Step3:开始循环每个用户. <br>/// Step4:循环每个用户的考核项. <br>/// </summary> <br>protected void BindTable() <br>{ <br>labtable.Text = string.Empty; <br>//通过年月来获取唯一的批次. <br>string year = DropDownImportYear.SelectedValue; <br>string month = DropDownImportMonth.SelectedValue; <br>string group_KH_Date = year + month; <br>GroupService groupService = new GroupService(); <br>DataTable dtGroup = groupService.GetByTemplateCodeAndGroup_KH_Date(TemplateCode, group_KH_Date); <br>if (dtGroup.Rows.Count > 0) <br>{ <br>Guid groupID = (Guid)DbUtils.ToGuid(dtGroup.Rows[0]["ID"]); <br>int groupStutas = DbUtils.ToInt32(dtGroup.Rows[0]["GroupStutas"].ToString()); <br>DataTable dtCells = personalGradeService.GetDistinctTemplateItemNameByGroupID(groupID); <br>GroupID = groupID.ToString(); <br>if (dtCells.Rows.Count > 0) <br>{ <br>int cellsCount = 0;//考核项数. <br>StringBuilder strtable = new StringBuilder(); <br>strtable.AppendFormat("<table cellpadding=\"0\" cellspacing=\"0\" class=\"tblClass\">"); <br>strtable.AppendFormat("<tr>"); <br>strtable.AppendFormat("<th>用户名</th>< /span>"); <br>cellsCount = dtCells.Rows.Count; <br>for (int i = 0; i < cellsCount; i++) <br>{ <br>strtable.AppendFormat("<th>{0}</th>", dtCells.Rows[i]["Name"].ToString()); <br>} <br>strtable.AppendFormat("</tr>"); <br>DataTable dtGradeData = GetData(cellsCount); <br>int cursor = 1;//表示一个用户的第一条记录. <br>string userName = string.Empty; <br>string realName = string.Empty; <br>for (int i = 0; i<dtGradeData.Rows.Count; i++) <br>{ <br>if (cursor == 1) <br>{ <br>userName = dtGradeData.Rows[i]["UserName"].ToString(); <br>realName = dtGradeData.Rows[i]["RealName"].ToString(); <br>strtable.AppendFormat("<td width=\"12%\">{0}</td>", realName); <br>} <br>string id = dtGradeData.Rows[i]["ID"].ToString(); <br>string templateItemCode = dtGradeData.Rows[i]["TemplateItemCode"].ToString(); <br>strtable.AppendFormat("<td width=\"50px\">"); <br><br>string GradeData = dtGradeData.Rows[i]["GradeData"].ToString(); <br>if (!string.IsNullOrEmpty(GradeData) && GradeData != "0") <br>{ <br>GradeData=Math.Round(decimal.Parse(GradeData), 2).ToString(); <br>//转换成两位小数 <br>} <br>strtable.AppendFormat("{0}", GradeData); <br>//未发布的成绩才能修改 <br>if (groupStutas != (int)Botwave.MRPS.Constants.GroupStutas.FinishPush) <br>{ <br>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); <br>strtable.AppendFormat("<img src=\"../res/gradeedit.gif\" align=\"baseline\" title=\"修改成绩\" />"); <br>strtable.AppendFormat("</a>"); <br>} <br>strtable.AppendFormat(" <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); <br>strtable.AppendFormat("<img src=\"../res/gradelog.gif\" align=\"baseline\" title=\"查看日志\" />"); <br>strtable.AppendFormat("</a>"); <br>strtable.AppendFormat("</td>"); <br>if (cursor < cellsCount) <br>cursor++; <br>else <br>{ <br>strtable.AppendFormat("</tr>"); <br>cursor = 1; <br>} <br>} <br>strtable.AppendFormat("</table>"); <br>labtable.Text = strtable.ToString(); <br>} <br>} <br>} <br> <br><br>几个辅助方法(如何处理好分页问题,这就关系到cellsCount参数的使用了,cellsCount表示科目数) <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>protected void btnSearch_Click(object sender, EventArgs e) <br>{ <br>SearchNow = true; <br>VirtualPager1.CurrentPageIndex = 1; <br>BindTable(); <br>} <br>protected void VirtualPager1_PageIndexChanged(object sender, Botwave.Web.Controls.PageChangedEventArgs e) <br>{ <br>BindTable(); <br>} <br>/// <summary> <br>/// 获取考核成绩. <br>/// </summary> <br>/// <returns></returns> <br>private DataTable GetData(int cellsCount) <br>{ <br>int nRecordCount = 0; <br>string condition = ""; <br>string filterName = txtUserName.Text.Trim();//姓名搜索. <br>StringBuilder sb = new StringBuilder(); <br>sb.AppendFormat(" GroupID ='{0}'", GroupID); <br>if (!string.IsNullOrEmpty(filterName)) <br>sb.AppendFormat(" AND (UserName like '%{0}%' OR RealName like '%{0}%')", filterName); <br>condition = sb.ToString(); <br>if (SearchNow)//当在很多页的时候,或者是最后一页,这个时候来点击查询,就会报错了CurrentPageIndex,这个做法就是为了防止这个. <br>VirtualPager1.CurrentPageIndex = 0; <br>DataTable dt = personalGradeService.GetGradeData(VirtualPager1.CurrentPageIndex, VirtualPager1.ItemsPerPage * cellsCount, condition, ref nRecordCount); <br>VirtualPager1.TotalRecordCount = nRecordCount / cellsCount; <br>VirtualPager1.DataBind(); <br>SearchNow = false;//要重新复制. <br>return dt; <br>} <br> <br>业务逻辑(分页) <br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>public System.Data.DataTable GetGradeData(int currentPageIndex, int pageSize, string condition, ref int nRecordCount) <br>{ <br>string fieldShow = " UserID,TemplateCode,TemplateItemCode,GradeData,ID,UserName,RealName "; <br>string fieldOrder = " UserName ASC,TemplateItemCode ASC "; <br>string where = condition; <br>if (String.IsNullOrEmpty(where)) <br>{ <br>where = "1=1"; <br>} <br>return IBatisDbHelper.GetPagedList("dbo.vw_UserGradeData", "ID", currentPageIndex, pageSize, fieldShow, fieldOrder, where, ref nRecordCount); <br>} <br> <br>注意事项: <br>在使用<asp:Literal ID="labtable" runat="server"></asp:Literal>来在页面</li></ol></pre>输出html来显示表单的话,要注意字符串的长度,如果html太长的话,就会出错了,因为Literal的有8000个字符的限制的; <br>在数据库中对数据进行好排序,这样才能保证数据跟表头是一一对应的; <br>这里有个前提,那就是查询出来的数据都是包含同等多的记录的,比如同学A和同学B的科目是一样多的;因为不一样多,那这个动态表单就没什么意义了。如果真的有不同,也是可以做出来的,但是会麻烦一点;</li><li> </li><li> </li></ol></pre></li></ol></pre>

人气教程排行