[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 |
程式畫面:
我的程式當初是這麼寫的(其實主要的邏輯就是將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。
不過在建置第2個Table物件的時候,也一切都正常,有被加入到Table中,檢查一下Rows如下:
不過回頭再看看,我們剛剛第0個位置的第1個Table,發生了什麼事:
結果在先前加入HeaderRow的Table中的那個Header卻不見了…
一直加到第10個Table,就發現,第10個Table的Row中有我們最早宣告的HeaderRow,而…其他先前被迴圈加入HeaderRow都被最後一個搶走了!!
(一直到最後,證明只有最後一個Table有正確地加入共用的HeaderRow,其他的都因為重覆使用最早宣告的HeaderRow,所以將先前加入Rows集合的那個HeaderRow搶走了)
這樣的現象也就是說,我們雖然用迴圈加入HeaderRow,但是其實HeaderRow是唯一的,雖然你重覆地應用。
但是那個HeaderRow卻不會重覆的被複製到你新的應用的地方。
原本我以為是Object的特性,後來發現這個是Table的特性,因為我後來建置了Dictionary<string, List<Object>>來測試這個現象,卻發現沒有問題
物件都會被正確建立,因此會有這樣的困擾。
當然,最簡單的方式就是在迴圈內才去建立HeaderRow,不過這樣就會一直在做重覆的事,不知有沒有更好的解法?