[ASP.NET] Table物件的謎

  • 6252
  • 0

[ASP.NET] Table物件的謎

最近在組合一些網頁上的Table。透過著ASP.NET去組合Table物件!

因此,理論上,我的動態表格應該依資料,出現這樣子的動態內容。

例:

標題1 標題2
資料1 資料2

 

標題1 標題2
資料1 資料2

 

標題1 標題2
資料1 資料2

 

不過,很奇怪的,我的網頁在印出來的時候,卻是長這樣

資料1 資料2

 

資料1 資料2

 

標題1 標題2
資料1 資料2

 

程式畫面:

image

 

我的程式當初是這麼寫的(其實主要的邏輯就是將HeaderRow的宣告拉到迴圈之外):

   1: TableRow tTRHeader = new TableRow();
   2:     TableCell tTC1 = new TableCell();
   3:     TableCell tTC2 = new TableCell();
   4:     tTC1.Text = "標題1";
   5:     tTC2.Text = "標題2";
   6:     tTC1.BorderWidth = 1;
   7:     tTC2.BorderWidth = 1;
   8:     tTRHeader.Cells.Add(tTC1);
   9:     tTRHeader.Cells.Add(tTC2);
  10:     
  11:     Dictionary<string, Table> tDic2 = new Dictionary<string, Table>();
  12:     
  13:     
  14:     
  15:     for (int i = 0; i < 10; i++)
  16:     {
  17:         Table tTable = new Table();
  18:         tTable.BorderWidth = 1;
  19:         TableRow tTRData = new TableRow();
  20:         TableCell tTC3 = new TableCell();
  21:         TableCell tTC4 = new TableCell();
  22:         tTC3.BorderWidth = 1;
  23:         tTC4.BorderWidth = 1;
  24:     
  25:         tTC3.Text = "資料1";
  26:         tTC4.Text = "資料2";
  27:         tTRData.Cells.Add(tTC3);
  28:         tTRData.Cells.Add(tTC4);
  29:         tTable.Rows.Add(tTRHeader);
  30:         tTable.Rows.Add(tTRData);
  31:         tDic2.Add(i.ToString(), tTable);
  32:     }
  33:     
  34:     
  35:     
  36:     foreach (Table tTable in tDic2.Values)
  37:     {
  38:         Label tLabel = new Label();
  39:         tLabel.Text = "<p>";
  40:         Page.Form.Controls.Add(tTable);
  41:         Page.Form.Controls.Add(tLabel);
  42:     }

 

上述的處理邏輯是希望能夠透過動態資料來建置Table的內容,不過因為Header都是一致的,假如有10個Table,那Header應該可以重複利用,結果事與願違。

當我在加入TableRow(迴圈外宣告的變數),到Table的Rows集合物件中的時候,發生了如此的現象:

 

當我們建置了第1個Table的時候(Dictionary中的第0個),一切都正常,正常地被我加入了兩個Row,一個是Header,一個是Data。

image

 

 

不過在建置第2個Table物件的時候,也一切都正常,有被加入到Table中,檢查一下Rows如下:

image

 

 

不過回頭再看看,我們剛剛第0個位置的第1個Table,發生了什麼事:

image

結果在先前加入HeaderRow的Table中的那個Header卻不見了…

 

一直加到第10個Table,就發現,第10個Table的Row中有我們最早宣告的HeaderRow,而…其他先前被迴圈加入HeaderRow都被最後一個搶走了!!

image

image

(一直到最後,證明只有最後一個Table有正確地加入共用的HeaderRow,其他的都因為重覆使用最早宣告的HeaderRow,所以將先前加入Rows集合的那個HeaderRow搶走了)

 

這樣的現象也就是說,我們雖然用迴圈加入HeaderRow,但是其實HeaderRow是唯一的,雖然你重覆地應用。

但是那個HeaderRow卻不會重覆的被複製到你新的應用的地方。

 

原本我以為是Object的特性,後來發現這個是Table的特性,因為我後來建置了Dictionary<string, List<Object>>來測試這個現象,卻發現沒有問題

物件都會被正確建立,因此會有這樣的困擾。

當然,最簡單的方式就是在迴圈內才去建立HeaderRow,不過這樣就會一直在做重覆的事,不知有沒有更好的解法?