asp.net 動(dòng)態(tài)表單之?dāng)?shù)據(jù)分頁(yè)
更新時(shí)間:2010年03月16日 19:31:47 作者:
我們很常會(huì)在項(xiàng)目中提到一個(gè)動(dòng)態(tài)表單的概念,比如學(xué)校里面學(xué)生的考試成績(jī),當(dāng)學(xué)生登錄系統(tǒng)的時(shí)候,他當(dāng)然是希望看到他自己所有科目的成績(jī);又或者是班主任,他需要看到本班同學(xué)所有科目的成績(jī);這些時(shí)候我們一般都會(huì)在頁(yè)面中呈現(xiàn)如下的效果。
但是問(wèn)題來(lái)了,不同科系的同學(xué)的科目是不一樣的,那么我們?cè)跀?shù)據(jù)庫(kù)設(shè)計(jì)的時(shí)候通常是把學(xué)生、某科成績(jī)作為一條記錄,那么這個(gè)時(shí)候我們就需要做一個(gè)行轉(zhuǎn)列的邏輯處理了。
解決方法:
使用GridView來(lái)生成表單,這個(gè)實(shí)現(xiàn)起來(lái)會(huì)比較麻煩,如果要在列表里面顯示鏈接就更不可能了;
生成html再輸出到頁(yè)面中,這個(gè)實(shí)現(xiàn)起來(lái)比較靈活、方便;
基本功能點(diǎn):
動(dòng)態(tài)生成表頭;
數(shù)據(jù)進(jìn)行分頁(yè);
查詢(xún)數(shù)據(jù);
對(duì)每個(gè)成績(jī)進(jìn)行超鏈接,查看明細(xì);
頁(yè)面代碼
<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>
后臺(tái)代碼(生成html字符串)
/// <summary>
/// table方式加載考核成績(jī).
/// Step1:通過(guò)年月來(lái)獲取唯一的批次.
/// Step2:生成表頭.
/// Step3:開(kāi)始循環(huán)每個(gè)用戶(hù).
/// Step4:循環(huán)每個(gè)用戶(hù)的考核項(xiàng).
/// </summary>
protected void BindTable()
{
labtable.Text = string.Empty;
//通過(guò)年月來(lái)獲取唯一的批次.
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;//考核項(xiàng)數(shù).
StringBuilder strtable = new StringBuilder();
strtable.AppendFormat("<table cellpadding=\"0\" cellspacing=\"0\" class=\"tblClass\">");
strtable.AppendFormat("<tr>");
strtable.AppendFormat("<th>用戶(hù)名</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;//表示一個(gè)用戶(hù)的第一條記錄.
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();
//轉(zhuǎn)換成兩位小數(shù)
}
strtable.AppendFormat("{0}", GradeData);
//未發(fā)布的成績(jī)才能修改
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=\"修改成績(jī)\" />");
strtable.AppendFormat("</a>");
}
strtable.AppendFormat(" <a target=\"_blank\" style=\"text-decoration:underline\" , 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();
}
}
}
幾個(gè)輔助方法(如何處理好分頁(yè)問(wèn)題,這就關(guān)系到cellsCount參數(shù)的使用了,cellsCount表示科目數(shù))
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>
/// 獲取考核成績(jī).
/// </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)//當(dāng)在很多頁(yè)的時(shí)候,或者是最后一頁(yè),這個(gè)時(shí)候來(lái)點(diǎn)擊查詢(xún),就會(huì)報(bào)錯(cuò)了CurrentPageIndex,這個(gè)做法就是為了防止這個(gè).
VirtualPager1.CurrentPageIndex = 0;
DataTable dt = personalGradeService.GetGradeData(VirtualPager1.CurrentPageIndex, VirtualPager1.ItemsPerPage * cellsCount, condition, ref nRecordCount);
VirtualPager1.TotalRecordCount = nRecordCount / cellsCount;
VirtualPager1.DataBind();
SearchNow = false;//要重新復(fù)制.
return dt;
}
業(yè)務(wù)邏輯(分頁(yè))
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, where, ref nRecordCount);
}
注意事項(xiàng):
在使用<asp:Literal ID="labtable" runat="server"></asp:Literal>來(lái)在頁(yè)面輸出html來(lái)顯示表單的話(huà),要注意字符串的長(zhǎng)度,如果html太長(zhǎng)的話(huà),就會(huì)出錯(cuò)了,因?yàn)長(zhǎng)iteral的有8000個(gè)字符的限制的;
在數(shù)據(jù)庫(kù)中對(duì)數(shù)據(jù)進(jìn)行好排序,這樣才能保證數(shù)據(jù)跟表頭是一一對(duì)應(yīng)的;
這里有個(gè)前提,那就是查詢(xún)出來(lái)的數(shù)據(jù)都是包含同等多的記錄的,比如同學(xué)A和同學(xué)B的科目是一樣多的;因?yàn)椴灰粯佣?,那這個(gè)動(dòng)態(tài)表單就沒(méi)什么意義了。如果真的有不同,也是可以做出來(lái)的,但是會(huì)麻煩一點(diǎn);
解決方法:
使用GridView來(lái)生成表單,這個(gè)實(shí)現(xiàn)起來(lái)會(huì)比較麻煩,如果要在列表里面顯示鏈接就更不可能了;
生成html再輸出到頁(yè)面中,這個(gè)實(shí)現(xiàn)起來(lái)比較靈活、方便;
基本功能點(diǎn):
動(dòng)態(tài)生成表頭;
數(shù)據(jù)進(jìn)行分頁(yè);
查詢(xún)數(shù)據(jù);
對(duì)每個(gè)成績(jī)進(jìn)行超鏈接,查看明細(xì);

頁(yè)面代碼
復(fù)制代碼 代碼如下:
<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>
后臺(tái)代碼(生成html字符串)
復(fù)制代碼 代碼如下:
/// <summary>
/// table方式加載考核成績(jī).
/// Step1:通過(guò)年月來(lái)獲取唯一的批次.
/// Step2:生成表頭.
/// Step3:開(kāi)始循環(huán)每個(gè)用戶(hù).
/// Step4:循環(huán)每個(gè)用戶(hù)的考核項(xiàng).
/// </summary>
protected void BindTable()
{
labtable.Text = string.Empty;
//通過(guò)年月來(lái)獲取唯一的批次.
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;//考核項(xiàng)數(shù).
StringBuilder strtable = new StringBuilder();
strtable.AppendFormat("<table cellpadding=\"0\" cellspacing=\"0\" class=\"tblClass\">");
strtable.AppendFormat("<tr>");
strtable.AppendFormat("<th>用戶(hù)名</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;//表示一個(gè)用戶(hù)的第一條記錄.
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();
//轉(zhuǎn)換成兩位小數(shù)
}
strtable.AppendFormat("{0}", GradeData);
//未發(fā)布的成績(jī)才能修改
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=\"修改成績(jī)\" />");
strtable.AppendFormat("</a>");
}
strtable.AppendFormat(" <a target=\"_blank\" style=\"text-decoration:underline\" , 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();
}
}
}
幾個(gè)輔助方法(如何處理好分頁(yè)問(wèn)題,這就關(guān)系到cellsCount參數(shù)的使用了,cellsCount表示科目數(shù))
復(fù)制代碼 代碼如下:
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>
/// 獲取考核成績(jī).
/// </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)//當(dāng)在很多頁(yè)的時(shí)候,或者是最后一頁(yè),這個(gè)時(shí)候來(lái)點(diǎn)擊查詢(xún),就會(huì)報(bào)錯(cuò)了CurrentPageIndex,這個(gè)做法就是為了防止這個(gè).
VirtualPager1.CurrentPageIndex = 0;
DataTable dt = personalGradeService.GetGradeData(VirtualPager1.CurrentPageIndex, VirtualPager1.ItemsPerPage * cellsCount, condition, ref nRecordCount);
VirtualPager1.TotalRecordCount = nRecordCount / cellsCount;
VirtualPager1.DataBind();
SearchNow = false;//要重新復(fù)制.
return dt;
}
業(yè)務(wù)邏輯(分頁(yè))
復(fù)制代碼 代碼如下:
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, where, ref nRecordCount);
}
注意事項(xiàng):
在使用<asp:Literal ID="labtable" runat="server"></asp:Literal>來(lái)在頁(yè)面輸出html來(lái)顯示表單的話(huà),要注意字符串的長(zhǎng)度,如果html太長(zhǎng)的話(huà),就會(huì)出錯(cuò)了,因?yàn)長(zhǎng)iteral的有8000個(gè)字符的限制的;
在數(shù)據(jù)庫(kù)中對(duì)數(shù)據(jù)進(jìn)行好排序,這樣才能保證數(shù)據(jù)跟表頭是一一對(duì)應(yīng)的;
這里有個(gè)前提,那就是查詢(xún)出來(lái)的數(shù)據(jù)都是包含同等多的記錄的,比如同學(xué)A和同學(xué)B的科目是一樣多的;因?yàn)椴灰粯佣?,那這個(gè)動(dòng)態(tài)表單就沒(méi)什么意義了。如果真的有不同,也是可以做出來(lái)的,但是會(huì)麻煩一點(diǎn);
您可能感興趣的文章:
- java正則表達(dá)式表單驗(yàn)證類(lèi)工具類(lèi)(驗(yàn)證郵箱、手機(jī)號(hào)碼、qq號(hào)碼等)
- ASP.NET表單驗(yàn)證方法詳解
- asp.net 防止用戶(hù)通過(guò)后退按鈕重復(fù)提交表單
- asp.net 模擬提交有文件上傳的表單(通過(guò)http模擬上傳文件)
- asp.net中實(shí)體類(lèi)對(duì)象賦值到表單的實(shí)現(xiàn)代碼
- asp.net 中將表單提交到另一頁(yè) Code-Behind(代碼和html在不同的頁(yè)面)
- ASP.Net中表單POST到其他頁(yè)面的方法分享
- jquery form表單提交插件asp.net后臺(tái)中文解碼
- Asp.Net模擬表單提交數(shù)據(jù)和上傳文件的實(shí)現(xiàn)代碼
- .Net語(yǔ)言Smobiler開(kāi)發(fā)之如何在手機(jī)上實(shí)現(xiàn)表單設(shè)計(jì)
相關(guān)文章
詳解ASP.NET Core 之 Identity 入門(mén)(二)
本篇文章主要介紹了ASP.NET Core 之 Identity 入門(mén),主要負(fù)責(zé)對(duì)用戶(hù)的身份進(jìn)行認(rèn)證,有興趣的可以了解一下。2016-12-12ASP.NET中實(shí)現(xiàn)獲取調(diào)用方法名
這篇文章主要介紹了ASP.NET中實(shí)現(xiàn)獲取調(diào)用方法名的技巧,較為詳細(xì)的講述了相關(guān)的命名空間的調(diào)用及語(yǔ)句執(zhí)行順序,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12.net?core利用PdfSharpCore操作PDF實(shí)例教程
操作pdf是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常遇到的功能,下面這篇文章主要給大家介紹了關(guān)于.net?core利用PdfSharpCore操作PDF實(shí)例的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12mvc上傳到美橙云虛擬機(jī)系列問(wèn)題的解決方法
這篇文章主要為大家詳細(xì)介紹了mvc上傳到美橙云虛擬機(jī)系列問(wèn)題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10asp.net中ListBox 綁定多個(gè)選項(xiàng)為選中及刪除實(shí)現(xiàn)方法
文章介紹了關(guān)于在asp.net中的listbox的綁定多個(gè)選項(xiàng)和同時(shí)選中多個(gè)選項(xiàng)以及刪除多個(gè)選項(xiàng)的方法2012-04-04ASP.NET MVC實(shí)現(xiàn)多個(gè)按鈕提交的方法
這篇文章主要為大家詳細(xì)介紹了ASP.NET MVC實(shí)現(xiàn)多個(gè)按鈕提交的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09asp.net System.Net.Mail 發(fā)送郵件
一個(gè)師弟發(fā)了段代碼給我,說(shuō)調(diào)試了很久發(fā)送郵件都沒(méi)有成功。自己使用過(guò)程中,也發(fā)現(xiàn)了很多問(wèn)題,但最簡(jiǎn)單的問(wèn)題是“發(fā)件方”地址根本不支持smtp發(fā)送郵件。2009-04-04