本文展示如何在 ASP.NET WebForms 中實現數據的行列轉換 (透視/樞紐效果),將長表格式數據轉為寬表格式顯示。

<?xml version="1.0" encoding="utf-8" ?>
<table>
<tr>
<編碼>A01</編碼>
<內容>你</內容>
<M0601>1</M0601>
<M0602>2</M0602>
</tr>
<tr>
<編碼>A02</編碼>
<內容>我</內容>
<M0601>3</M0601>
<M0602>4</M0602>
</tr>
</table>
private DataSet DataConvert(DataSet ds, int startIndex, int endIndex) {
DataSet dsNew = new DataSet();
try {
// 遍歷需轉為列的欄位索引範圍
for (int i = startIndex; i <= endIndex; i++) {
DataTable dtPart = ds.Tables[0].Copy(); // 複製源表
// 移除非當前目標欄位
for (int j = startIndex; j <= endIndex; j++) {
if (i != j) {
dtPart.Columns.Remove(dtPart.Columns[j].ColumnName);
}
}
// 添加「月份」欄位,固定值為原欄位名
DataColumn dc = new DataColumn("月份", typeof(string));
dc.Expression = "'" + dtPart.Columns[startIndex].ColumnName + "'";
dtPart.Columns.Add(dc);
// 重命名值欄位為「數量」
dtPart.Columns[startIndex].ColumnName = "數量";
// 合併到結果集
if (dsNew.Tables.Count > 0) dsNew.Merge(dtPart);
else dsNew.Tables.Add(dtPart);
}
} catch (Exception ex) {
this.Label1.Text = ex.Message;
}
return dsNew;
}
<asp:DataGrid id="dgOld" runat="server" /> <!-- 原始數據 -->
<asp:Button id="btnChange" Text="轉換" OnClick="Button1_Click" runat="server" />
<asp:DataGrid id="dgNew" runat="server" /> <!-- 轉換後數據 -->
private void Button1_Click(object sender, EventArgs e) {
// 假設第 2、3 列 (索引 2,3) 為需透視的月份數據列
this.dgNew.DataSource = DataConvert(ds, 2, 3).Tables[0].DefaultView;
this.dgNew.DataBind();
}

此法通過 DataTable.Copy、Columns.Remove、Expression 計算列、Merge 合併實現行列轉換,適合中小數據量場景。大數據量建議在 SQL 層面用 PIVOT 或 OLAP 方案。