Asp.Net中DataGrid的模版列(TemplateColumn)内容控制简单方法。

最近写了几个asp.net的项目。其中,Asp.Net的控件DataGrid使用的最多了,前几天需要一个功能,我研究了很长时间,发现一个方法,应该是最简单的实现。现表述如下。

DataGrid的html定义很简单,如下

< Asp:DataGrid ID ="myDatagrid" runat ="server" datakeyfield ="fID" AutoGenerateColumns ="False" >
< Columns >
< Asp:TemplateColumn itemstyle-width =".." .. >
< ItemTemplate >
.
功能的要求是在 ItemTemplate中,有可能是一个绑定数据源的:

1<a href="...">...</a>

链接代码,也有可能是一个

1<span>...</span>

显示文本代码,而判断的根据是绑定到DataGrid中数据源的DataTable中每行的某一特定列的内容。

说白了,功能就是DataGrid在绑定数据生成行的时候,判断数据源DataTable每行DataRow中一个字段的内容,这个字段类型是bool类型,如果为true,则这个列显示的是

1<a href="...">...</a>

链接,而如果是false,则显示

1<span>...</span>

文本。而显示的链接内指向的地址必须执行数据绑定。就是这个DataGrid的列有的行要数据绑定,有的行不要数据绑定。

功能需求分析到这里,那么现在该思考如何实现了。

我当时了解需求后,马上反应出来,使用DataGrid自带的BoundColumn、HyperLinkColumn肯定是不行的。而且,使用TemplateColumn也有麻烦。他只能放一些固定的控件,如html控件或服务器控件等。后来我没有办法了,准备继承ITemplate接口自己开发一个模版列。后来又觉得麻烦。因为绑定的时候需要一个类似于BoundColumn功能的绑定数据源内容的东西。后来我发现了这个方法。

在查看.Net Framework SDK 文档的时候,我发现在

1<asp:templatecolumn>中的<itemtemplate>中可以放类似于   
2
3
4![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif) ```
5  ![](http://www.cnblogs.com/Images/dot.gif) # DataBinder.  Eval  (Container.DataItem,  "  fID  "  )  

这样的数据绑定代码,我就想是否可以再加入代码呢

我做了一个试验,试验结果发现上面的代码(包括前面和后面的```

 1  
 2我们都知道,在asp.net1.1中,一个名称为aaa.aspx的asp.net页在asp.net内部处理时是一个名叫ASP.aaa_aspx的类,这个类继承它的后台代码aaa.aspx.cs中的类,这个类继承System.Web.UI.Page类,从而实现需要的功能。这就是说,在asp.net 1.1中,我们在.aspx中的以```
 3 
 4``` 包含的代码可以调用后台cs类中的以public 和protected生命的任何方法。   
 5  
 6这就好办了,既然从上面的数据绑定代码可以获取主键内容(是个字符串),那么我可以在后台写一个方法,这个方法有一个字符串参数,返回的也是字符串。这个返回的字符串就是显示在列中的内容。   
 7  
 8首先说一下绑定表的内容,如下   
 9
10
11列名  |  类型  |  用途   
12---|---|---  
13fID  |  System.String  |  表主键   
14hasSub  |  System.Boolean  |  判断的依据   
15contentUrl  |  System.String  |  链接的地址   
16  
17然后是后台代码中C#代码   
18
19
20![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) protected  string  GetDGColumn(  string  id)   
21![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif) ![](http://www.cnblogs.com/Images/dot.gif) {   
22![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) //  从数据源获取DataTable内容略    
23![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) DataTable dt  =  ![](http://www.cnblogs.com/Images/dot.gif) .;   
24![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) //  定义DataTable的主键列    
25![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) ![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif) DataColumn[] key  =  ![](http://www.cnblogs.com/Images/dot.gif) {dt.Columns[  "  fID  "  ]}  ;   
26![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) dt.PrimaryKey  =  key;   
27![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)   
28![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) //  根据传入的id开始找数据行    
29![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) DataRow row  =  dt.Rows.Find(id);   
30![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)   
31![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) //  找到后开始判断    
32![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) if  ((  bool  )row[  "  hasSub  "  ])   
33![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) ![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif) ![](http://www.cnblogs.com/Images/dot.gif) {   
34![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) //  hasSub为 true,表示返回<span>   
35![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) return  "  <span ![](http:="" "="" \="" dot.gif)="" images="" style="\" www.cnblogs.com="">内容内容</span> "  ;   
36![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) }    
37![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) else    
38![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) ![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif) ![](http://www.cnblogs.com/Images/dot.gif) {   
39![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) //  hasSub列为false,返回链接    
40![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) return  "  <a "="" ?="" \="" _blank\="" href="\" id="  +id+  " target="\" xxxx.aspx="">链接内容</a> "  ;   
41![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) }    
42![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif) } 
43
44  
45然后在.aspx中的DaaGrid内这样定义:   
46
47
48![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; Asp:DataGrid  ID  ="myDatagrid"  runat  ="server"  datakeyfield  ="fID"  AutoGenerateColumns  ="False"  &gt;   
49![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; Columns  &gt;   
50![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; Asp:TemplateColumn  itemstyle-width  =".."  ..  &gt;   
51![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif) &lt; ItemTemplate  &gt;   
52![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif) ```
53  ![](http://www.cnblogs.com/Images/dot.gif) # base.GetDGColumn((  object  )DataBinder.  Eval  (Container.DataItem,  "  fID  "  ))  


</asp:templatecolumn>

 1![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
 2![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
 3![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
 4
 5  
 6利用了DataGrid绑定时内部使用的数据绑定方法获取结果,然后把结果传递给GetDGColumn()方法,DataGrid列的内容实际上是使用的这个方法返回的字符串。   
 7  
 8  
 9好了,一个随心所欲生成DataGrid列内容的方法说完了,不知道大家有没有更好的方法。   
10我这个方法的缺点就是生成的内容没有办法执行服务器提交,它无法被服务器段区分开,所以只能是使用静态的链接,文本等。还有就是可以调用客户端的js脚本。如果谁有更好的方法,如生成的链接按钮的单击事件可以被服务器端区分,请指教。如果大家有更好的方法,也请指教。我在这里谢谢大家了。
Published At
Categories with Web编程
Tagged with
comments powered by Disqus