`

DataBinder.Eval方法研究

阅读更多

 

 

转自:http://www.cnblogs.com/kongxiangxin/archive/2009/06/25/1511239.html

 

 

DataBinder.Eval方法:
用途:在运行时使用反射来分析和计算对象的数据绑定表达式
重载列表如下:

public static object Eval(object container,string expression);
public static object Eval(object container,string expression,string format);

假设后台代码如下:

IList list = new ArrayList();

Task task 
= new Task();

task.Title 
= "title1";

task.StartDate 
= DateTime.Now;

list.Add(task);

task 
= new Task();

task.Title 
= "title2";

task.StartDate 
= DateTime.Now.AddDays(1);

list.Add(task); 

task 
= new Task();

task.Title 
= "title3";

task.StartDate 
= DateTime.Now.AddDays(2);

list.Add(task); 

this.DataGrid1.DataSource = list;

this.DataGrid1.DataBind();


那么,常用的方式如下:

<asp:datagrid runat=server id=”DataGrid1”>

<Columns>

<asp:TemplateColumn HeaderText="开始日期">

  
<ItemTemplate>     
    
<%#DataBinder.Eval(Container.DataItem,"StartDate","{0,d}")%>
  
</ItemTemplate>

</asp:TemplateColumn>

</Columns>

</asp:datagrid>

分析:

1.第一个参数传进去的是Container.DataItem,那么看一下Container.DataItem是什么东西:
新增一列,如下:

<asp:TemplateColumn HeaderText="test">
<ItemTemplate>
<%#Container.DataItem%>
</ItemTemplate>
</asp:TemplateColumn>

运行结果如下图:

所以,此时的Container.DataItem是Task类型的对象,所以可以直接把Task的属性名作为DataBinder.Eval的第二个参数。
2.再看一下Container是什么东西:
把分析1中的代码的变成下面的样子:
<%#Container %>
运行结果如下图:

所以,这里的Container是一个DataGridItem的对象。接着看看Container和DataItem有什么关系:

DataGridItem类有一个属性就叫做DataItem,msdn中的解释为“获取或设置由 DataGrid 控件中的 DataGridItem 对象表示的数据项。”也就是说是数据源中的每一条,也就是列表list中的每一条(Task对象)。

所以,对于DataBinder.Eval(Container.DataItem,"StartDate"),参数Container.DataItem确定了将从某一个Task对象里取数据,StartDate指定了待取数据的访问路径。所以,这句话这么写也是OK的,DataBinder.Eval(Container," DataItem.StartDate"),即Container指定了将从一个DataGridItem里取数据,数据的访问路径是DataItem.StartDate。

 

在msdn上没有找到Container的解释,把<%#Container %>放到DataGrid的TemplateColumn里,得到的是DataGridItem,把<%#Container %>放到一个table下面,得到是ASP.TaskList_aspx,所以猜测通过Container,可以引用到当前控件所在的容器(解释的不够准确)

 

3.那么,DataBinder.Eval的第一个参数不用Container可不可以呢?是可以的:

<%#DataBinder.Eval(PageTitle,"Text")%>,假设PageTitle是一个Label,那么这句话就绑定到了PageTitle的Text属性。

结论:

说了这么多,对于所关心的如下结构的数据源怎样通过DataBinder.Eval来绑定呢?

假设数据源如下:

 

IList list = new ArrayList();

Task task 
= new Task();

object[] arr = new object[3];

task.Title 
= "title1";

task.StartDate 
= DateTime.Now;

arr[
0= "nihao";

arr[
1= task;

arr[
2= "wohao";

list.Add(arr); 

task 
= new Task();

task.Title 
= "title2";

task.StartDate 
= DateTime.Now.AddDays(1);

arr 
= new object[[3]];

arr[
0= "nihao";

arr[
1= task;

arr[
2= "wohao";

list.Add(arr);

task 
= new Task();

task.Title 
= "title3";

task.StartDate 
= DateTime.Now.AddDays(2);

arr 
= new object[3];

arr[
0= "nihao";

arr[
1= task;

arr[
2= "wohao";

list.Add(arr);

this.DataGrid1.DataSource = list;

this.Page.DataBind();


那么可以用下面的方法绑定到StartDate

<%#DataBinder.Eval(Container,"DataItem.[1].StartDate","{0:d}")%>

所以,当我们再需要用反射去获得对象的某个属性值的时候,不需要再如下写代码了:

public object GetPropertyValue(object obj,string propertyName)
{
    Type t 
= obj.GetType();
    PropertyInfo info 
= t.GetProperty(propertyName);
    
return info.GetValue(obj,null);
}

上面这样写虽然可以达到效果,但是麻烦,而且对于处理person.Contact.Address这种属性比较麻烦。可以用DataBinder.Eval如下写:

public object GetPropertyValue(object obj,string propertyName)
{
    
return DataBinder.Eval(obj,propertyName);
}
分享到:
评论

相关推荐

    DataBinder.Eval总结

    `DataBinder.Eval` 是ASP.NET中用于在控件中绑定数据的一个非常重要的方法,它允许开发者在ASP.NET页面上动态地从数据源获取值并显示。本文将深入探讨 `DataBinder.Eval` 的基本使用方式,高效用法,以及如何实现...

    [ASP_NET]DataBinder_Eval用法_學習 積累 進步

    在ASP.NET开发中,DataBinder.Eval是一个非常重要的方法,用于在控件绑定数据时从数据源中动态地获取和显示数据。这个方法是ASP.NET数据绑定表达式的一部分,广泛应用于GridView、Repeater、ListView等数据绑定控件...

    深入理解Asp.net中DataBinder.Eval的用法总结

    在Asp.net开发中,DataBinder.Eval是一个非常常用的数据绑定方法,主要用于在控件中显示数据源中的字段值。本文将深入探讨DataBinder.Eval的用法,并提供多个示例来帮助理解。 1. 基本用法 DataBinder.Eval方法的...

    浅析DataBinder.Eval和Eval的区别

    本文将深入探讨两种常见的数据绑定方法:`DataBinder.Eval`和`Eval`,以及它们之间的区别。 `Eval`方法是在ASP.NET 2.0引入的简化数据绑定语法,它使得模板中的数据绑定更加简洁。`Eval`方法可以直接通过字段名来...

    ASP.NET完全入门

    Eval方法与DataBinder.Eval一样可以接受一个可选的格式化字符串参数。缩短的Eval语法与DataBinder.Eval的不同点在于,Eval会根据最近的容器对象(例如DataListItem)的DataItem属性来自动地解析字段,而DataBinder....

    EVAL操作集合 包含Eval()的一些常用操作 常用函数

    2. 使用Eval()方法可以计算字符串,例如:&lt;%# DataBinder.Eval(Container.DataItem, "[n]") %&gt; 3. Eval()方法可以绑定字段,并实现自动编号,例如:&lt;%# Container.DataItemIndex + 1%&gt; 4. Eval()方法可以格式化字符...

    揭秘ASP.NET 2.0的Eval方法.doc

    在ASP.NET 1.x中,数据绑定表达式的标准形式是使用`DataBinder.Eval`方法,例如: ``` &lt;%#DataBinder.Eval(Container,"DataItem.Name")%&gt; ``` 而在ASP.NET 2.0中,同样的功能可以通过更简洁的语法实现: ``` &lt;%#Eval...

    设计一个简单的网页

    d&gt; 可能感兴趣的人:"&gt; ... &lt;%# DataBinder.Eval(Container.DataItem, "Name")%&gt; &lt;%# DataBinder.Eval(Container.DataItem, "Sex")%&gt; &lt;%# DataBinder.Eval(Container.DataItem, "myEmail")%&gt; &lt;/td&gt;

    AspNetPager1

    &lt;td&gt;&lt;%#DataBinder.Eval(Container.DataItem,"Activation")%&gt; &lt;td&gt;&lt;%#DataBinder.Eval(Container.DataItem, "DealerId")%&gt; &lt;td&gt;&lt;%#DataBinder.Eval(Container.DataItem, "UserId")%&gt; &lt;td&gt;&lt;%#DataBinder.Eval...

    ASO.NET前台页面绑定数据大全

    **Eval()** 和 **DataBinder.Eval()** 是两种常用的数据绑定表达式,用于在ASP.NET中获取数据项的值。它们的主要区别在于,DataBinder.Eval() 提供了更多的灵活性和安全性。 1. **Eval()** 的基本用法: ```html ...

    C# aspx数据绑定方法集.doc

    `DataBinder.Eval`是ASP.NET早期版本中使用的数据绑定方法,虽然在ASP.NET 2.0中引入了简化的`Eval`语法,但在某些场景下,可能还需要使用`DataBinder.Eval`来进行更复杂的操作,如格式化输出等。 **示例**: ```...

    C#(ASP.NET)DateTime日期类型格式化显示

    DataBinder.Eval(Container.DataItem,"starttime","{0:yyyy-M}") 7.显示时间所有部分,包括:年月日时分秒 收款时间" HeaderText="收款时间" DataFormatString="{0:yyyy-MM-dd HH24:mm:ss}"&gt; &lt;/asp:BoundColumn&gt; ...

    ASP.NET Eval 求值运算的一些用法

    &lt;&#37;# Bind(“Subject”) %&gt; //绑定字段 &lt;&#37;# Container.DataItemIndex + 1%&gt; //实现自动编号 &lt;&#37;# DataBinder.Eval&#40;Container.DataItem, “[n]”&#41...# DataBinder.Eval(Container, “DataItem

    C# 列表的下拉框联动.pdf

    &lt;ItemStyle CssClass="dxgv"&gt;&lt;/...&lt;asp:Label ID="lb_week_p" runat="server" Text='&lt;%# DataBinder.Eval&#40;Container, "DataItem.PLANTKEY"&#41; %&gt;'&gt; 宋体"&gt; &lt;asp:ListItem Selected="True" Value=""&gt;---- ...

    DataList绑定到Row[]行集合的问题的方法

    # DataBinder.Eval&#40;Container.DataItem,”fldName”&#41; %&gt;时,编译时将会出现 “DataBinder.Eval:“System.Data.DataRow”不包含名称为 fldName 的属性” 的错误 解决办法:将 &lt;&#37;# DataBinder...

    实用的代码

    这里使用`DataBinder.Eval`方法获取`DataItem`中的`begtime`属性值,并将其转换为`System.DateTime`类型,最后使用`ToShortDateString`方法格式化为短日期形式。 #### 6. 创建超链接 ```csharp // 创建超链接 CODE:...

Global site tag (gtag.js) - Google Analytics