分享一段在 .NET 中動態產生二維交叉表格的完整程式碼,適用於報表呈現需求。
DataTableArrayList 收集不重複的列標題與行標題Hashtable 以「列:行」為鍵儲存資料值Table、TableRow、TableCell 控制項void Page_Load(object o, EventArgs e)
{
DataTable dt = GetData();
string sSeparator = ":";
ArrayList alDept = new ArrayList();
ArrayList alMonth = new ArrayList();
Hashtable ht = new Hashtable();
foreach (DataRow dr in dt.Rows)
{
string sDept = dr["c"].ToString();
string sMonth2 = dr["p"].ToString();
string sMonth = GetData2(sMonth2);
if (!alDept.Contains(sDept)) alDept.Add(sDept);
if (!alMonth.Contains(sMonth)) alMonth.Add(sMonth);
ht[sDept + sSeparator + sMonth] = dr["a"];
}
TableRow tr = new TableRow();
foreach (string sDept in alDept)
{
int i = 0;
foreach (string sMonth in alMonth)
{
if (ht[sDept + sSeparator + sMonth] == null)
i += 0;
else
i += int.Parse(ht[sDept + sSeparator + sMonth].ToString());
}
TableCell tc = new TableCell();
tc.Text = sDept + "(" + i + ")";
tr.Cells.Add(tc);
}
Table1.Rows.Add(tr);
foreach (string sMonth in alMonth)
{
tr = new TableRow();
foreach (string sDept in alDept)
{
TableCell tc = new TableCell();
if (ht[sDept + sSeparator + sMonth] == null)
tc.Text = sMonth + "(0)";
else
tc.Text = sMonth + "(" + ht[sDept + sSeparator + sMonth].ToString() + ")";
tr.Cells.Add(tc);
}
Table1.Rows.Add(tr);
}
}
public DataTable GetData()
{
StatisticsB stat = new StatisticsB();
DataSet dataset = stat.byStone();
return dataset.Tables["stat"];
}
public string GetData2(string statid)
{
StatisticsB stat = new StatisticsB();
return stat.changeToName(statid);
}
此範例展示如何將平坦資料轉換為交叉表格呈現,可依實際需求調整欄位與樣式。