今天在用DataList的模板列的时候习惯性地像在03中那样去给模板列的绑定字段加个处理函数:

< asp:Label ID = " Label1 " runat = " server " Text = ' <%#ConvertState(Bind("Status"))%> ' ></ asp:Label >

可是竟然出错:当前上下文中不存在名称“Bind” 。    
     后来又习惯性地想把绑定字段单独拿出来显示,又提示:警告 2 设计器文件生成失败: 必须将对 Bind 的调用分配给模板中的控件的属性。 感觉很郁闷,于是把Bind换成Eval一点问题都没了。

< asp:Label ID = " Label1 " runat = " server " Text = ' <%#ConvertState(Eval("Status"))%> ' ></ asp:Label >

上网查一下才发现二者的区别:

eval()方法在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。它一般用在绑定时需要格式化字符串的情况下。多数情况尽量少用此方法

Eval 方法是静态(只读)方法,该方法采用数据字段的值作为参数并将其作为字符串返回。Bind 方法支持读/写功能,可以检索数据绑定控件的值并将任何更改提交回数据库。

使用 Eval 方法
Eval 方法可计算数据绑定控件(如 GridView、DetailsView 和 FormView
控件)的模板中的后期绑定数据表达式。在运行时,Eval 方法调用 DataBinder 对象的 Eval
方法,同时引用命名容器的当前数据项。命名容器通常是包含完整记录的数据绑定控件的最小组成部分,如 GridView
控件中的一行。因此,只能对数据绑定控件的模板内的绑定使用 Eval 方法。

Eval 方法以数据字段的名称作为参数,从数据源的当前记录返回一个包含该字段值的字符串。可以提供第二个参数来指定返回字符串的格式,该参数为可选参数。字符串格式参数使用为 String 类的 Format 方法定义的语法。

使用 Bind 方法
Bind 方法与 Eval 方法有一些相似之处,但也存在很大的差异。虽然可以像使用 Eval 方法一样使用 Bind 方法来检索数据绑定字段的值,但当数据可以被修改时,还是要使用 Bind 方法。

在 ASP.NET 中,数据绑定控件(如 GridView、DetailsView 和 FormView
控件)可自动使用数据源控件的更新、删除和插入操作。例如,如果已为数据源控件定义了 SQL Select、Insert、Delete 和
Update 语句,则通过使用 GridView、DetailsView 或 FormView 控件模板中的 Bind
方法,就可以使控件从模板中的子控件中提取值,并将这些值传递给数据源控件。然后数据源控件将执行适当的数据库命令。出于这个原因,在数据绑定控件的
EditItemTemplate 或 InsertItemTemplate 中要使用 Bind 函数。

Bind 方法通常与输入控件一起使用,例如由编辑模式中的 GridView 行所呈现的 TextBox 控件。当数据绑定控件将这些输入控件作为自身呈现的一部分创建时,该方法便可提取输入值。

Bind 方法采用数据字段的名称作为参数,从而与绑定属性关联,如下面的示例所示:

< EditItemTemplate >
    < table >
      < tr >
        < td align = right >
          < b > Employee ID: </ b >
        </ td >
        < td >
          <% # Eval( " EmployeeID " ) %>
        </ td >
      </ tr >
      < tr >
        < td align = right >
          < b > First Name: </ b >
        </ td >
        < td >
          < asp:TextBox ID = " EditFirstNameTextBox " RunAt = " Server "
            Text = ' <%# Bind("FirstName") %> ' />
        </ td >
      </ tr >
      < tr >
        < td align = right >
          < b > Last Name: </ b >
        </ td >
        < td >
          < asp:TextBox ID = " EditLastNameTextBox " RunAt = " Server "
              Text = ' <%# Bind("LastName") %> '    />
        </ td >
      </ tr >
      < tr >
        < td colspan = " 2 " >
          < asp:LinkButton ID = " UpdateButton " RunAt = " server "
            Text = " Update " CommandName = " Update " />
          
          < asp:LinkButton ID = " CancelUpdateButton " RunAt = " server "
            Text = " Cancel " CommandName = " Cancel " />
        </ td >
      </ tr >
    </ table >
 </ EditItemTemplate >
 
单击行的 Update 按钮时,使用 Bind 语法绑定的每个控件属性值都会被提取出来,并传递给数据源控件以执行更新操作。

使用 DataBinder.Eval
ASP.NET 提供了一个名为 DataBinder.Eval 的静态方法,该方法计算后期绑定的数据绑定表达式,并将结果格式化为字符串(可选)。利用此方法,可以避免许多在将值强制为所需数据类型时必须执行的显式强制转换操作。

例如,在下面的代码片段中,一个整数显示为货币字符串。使用标准的 ASP.NET 数据绑定语法,必须首先强制转换数据行的类型以便检索数据字段 IntegerValue。然后,这将作为参数传递到 String.Format 方法:

<% # String.Format( " {0:c} " , ((DataRowView)Container.DataItem)[ " IntegerValue " ]) %>

将此语法与 DataBinder.Eval
的语法进行比较,后者只有三个参数:数据项的命名容器、数据字段名称和格式字符串。在模板化列表中(如 DataList 类、DataGrid 类或
Repeater 类),命名容器始终是 Container.DataItem。

<% # DataBinder.Eval(Container.DataItem, " IntegerValue " , " {0:c} " ) %>

格式字符串参数是可选的。如果它被忽略,DataBinder.Eval 将返回类型对象的值,如下面的示例所示:
 <% # ( bool )DataBinder.Eval(Container.DataItem, " BoolValue " ) %>
当对模板化列表中的控件进行数据绑定时,DataBinder.Eval 特别有用,因为数据行和数据字段通常都必须强制转换。

在TemplateField模板中为了能够有限制的或者取出数据库中某列的值时,可以用Bind和Eval方法来实现。以下是Bind方法的格式,Eval的格式也是和Bind一样的。 Bind("列的名称","显示的格式文")

比如我们要取个日期型的数据,在数据库中列名是updated,数值是2008/06/01。但是想2008年06月01日这样显示,我们可以这样来写Bind("updated", "{0:yyyy年MM月dd日}"),Eval也是如此。

两者都能读取数据中的值,并显示。当我们使用编辑更新操作时,Bind能够自动的将修改的值更新到数据库中,并显示出修改后的值。但是用了Eval却只能得到错误画面,新的数据没有更新到数据库中。

从这点看来,Bind方法和Eval方法的区别就是:Bind方法在读取和更新数据这2方面都是可以,但是Eval方法只能读取显示数据。所以,我们在选
择Bind方法和Eval方法的时候,必须要有争对性,当数据肯定需要更新操作的时候我们应该使用Bind,只是显示数据,不会有任何操作的就可以使用
Eval方法。

在更新操作中我们可以在GridView1_RowUpdating事件中操作,例子如下:

protected void GridView1_RowUpdating( object sender, GridViewUpdateEventArgs e)   
  
{   
  
     //更新行GridViewRow   
  
     GridViewRow row = this .GridView1.Rows[e.RowIndex];   
  
  
  
     //查找更新的控件   
  
     DropDownList present = (DropDownList)row.FindControl( "ddlPresent" );   
  
     TextBox price = (TextBox)row.FindControl( "txtPrice" );   
  
     TextBox updated = (TextBox)row.FindControl( "txtUpdated" );   
  
  
  
     //更新   
  
     e.NewValues[ "present" ] = present.SelectedValue;   
  
     e.NewValues[ "price" ] = price.Text;   
  
     e.NewValues[ "updated" ] = updated.Text;   
  
}  
protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

{

//更新行GridViewRow

GridViewRow row = this.GridView1.Rows[e.RowIndex];

//查找更新的控件

DropDownList present = (DropDownList)row.FindControl("ddlPresent");

TextBox price = (TextBox)row.FindControl("txtPrice");

TextBox updated = (TextBox)row.FindControl("txtUpdated");

//更新

e.NewValues["present"] = present.SelectedValue;

e.NewValues["price"] = price.Text;

e.NewValues["updated"] = updated.Text;

}       如果我们能充分理解Bind方法和Eval方法,其实也就没必要向上面那样去写,都是可以自动完成的。上面的方法除了比较复杂的操作才会用到,这也是一个使用技巧。

Bind和Eval的不同用法 (转)的更多相关文章

  1. Bind和Eval的区别详解

    原文:Bind和Eval的区别详解 1.简单描述Eval和Bind的区别 绑定表达式 <%# Eval("字段名") %> <%# Bind("字段名& ...

  2. Python eval()函数的用法

    Python eval()函数的用法 eval(str)函数很强大,官方解释为:将字符串str当成有效的表达式来求值并返回计算结果.所以,结合math当成一个计算器很好用. eval()函数常见作用有 ...

  3. <%#Eval if判断用法

    1.绑定Repeater 基础用法 <%#Eval("RoleID")%> 2.简单判断用法 <td> <%# Convert.ToBoolean(E ...

  4. jquery中bind事件时的命名空间用法(转)

    场景:页面上的某个元素bind多个click事件处理函数,视用户的具体交互情况来决定到底使用哪个处理函数. 问题: unbind时会解绑所有的click事件,造成误伤.如果之前bind时有定义处理函数 ...

  5. boost::bind 和 boost::function 基本用法

    这是一篇介绍bind和function用法的文章,起因是近来读陈硕的文章,提到用bind和function替代继承,于是就熟悉了下bind和function的用法,都是一些网上都有的知识,记录一下,期 ...

  6. C++11 中function和bind以及lambda 表达式的用法

    关于std::function 的用法:  其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...

  7. Python中eval与exec用法的区别

    Python中eval,exec这两个函数有着相似的输入参数类型和执行功能,因此在用法上经常出现混淆,以至经常用错,程序易抛出错误.下面主要通过这两个函数的语法来阐述区别,并用例子来进一步说明. 首先 ...

  8. Ajax中的eval函数的用法

    eval的定义和使用: Eval它是用来计算某个字符串,并且执行其中的JavaScript代码. 语法: 1) eval函数接受一个string这个参数,并且这个参数是必须的,这个参数就是要计算的这个 ...

  9. 【学习】js学习笔记:内置顶层函数eval()的兼容用法

    今天学了一个内置顶层函数,eval();其作用是将字符串转换成javascript命令执行,但必须符合语法,否则会报错. 如果写成window.eval(),则其定义的变量会在全局生效. 但是,在IE ...

随机推荐

  1. Tensorflow中的命名空间scope

    1.name_scope 在tensorflow中有两种声明变量的方式,tf.get_variable()和tf.Variable(). name_scope对于tf.get_variable()无效 ...

  2. 利用selenium爬取豆瓣电影Top250

    这几天在学习selenium,顺便用selenium + python写了一个比较简陋的爬虫,现附上源码,有时间再补充补充: from selenium import webdriver from s ...

  3. (链接)xcode7,ios9 部分兼容设置

    xcode7,ios9 部分兼容设置 http://www.cnblogs.com/loganv/p/4647833.html

  4. ionic2——环境配置篇

    环境配置 安装nodeJS 配置cnpm 安装ionic2 安装cordova 安装java sdk 安装android sdk(在项目最后打包时app的时候会用到,前期是在浏览器环境测试开发暂时不需 ...

  5. 求一些数字字符参数的和(Java)

    一.思路 输入数字(字符型)参数: 将字符型强制转化为整数型: 求和: 输出: 二.流程图 三.源程序代码及结果

  6. EF 连接oracle 基础连接失败 问题解决

    以此记录今天犯下的错误:

  7. OpenCV-Python在图片上输出中文

    OpenCV中在图片上输出中文一般需要借助FreeType库实现.FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件.但使用FreeType ...

  8. bzoj 4710 分特产

    有 $n$ 个人,$m$ 种物品,每种物品有 $a_i$ 个,求每个人至少分到一个的方案数 $n,m,a_i \leq 2000$ sol: 比上一个题简单一点 还是考虑容斥 每个人至少分到一个 = ...

  9. Yii 常用命令

    一.Yii的Active Recorder包装了很多. 特别是把SQL中 把where,order,limit,IN/not IN,like等常用短句都包含进CDbCriteria这个类中去,这样整个 ...

  10. bzoj 4827 [Hnoi2017]礼物——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4827 式子就是 \sum_{i=0}^{n-1}(a[ i ] - b[ i+k ] + c ...