前不久在工作中遇到一個關於用DataGrid分類顯示數據的問題,顯示的樣式入下圖所示: 希望能為遇到類似問題的朋友提供一個解決方案,並掌握類似問題的解決方法.
問題剖析:
以上為例,每門課程屬於不同的類別,需要將顯示數據的第一項類別進行匯總顯示.用標准的DataGrid是難於實現上述功能的.顯然需要依靠自身來解決.
思路:
歸根到底,不論何種樣式的表格顯示,表現到前台都是Html的Table元素,因此如果能夠在讀取數據時動態確定Html樣式,並通過Div將html生成到前台顯示的話,就可以控制復雜的顯示.這裡面其實包含了從已有顯示的html反推到動態html生成的過程.
源代碼及注釋:
定義類保存類別名字和數據條數
public class KeyVal
{
private string m_Skey;
private string m_SVal;
public string strKey
{
get
{
return m_Skey;
}
set
{
m_Skey=value;
}
}
public string strVal
{
get
{
return m_SVal;
}
set
{
m_SVal=value;
}
}
public KeyVal()
{}
public KeyVal(string SKey,string SVal)
{
strKey=SKey;
strVal=SVal;
}
}
測試頁代碼和相關函數
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Security.Principal;
using Microsoft.Web.UI.WebControls;
using System.Text;
namespace EisWebSite.WebInternet
{
/// <summary>
/// ClassCourse 的摘要說明。
/// </summary>
public class ClassCourse : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DropDownList SpecialtyID;
protected System.Web.UI.HtmlControls.HtmlGenericControl MainDiv;
//
#region 頁面初始化
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
AppGlobal.CBoxFillSpecialtyData(ref this.SpecialtyID,true);
}
}
#endregion
#region Web 窗體設計器生成的代碼
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 該調用是 ASP.NET Web 窗體設計器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 設計器支持所需的方法 - 不要使用代碼編輯器修改
/// 此方法的內容。
/// </summary>
private void InitializeComponent()
{
this.SpecialtyID.SelectedIndexChanged += new System.EventHandler(this.SpecialtyID_SelectedIndexChanged);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private string CreateOutHtml()
{
//取出類型數目以及名稱
DataSet dSet=new DataSet();
dSet=添加自己的獲取數據集的函數(靈活設計Sql語句)結果為類型、數目
//AppGlobal.AppSysWebService.ClassCourseTeacherMainFilters(Item);
ArrayList mList=new ArrayList();
foreach(DataRow dRow in dSet.Tables[0].Rows)
{
KeyVal mObj=new KeyVal();
mObj.strKey=dRow[0].ToString();
mObj.strVal=dRow[1].ToString();
mList.Add(mObj);
}
StringBuilder OutHtml=new StringBuilder();
dSet=添加自己的數據集函數.注意數據的排序方式與上同
//AppGlobal.AppSysWebService.ClassCourseTeacherFilters(Item);
//添加固定表頭
OutHtml.Append("<table cellspacing='0' cellpadding='0' align='center' rules='all' bordercolor='black' border='1'"
+"id='GRid'"+
" style='word-break:break-all; BORDER-RIGHT:black 1px solid; BORDER-TOP:black 1px solid; BORDER-LEFT:black 1px solid; WIDTH:100%; BORDER-BOTTOM:black 1px solid; BORDER-COLLAPSE:collapse'>"
);
OutHtml.Append("<table cellspacing='0' cellpadding='0' align='center' rules='all' bordercolor='black' border='1'"
+"id='AGRid'"+
" style='word-break:break-all;BORDER-RIGHT:black 1px solid; BORDER-TOP:black 1px solid; BORDER-LEFT:black 1px solid; WIDTH:100%; BORDER-BOTTOM:black 1px solid; BORDER-COLLAPSE:collapse'>");
OutHtml.Append("<tr align='center'>"+
"<td width='87' style='WIDTH: 87px; HEIGHT: 34px'>類別</td>"+
"<td style='WIDTH: 253px; HEIGHT: 34px'>課程編號</td>"+
"<td style='WIDTH: 280px; HEIGHT: 34px'>課程名稱</td>"+
"<td style='WIDTH: 86px; HEIGHT: 34px'>學分</td>"+
"<td style='WIDTH: 140px; HEIGHT: 34px' >"+
"<table width='100%' height='100%' cellpadding='0' cellspacing='0'>"+
"<tr>"+
"<td align='center'width='33%' ></td>"+
"<td align='center'width='33%'>學期</td>"+
"<td align='center'width='33%' ></td>"+