项目模板中的 <%# DataBinder.Eval(Container.DataItem,"ColumnName") %> 究竟做了啥?

Posted

技术标签:

【中文标题】项目模板中的 <%# DataBinder.Eval(Container.DataItem,"ColumnName") %> 究竟做了啥?【英文标题】:What does <%# DataBinder.Eval(Container.DataItem,"ColumnName") %> in the Item Template do exactly?项目模板中的 <%# DataBinder.Eval(Container.DataItem,"ColumnName") %> 究竟做了什么? 【发布时间】:2011-06-16 09:11:27 【问题描述】:

我是第一次使用DataList。一切正常,我可以在屏幕上看到数据。 我正在项目模板中使用此代码。

<asp:DataList ID="DataList1" runat="server">
    <FooterTemplate>          
    </FooterTemplate>
    <HeaderTemplate>              
    </HeaderTemplate>
    <ItemTemplate>          
        <%# DataBinder.Eval(Container.DataItem,"AA") %>
        <%# DataBinder.Eval(Container.DataItem,"BB") %>
        <%# DataBinder.Eval(Container.DataItem,"CC") %>
    </ItemTemplate>
</asp:DataList>

这是我绑定的DataTable

DataTable dt = new DataTable();
dt.Columns.Add("AA");
dt.Columns.Add("BB");
dt.Columns.Add("CC");

dt.Rows.Add("1", "2", "3");
dt.Rows.Add("10", "20", "30");
dt.Rows.Add("100", "200", "300");
dt.Rows.Add("1000", "2000", "3000");

DataList1.DataSource = dt;
DataList1.DataBind();

DataBinder.Eval(Container.DataItem,"ColumnName") 究竟做了什么。? 提前谢谢你

【问题讨论】:

以下答案的附录。由于DataBinder.Eval(Container.DataItem,"memberName")late-bound,因此性能会受到影响。请参阅这篇文章以了解早期绑定 - 因此更高效且对调试更友好 - 语法:devcurry.com/2011/02/how-to-avoid-databindereval-in-aspnet.html 【参考方案1】:

参数1:Container.DataItem 指的是绑定到当前容器的datasource

论据 2:DataItem 上应评估的公共属性。

所以 Eval 使用反射来评估 DataItem 上的公共属性。

例如:

在您的情况下,它会评估 DataTable 上的 BB 列。

【讨论】:

【参考方案2】:

以下行将执行的次数与表中的行数一样多。

<%# DataBinder.Eval(Container.DataItem,"AA") %>
<%# DataBinder.Eval(Container.DataItem,"BB") %>
<%# DataBinder.Eval(Container.DataItem,"CC") %>

每次Container.DataItem都会有数据表中对应的DataRowView行。

项目中发生的事情与此代码类似。

DataView dataView = new DataView(dt);
foreach (DataRowView dataRow in dataView)
              
    System.Diagnostics.Debug.WriteLine(DataBinder.Eval(dataRow,"AA").ToString());
    System.Diagnostics.Debug.WriteLine(DataBinder.Eval(dataRow,"BB").ToString());
    System.Diagnostics.Debug.WriteLine(DataBinder.Eval(dataRow,"CC").ToString());

而得到的输出将是

1 2 3 10 20 30 100 200 300 1000 2000 3000

【讨论】:

以上是关于项目模板中的 <%# DataBinder.Eval(Container.DataItem,"ColumnName") %> 究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

Eval与DataBinder.Eval的区别

<%# Eval("State") %> 或 <%# DataBinder.Eval(Container.DataItem, "state")

无法在 http 会话中的休眠对象上使用 DataBinder

Databinder.Eval 和 Container.DataItem 有啥区别?

Gradle 找不到 com.android.databinding:dataBinder:1.0-rc0

在 asp.net 控件的样式属性中使用 DataBinder.Eval()