DataGrid的模版列
这两天琢磨了一下DataGrid的模版列,发现功能挺强,不过还有挺多没摸透的。用代码来说话吧。
页面代码是这么写的:
1 <asp:DataGrid id="dgTasks" runat="server" AllowPaging="True" BorderStyle="Solid" PageSize="8"
2 ToolTip="点击链接处理该记录" BorderColor="#3168CD" AutoGenerateColumns="False" Width="1074">
3 <AlternatingItemStyle BackColor="#EEEEEE"></AlternatingItemStyle>
4 <HeaderStyle HorizontalAlign="Center" Font-Bold="True" Font-Size="18px"></HeaderStyle>
5 <Columns>
6 <asp:TemplateColumn HeaderText="处理">
7 <ItemTemplate>
8 <asp:HyperLink runat="server" Text="处理" NavigateUrl='<%# "javascript:DoTask(" + DataBinder.Eval(Container.DataItem, "PI_id") + ");" %>'>
9 </asp:HyperLink>
10 </ItemTemplate>
11 </asp:TemplateColumn>
12 <asp:TemplateColumn HeaderText="ID">
13 <ItemTemplate>
14 <%# base.GetLabelColumn((long)DataBinder.Eval(Container.DataItem, "PI_id"),0) %>
15 </ItemTemplate>
16 </asp:TemplateColumn>
17 <asp:TemplateColumn HeaderText="描述">
18 <ItemTemplate>
19 <%# base.GetTAColumn((long)DataBinder.Eval(Container.DataItem, "PI_id"),2) %>
20 </ItemTemplate>
21 </asp:TemplateColumn>
22 <asp:TemplateColumn HeaderText="级别">
23 <ItemTemplate>
24 <%# base.GetValueColumn((long)DataBinder.Eval(Container.DataItem, "PI_id"),3,4) %>
25 </ItemTemplate>
26 </asp:TemplateColumn>
27 <asp:TemplateColumn HeaderText="时间">
28 <ItemTemplate>
29 <%# base.GetDTColumn((long)DataBinder.Eval(Container.DataItem, "PI_id"),5) %>
30 </ItemTemplate>
31 </asp:TemplateColumn>
32 </Columns>
33 <PagerStyle Visible="False" HorizontalAlign="Right" Mode="NumericPages"></PagerStyle>
34 </asp:DataGrid>
还需要在后代码中写对应的函数:2 ToolTip="点击链接处理该记录" BorderColor="#3168CD" AutoGenerateColumns="False" Width="1074">
3 <AlternatingItemStyle BackColor="#EEEEEE"></AlternatingItemStyle>
4 <HeaderStyle HorizontalAlign="Center" Font-Bold="True" Font-Size="18px"></HeaderStyle>
5 <Columns>
6 <asp:TemplateColumn HeaderText="处理">
7 <ItemTemplate>
8 <asp:HyperLink runat="server" Text="处理" NavigateUrl='<%# "javascript:DoTask(" + DataBinder.Eval(Container.DataItem, "PI_id") + ");" %>'>
9 </asp:HyperLink>
10 </ItemTemplate>
11 </asp:TemplateColumn>
12 <asp:TemplateColumn HeaderText="ID">
13 <ItemTemplate>
14 <%# base.GetLabelColumn((long)DataBinder.Eval(Container.DataItem, "PI_id"),0) %>
15 </ItemTemplate>
16 </asp:TemplateColumn>
17 <asp:TemplateColumn HeaderText="描述">
18 <ItemTemplate>
19 <%# base.GetTAColumn((long)DataBinder.Eval(Container.DataItem, "PI_id"),2) %>
20 </ItemTemplate>
21 </asp:TemplateColumn>
22 <asp:TemplateColumn HeaderText="级别">
23 <ItemTemplate>
24 <%# base.GetValueColumn((long)DataBinder.Eval(Container.DataItem, "PI_id"),3,4) %>
25 </ItemTemplate>
26 </asp:TemplateColumn>
27 <asp:TemplateColumn HeaderText="时间">
28 <ItemTemplate>
29 <%# base.GetDTColumn((long)DataBinder.Eval(Container.DataItem, "PI_id"),5) %>
30 </ItemTemplate>
31 </asp:TemplateColumn>
32 </Columns>
33 <PagerStyle Visible="False" HorizontalAlign="Right" Mode="NumericPages"></PagerStyle>
34 </asp:DataGrid>
1 protected string GetTAColumn(long id,int colcount)
2 {//获取text area模版列的item
3 string item = "<textarea rows=\"3\" cols=\"16\" readonly=true title=";
4 item += dsDataSource.Tables[0].Rows[(int)id][colcount].ToString() + ">";
5 item += Server.HtmlEncode(dsDataSource.Tables[0].Rows[(int)id][colcount].ToString());
6 item += "</textarea>";
7 iTableWidth += 100;
8 return item;
9 }
10 protected string GetDTColumn(long id,int colcount)
11 {//获取日期时间模版列的item
12 string item = "<SPAN>";
13 if(dsDataSource.Tables[0].Rows[(int)id][colcount]!=DBNull.Value)
14 {
15 DateTime dt = (DateTime)dsDataSource.Tables[0].Rows[(int)id][colcount];
16 item += dt.ToShortDateString() + "<br/>" + dt.ToLongTimeString();
17 }
18 else
19 item += "    ";
20 item += "</SPAN>";
21 iTableWidth += 40;
22 return item;
23 }
24 protected string GetLabelColumn(long id,int colcount)
25 {//获取文本模版列的item
26 string item = "<SPAN>";
27 item += dsDataSource.Tables[0].Rows[(int)id][colcount].ToString();
28 item += "</SPAN>";
29 iTableWidth += 50;
30 return item;
31 }
32 protected string GetValueColumn(long id,int colcount,int coltypeid)
33 {//获取静态数据的对应文本模版列的item
34 string item = "<SPAN>";
35 DataRow[] foundRows = dsStaticData.Tables[0].Select("SD_typeid="+coltypeid.ToString());
36 for(int i=0;i<foundRows.Length;i++)
37 {
38 if(dsDataSource.Tables[0].Rows[(int)id][colcount].ToString()==foundRows[i]["SD_typevalue"].ToString())
39 item += foundRows[i]["SD_typetext"].ToString();
40 }
41 item += "</SPAN>";
42 iTableWidth += 50;
43 return item;
44 }
通过自定义的这些函数可以返回不同html控件。如GetDTColumn函数,就可以在日期和时间之间加个换行。2 {//获取text area模版列的item
3 string item = "<textarea rows=\"3\" cols=\"16\" readonly=true title=";
4 item += dsDataSource.Tables[0].Rows[(int)id][colcount].ToString() + ">";
5 item += Server.HtmlEncode(dsDataSource.Tables[0].Rows[(int)id][colcount].ToString());
6 item += "</textarea>";
7 iTableWidth += 100;
8 return item;
9 }
10 protected string GetDTColumn(long id,int colcount)
11 {//获取日期时间模版列的item
12 string item = "<SPAN>";
13 if(dsDataSource.Tables[0].Rows[(int)id][colcount]!=DBNull.Value)
14 {
15 DateTime dt = (DateTime)dsDataSource.Tables[0].Rows[(int)id][colcount];
16 item += dt.ToShortDateString() + "<br/>" + dt.ToLongTimeString();
17 }
18 else
19 item += "    ";
20 item += "</SPAN>";
21 iTableWidth += 40;
22 return item;
23 }
24 protected string GetLabelColumn(long id,int colcount)
25 {//获取文本模版列的item
26 string item = "<SPAN>";
27 item += dsDataSource.Tables[0].Rows[(int)id][colcount].ToString();
28 item += "</SPAN>";
29 iTableWidth += 50;
30 return item;
31 }
32 protected string GetValueColumn(long id,int colcount,int coltypeid)
33 {//获取静态数据的对应文本模版列的item
34 string item = "<SPAN>";
35 DataRow[] foundRows = dsStaticData.Tables[0].Select("SD_typeid="+coltypeid.ToString());
36 for(int i=0;i<foundRows.Length;i++)
37 {
38 if(dsDataSource.Tables[0].Rows[(int)id][colcount].ToString()==foundRows[i]["SD_typevalue"].ToString())
39 item += foundRows[i]["SD_typetext"].ToString();
40 }
41 item += "</SPAN>";
42 iTableWidth += 50;
43 return item;
44 }
当然,在页面文件中调用自定义函数可以传入字段名,这样可以更直观的控制列。如果同时在后代码中修改SQL调用方式,变成灵活的读取配置或数据库的方式,那就可以不用每次都编译工程,只在页面文件中就可以随意添加、删除列了。