.NET如何在DataList的ItemTemplate中使用if判断语句

最近使用ASP.NET在做WEB开发的时候遇到了一种情况,就是想要在DataList的ItemTemplate模板中根据不同的内容需要有不同的显示样式,这样就需要在ItemTemplate中进行判断来实现,但是当使用判断语句的时候,系统会报错,倒腾了半天终于才知道了怎么回事

jesen
1
2020-03-17 22:50:31
文档目录
我的书签
 

Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用

这是在DataList的ItemTemplate中使用判断语句引发的错误,代码如下:
<% if ( Eval("id").Equals("1") ) {} %> 

根据错误提示可以看出来,不支持在表达式中使用数据绑定的方法来获取当前要绑定的数据,那么现在改怎么办?根据查找才知道,一是,可以通过DataList的绑定事件来处理判断逻辑如下:

<asp:DataList ID="DataListId" runat="server" Width="1000px" OnItemDataBound="DataList1_ItemDataBound"></asp:DataList>

二就是可以在表达式中调用自定义方法来实现如下:

<tr  id="<%#Eval("id") %>" class='<%# getTrClass(Eval("xingzhi").ToString(),Eval("shifen").ToString()) %>' > //定义在aspx 文件中
public string getTrClass(string xingzhi, string shifen)  //定义在对应的aspx.cs 文件中
{
   //处理逻辑
}

添加HeaderTemplate后,发生未将对象引用设置到对象的实例错误

在Repeater或者DataList控件添加HeaderTemplate模板后直接报这个错误,代码如下:
<asp:DataList ID="DataListId" runat="server"  OnItemDataBound="DataListId_ItemDataBound">
<asp:Repeater ID="RepeaterId" runat="server"  OnItemDataBound="RepeaterId_ItemDataBound">

倒腾了好久,才发现是因为在控件上绑定的事件(DataListId_ItemDataBound)导致的,因为在控件进行数据绑定初始化的时候会回调DataListId_ItemDataBound方法,当添加了HeaderTemplate模板后,会多一次回调,这样会导致在回调中传入回调函数的参数类型的不同发生错误,这个时候需要在DataListId_ItemDataBound方法中判断回调参数的类型才可以避免此错误,代码如下:

protected void DataList2_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    //当回调参数的类型为HeaderTemplate和FooterTemplate的时候直接返回
    if(e.Item.ItemType == ListItemType.Header || e.Item.ItemType == ListItemType.Footer) 
    {
       return;
    }
}
友情提示