读书人

DataBinder.Eval步骤研究

发布时间: 2012-10-29 10:03:53 作者: rapoo

DataBinder.Eval方法研究

?

?

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

?

?

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

DataBinder.Eval步骤研究public?static?object?Eval(object?container,string?expression);
DataBinder.Eval步骤研究public?static?object?Eval(object?container,string?expression,string?format);
DataBinder.Eval步骤研究

假设后台代码如下:

DataBinder.Eval步骤研究IList?list?=?new?ArrayList();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究Task?task?=?new?Task();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.Title?=?"title1";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.StartDate?=?DateTime.Now;
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究list.Add(task);
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task?=?new?Task();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.Title?=?"title2";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.StartDate?=?DateTime.Now.AddDays(1);
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究list.Add(task);?
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task?=?new?Task();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.Title?=?"title3";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.StartDate?=?DateTime.Now.AddDays(2);
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究list.Add(task);?
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究this.DataGrid1.DataSource?=?list;
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究this.DataGrid1.DataBind();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究


那么,常用的方式如下:

DataBinder.Eval步骤研究<asp:datagrid?runat=server?id=”DataGrid1”>
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究<Columns>
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究<asp:TemplateColumn?HeaderText="开始日期">
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究??<ItemTemplate>?????
DataBinder.Eval步骤研究DataBinder.Eval步骤研究????<%DataBinder.Eval步骤研究#DataBinder.Eval(Container.DataItem,"StartDate","{0,d}")%>
DataBinder.Eval步骤研究??</ItemTemplate>
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究</asp:TemplateColumn>
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究</Columns>
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究</asp:datagrid>
DataBinder.Eval步骤研究

分析:

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

DataBinder.Eval步骤研究<asp:TemplateColumn?HeaderText="test">
DataBinder.Eval步骤研究<ItemTemplate>
DataBinder.Eval步骤研究DataBinder.Eval步骤研究<%DataBinder.Eval步骤研究#Container.DataItem%>
DataBinder.Eval步骤研究</ItemTemplate>
DataBinder.Eval步骤研究</asp:TemplateColumn>
DataBinder.Eval步骤研究

运行结果如下图:
DataBinder.Eval步骤研究

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

所以,这里的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来绑定呢?

DataBinder.Eval步骤研究

假设数据源如下:

?

DataBinder.Eval步骤研究IList?list?=?new?ArrayList();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究Task?task?=?new?Task();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究object[]?arr?=?new?object[3];
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.Title?=?"title1";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.StartDate?=?DateTime.Now;
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[0]?=?"nihao";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[1]?=?task;
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[2]?=?"wohao";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究list.Add(arr);?
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task?=?new?Task();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.Title?=?"title2";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.StartDate?=?DateTime.Now.AddDays(1);
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr?=?new?object[[3]];
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[0]?=?"nihao";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[1]?=?task;
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[2]?=?"wohao";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究list.Add(arr);
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task?=?new?Task();
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.Title?=?"title3";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究task.StartDate?=?DateTime.Now.AddDays(2);
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr?=?new?object[3];
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[0]?=?"nihao";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[1]?=?task;
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究arr[2]?=?"wohao";
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究list.Add(arr);
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究this.DataGrid1.DataSource?=?list;
DataBinder.Eval步骤研究
DataBinder.Eval步骤研究this.Page.DataBind();
DataBinder.Eval步骤研究


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

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

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

DataBinder.Eval步骤研究public?object?GetPropertyValue(object?obj,string?propertyName)
DataBinder.Eval步骤研究DataBinder.Eval步骤研究DataBinder.Eval步骤研究{
DataBinder.Eval步骤研究????Type?t?=?obj.GetType();
DataBinder.Eval步骤研究????PropertyInfo?info?=?t.GetProperty(propertyName);
DataBinder.Eval步骤研究????return?info.GetValue(obj,null);
DataBinder.Eval步骤研究}
DataBinder.Eval步骤研究

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

DataBinder.Eval步骤研究public?object?GetPropertyValue(object?obj,string?propertyName)
DataBinder.Eval步骤研究DataBinder.Eval步骤研究DataBinder.Eval步骤研究{
DataBinder.Eval步骤研究????return?DataBinder.Eval(obj,propertyName);
DataBinder.Eval步骤研究}

读书人网 >其他相关

热点推荐