摘要:[C#][ASP.Net]GirdView動態新增cell(含其他元件)
如果只是單純的動態新增一個cell不含任何其他元件,則把下列這行程式
1
//設定cell的文字內容
2
e.Row.Cells[e.Row.Cells.Add(new TableCell())].Text = "Phone";

2

放到RowDataBound事件中,如果放在e.Row.RowType == DataControlRowType.Header區段中如下
01
if (e.Row.RowType == DataControlRowType.Header)
02
{
03
//新增一個cell
04
e.Row.Cells[e.Row.Cells.Add(new TableCell())].Text = "Phone Number";
05
06
//設定cell的外觀樣式
07
foreach (TableCell cell in e.Row.Cells)
08
{
09
cell.Width = intCellWidth;
10
cell.BorderColor = Color.Black;
11
cell.BorderWidth = 2;
12
cell.Font.Bold = true;
13
cell.Font.Size = FontUnit.Small;
14
}
15
}

02

03

04

05

06

07

08

09

10

11

12

13

14

15

則代表新增GridView的Title;同理放在e.Row.RowType == DataControlRowType.DataRow區段中則代表要新增GirdView的body;而放在e.Row.RowType == DataControlRowType.Footer則是新增在尾列。
如果要新增cell同時要內含一個TextBox元件該如何做?
01
//建立TextBox物件
02
TextBox oTB = new TextBox();
03
//開始設定其屬性
04
oTB.ID = "TextBox1";
05
oTB.AutoPostBack = true;
06
oTB.EnableViewState = false;
07
oTB.Attributes.Add("onfocus", "this.select();");
08
//設定TextBox的TextChanged事件
09
oTB.TextChanged += new EventHandler(TextBox_TextChanged);
10
oTB.Text = "1-800-551-1155";
11
//最後把這個TextBox物件加到cell,大功告成
12
e.Row.Cells[e.Row.Cells.Add(new TableCell())].Controls.Add(oTB);
13
oTB = null;

02

03

04

05

06

07

08

09

10

11

12

13

若要變成其他物件可以此類推。
以下範例是整個GridView都用動態方式建立,並給定一個DataTable作為資料來源。
首先先在畫面上放個GirdView,並給一個隱藏的BoundField把整個GirdView給撐起來:
1 <asp:GridView ID="GirdView1" runat="server" AutoGenerateColumns="False" BorderColor="Black"
2 BorderWidth="2px" EnableTheming="True" OnRowDataBound="GirdView1_RowDataBound">
3 <RowStyle BackColor="Cornsilk" BorderColor="Black" HorizontalAlign="Left" />
4 <Columns>
5 <asp:BoundField HeaderText="HiddenField" Visible="False" />
6 </Columns>
7 <HeaderStyle BackColor="CadetBlue" BorderColor="Black" Font-Size="Smaller" />
8 <AlternatingRowStyle BackColor="LightCyan" />
9 </asp:GridView>
2 BorderWidth="2px" EnableTheming="True" OnRowDataBound="GirdView1_RowDataBound">
3 <RowStyle BackColor="Cornsilk" BorderColor="Black" HorizontalAlign="Left" />
4 <Columns>
5 <asp:BoundField HeaderText="HiddenField" Visible="False" />
6 </Columns>
7 <HeaderStyle BackColor="CadetBlue" BorderColor="Black" Font-Size="Smaller" />
8 <AlternatingRowStyle BackColor="LightCyan" />
9 </asp:GridView>
後置程式碼:
這邊偷懶所以直接利用SqlDataSource撈出資料當作來源,不然一般我都是手工寫BLL和DAL,可讓程式保有很大的彈性和擴充性。
1
DataTable dt = ((DataView)SqlDataSource1.Select(DataSourceSelectArguments.Empty)).Table;
2
GridView1.DataSource = dt;
3
GridView1.DataBind();

2

3

接下來設定GridView1的RowDataBound事件:
01
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
02
{
03
if (e.Row.RowType == DataControlRowType.Header)
04
{
05
//增加cell並設定其值
06
for (int i = 0; i < dt.Columns.Count; i++)
07
{
08
e.Row.Cells[e.Row.Cells.Add(new TableCell())].Text = dt.Columns[i].Caption;
09
}
10
11
//設定cell外觀屬性
12
foreach (TableCell cell in e.Row.Cells)
13
{
14
cell.Width = intCellWidth;
15
cell.BorderColor = Color.Black;
16
cell.BorderWidth = 2;
17
cell.Font.Bold = true;
18
cell.Font.Size = FontUnit.Small;
19
}
20
}
21
else if (e.Row.RowType == DataControlRowType.DataRow)
22
{
23
TextBox oTB;
24
25
for (int i = 0; i < dt.Columns.Count; i++)
26
{
27
oTB = new TextBox();
28
//開始設定屬性值
29
oTB.ID = "TextBox" + (i + 1);
30
oTB.Width = 70;
31
oTB.AutoPostBack = true;
32
oTB.EnableViewState = true;
33
oTB.Style.Add("text-align", "center");
34
//這邊我針對某個欄位設定和其他不同的限制
35
oTB.MaxLength = (i == 3) ? 2 : 30;
36
//設定TextChanged事件
37
oTB.TextChanged += new EventHandler(TextBox_TextChanged);
38
//把資料來源繫結到TextBox上
39
oTB.Text = Convert.ToString(DataBinder.Eval(e.Row.DataItem, dt.Columns[i].Caption));
40
//最後把這個物件加到cell
41
e.Row.Cells[e.Row.Cells.Add(new TableCell())].Controls.Add(oTB);
42
//回收繼續使用
43
oTB = null;
44
}
45
46
//設定cell外觀屬性
47
//......
48
}
49
}

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

10/5/2009 補充:
動態產生的東西每次postback之後都會消失,你自己必須要再次建立一遍,資料也要重新DataBind()。如果要紀錄client端所輸入的值,要利用網頁postback回server的機會把它除存下來,最常用也最好用的莫過於TextChanged事件。