databind,数据绑定(DataBind)是什么意思?有什么用处啊?
databind,数据绑定(DataBind)是什么意思?有什么用处啊?详细介绍
本文目录一览: 数据绑定(DataBind)是什么意思?有什么用处啊?
数据绑定是将cs文件中的变量、对象等数据显示在aspx文件中某个控件上的一种手段
aspx文件中的<%#
%>是绑定语句定界符,其内部可以书写一个c#表达式(可以是一个cs文件中的变量,或者算式)
当cs文件中的程序运行到控件的DataBind()方法,或其容器的DataBind()方法时,绑定语句中的表达式就会被求值,在页面发送给客户端时,整个绑定语句将被绑定表达式的值替换。如果cs文件中的程序没有执行DataBind()方法,aspx文件中的绑定语句在发送给客户端时将被忽略
由于所有控件都放在来Page类中,所以执行Page.DataBind();将会为页面中所有的绑定语句求值
许多控件都支持绑定数组,ArrayList,DataSet等数据源对象
其操作过程一般是
先准备好数组、ArrayList或DataSet等数据源
设置要绑定数据的控件的DataSource属性为准备好的数组、ArrayList或者DataSet
调用控件的DataBind方法实现数据绑定
假定aspx页面上由一个dropdownlist控件,其处于未绑定状态,id为
DL
在cs文件的Page_Load方法中加入如下代码
string[]
a=new
string[]{“aa”,”bb”,”cc”,”dd”};
DL.DataSource=a;
DL.DataBind();
许多控件可以绑定到DataSet对象或者DataReader对象,例如GridView对象可以被绑定到DataSet对象以后,可以在表格中以文本的形式显示DataSet中的数据
数据库绑定控件不仅可以绑定诸如Dataset等ado.net对象,还可以绑定数据源控件。数据源控件封装了ado.net对象,很多简单应用,可以使用数据源控件与数据绑定控件组合来完成,而不用书写任何代码就可以完成数据库的读写和数据的显示
这个都是图形化操作,例子很麻,你要要的话
我可以给你发一个
DataBinder 是 类型 ,但此处被当做 变量 来使用 是怎么回事
DataBinder()被当做了方法,使用的是DataBinder()的返回值,故作为变量使用。如果要做类类型,可以在DataBinder().前面加new,即new DataBinder().Eval(Container.DataItem,"ItemID")实例化一个对象,如果Eval()为静态方法,应该DataBinder.Eval(Container.DataItem,"ItemID")。希望对你有帮助
下拉框DataBind()是什么意思
这是一种数据绑定方式,请参考下文:
下拉框数据绑定两种方式
1、利用cs包,DataAccess.cs
#regionstring m_str = @"select sname from service group by sname";DataTable m_dt = DataAccess.DBHelper.GetList(m_str);DropDownList2.DataValueField = "sname";DropDownList2.DataTextField = "sname";绑定数据源
this.DropDownList2.DataSource = m_dt;DropDownList2.DataBind();DropDownList2.Items.Insert(0, new ListItem("请选择", ""));#endregion1234567891011
而在web.config中
1234
2、
SqlConnection conn = new SqlConnection("Data Source = localhost; database = manager; uid=sa; pwd=sa;");
conn.Open();
//任务类型绑定 #region
SqlDataAdapter sdt = new SqlDataAdapter("select sname from service group by sname", conn);
DataSet dt = new DataSet();
sdt.Fill(dt);
DropDownList2.DataValueField = "sname";
DropDownList2.DataTextField = "sname";
this.DropDownList2.DataSource = dt;
DropDownList2.DataBind();
DropDownList2.Items.Insert(0, new ListItem("请选择", ""));
#endregion
conn.Close();1234567891011121314151617
databind() 和bindgrid()是什么意思啊?
databind()就是数据绑定的意思啊!
将数据绑定到某个控件上面!
例如:datagrid上面了~~dropdownlist上面了~~~
bindgrid()自定义的吧??没听说过!
databind()是数据绑定函数,调用某个控件的databind()方法就开始数据绑定过程,bindgrid()没听说过!自定义函数吧
databind() 未将对象引用设置到对象的实例
你的table不一定存在你就直接拿来用了,1没测试,2没判断,不报错才怪,确定你的return table有值,然后这边最好还是有判断table是不是null,这个情况肯定是你的table没出来
“未将对象引用设置到对象的实例”,一般出现这种问题就是应该实例化的对象没有实例化。
使用try{}catch()捕捉异常看看,我觉得可能是你的GetDataTable那个地方出现了异常,导致没有实例化table
DataTable table = GetDataTable();if(table!=null){ Grid1.DataSource = table; Grid1.DataBind(); }
ASP.NET页面事件
在页面的寿命周期内,Page 对象会公开一些被频繁使用的标准事件。 页面框架在运行时,会自动连接到(连线)这些方法的相应代理实例。这样您就无须编写必要的“粘接代码”。以下列表按激发顺序提供运行时连线的代理实例:Page_Init:出现此事件期间,您可以初始化值或连接可能具有的任何事件处理程序。Page_Load:出现此事件期间,您可以执行一系列的操作来首次创建页面或响应由投递引起的客户端事件。在此事件之前,已还原页面和控件视图状态。使用 IsPostBack 页面属性检查是否为首次处理该页面。如果是首次处理,请执行数据绑定。此外,请读取并更新控件属性。Page_DataBind:在页面级别调用 DataBind 方法时,将引发 DataBind 事件。如果在单个控件上调用 DataBind,则它只激发它下面控件的 DataBind 事件。Page_PreRender:恰好在保存视图状态和呈现控件之前激发 PreRender 事件。您可以使用此事件在控件上执行所有最后时刻操作。Page_Unload:完成页面呈现之后,将激发 Page_Unload 事件。此事件是执行最终清理工作的合适位置。这包括清理打开的数据库连接、丢弃对象或关闭打开的文件等操作。以下列表概括了非确定性事件。Page_Error:如果在页面处理过程中出现未处理的例外,则激发 Error 事件。错误事件为您提供了妥善处理错误的机会。Page_AbortTransaction:如果要指明交易是成功还是失败,交易事件非常有用。此事件通常用于购物车方案,其中此事件可以指示订购是成功还是失败。如果已终止交易,则激发此事件。Page_CommitTransaction:如果已成功提交交易,则激发此事件。
关于gridview的Databind问题
grdFriendInfo.DataSource = ds.Tables[0].ToString();
换成
grdFriendInfo.DataSource = ds.Tables[0];
你把grdFriendInfo.DataSource = ds.Tables[0].ToString();这句的ToString()去了。
数据绑定表达式(下):.NET发现之旅(二)
这一节继续来谈 NET中的数据绑定表达式
本节涉及的内容如下
一 数据绑定方法的来源以及在低层上的实现
二 数据绑定方法的执行效率排序
<%#Container DataItem%><%#GetDataItem()%><%#Eval( 字段名 )%><%#DataBinder Eval(Container DataItem 字段名 )%><%#((DataRowView)Container DataItem)[ 字段名 ] %><%#((Type)Container DataItem) 成员 %><%#((Type)GetDataItem()) 成员 %> 上面七种绑定形式以及它们的变幻形式都用过吗?性能怎么排序?
复习一下 第一节我们主要谈了数据绑定表达式的各种形式 在ASP NET页面中出现的位置 以及我们常绑定到与数据库有关的DataView DataTable DataSet 等数据源的数据绑定表达式的各种形式
你有没有对Eval方法和DataBinder Eval方法好奇过?
在 NET 中我们经常用Eval方法在Repeater DataList GridView等循环控件中绑定数据 Eval方法和DataBinder Eval方法在低层是怎么实现的?它们到底有什么千丝万缕的关系?
一 来源 实现
我们常用的Eval方法其实是Page类的一个静态单向只读方法 而且它是一个受保护的方法 实际上Page类的Eval方法是继承自TemplateControl类的 TemplateControl 类是一个抽象类 它为Page 类和 UserControl 类提供通用属性和方法 我们先来看一下继承家谱
System Object System Web UI Control System Web UI TemplateControl System Web UI Page System Web UI UserControl Eval方法就是TemplateControl类的方法 它有两种形式
名称 说明 TemplateControl Eval (String) 计算数据绑定表达式 TemplateControl Eval (String String) 使用用于显示结果的指定格式字符串计算数据绑定表达式
事实上TemplateControl类还提供了XPath方法和XPathSelect方法供Page类和UserControl继承 这 个方法是和XML数据源有关的绑定方法
如果细心的你查看TemplateControl类的基类Control类 你就会发现其实Control类并没有提供Eval XPath XPathSelect等方法 所以Eval XPath等方法最终是在TemplateControl类中实现的
现在 终于找到了Eval XPath等数据绑定方法的来源了
Eval XPath等方法是 NET 新增的方法 在 NET 时代我们经常用的是DateBinder Eval方法 形如
<%#DataBind Eval(Container DataItem 字段名 ) %>
<%#DataBind Eval(Container DataItem 字段名 { c} ) %>
Eval的出现其实就是为了简化DataBinder Eval方法的写法从而代替它
在ASP NET 中及以上 当我们调用Eval时 Eval 方法会使用GetDataItem方法调用DataBinder Eval方法计算表达式的值 要想理解这句话 就算查边MSDN也一头雾水 除非我们知道Eval方法的源代码 否则根本找不到蛛丝马迹 这里就要用到反射了 我们通过反射获得了Eval方法的源代码
protected internal object Eval(string expression)
{
this CheckPageExists()
return DataBinder Eval(this Page GetDataItem() expression)
}
终于见到GetDataItem()方法了 其实它就是Page类的一个方法 也是 NET 新增一个方法 GetDataItem()方法的作用是为了获得Container DataItem 它是 NET 中用来代替Container DataItem的 如果你曾经用Repeater和DataList等绑定过数组或者ArrayList等 你就会发现<%#GetDataItem()%>和<%#Container DataItem%>等价 同时 可以肯定 Eval方法在低层上确实是调用DataBinder Eval方法实现数据绑定的 其中 this CheckPageExists() 是检查调用的时候有没有Page对象的 如果没有则会抛出一个异常
要弄清Eval是怎么工作的 GetDataItem()方法的低层实现我们也要用反射来获取
public object GetDataItem()
{
if ((this _dataBindingContext == null) || (this _dataBindingContext Count == ))
{
throw new InvalidOperationException(SR GetString( Page_MissingDataBindingContext ))
}
return this _dataBindingContext Peek()
}
我们从GatDataItem()方法中看到 return this _dataBindingContext Peek() 很快就猜想_dataBindingContext是不是一个堆栈呢?事实它就是一个堆栈!通过反射查看源代码我们得出 _dataBindingContext是一个Stack类型对象 所以它有Peek方法 return this _dataBindingContext Peek() 正是把堆栈顶部的元素返回 而if语句是用来判断这个堆栈是否已经存在或者是否已经有元素存在 如果if不成立 就会抛出一个异常
从上面的分析我们知道 _dataBindingContext堆栈的作用是通过GetDataItem()方法这个桥梁向Eval方法提供Container DateItem 用逆向思维来理解上面这句话 Eval方法可以自动计算出Container DataItem 原因就是从dataBindingContext堆栈来获取Container DataItem 这也就为什么Eval方法能够知道形如<%#Eval 字段名 %>中字段名隶属于哪个数据项的属性的原因 同时我们也知道 NET 中的Eval在本质上的实现并没有抛弃Container DataItem 而Container DataItem在 时代也没有消失
那么_dataBindingContext这个保存Container DataItem的堆栈是怎么建立的呢?
我们很快就想到每次绑定控件时候最后那条语句是什么 this 控件ID DataBind() 对就是DataBind()方法 DataBind()方法还有一个重载 DataBind(bool raiseOnDataBinding) 为_dataBindingContext这个堆栈压入元素和弹出元素的方法正是用DataBind(bool flag)这个重载方法实现的
DataBind(bool raiseOnDataBinding)在低层的实现
protected virtual void DataBind(bool raiseOnDataBinding) { bool flag = false;//这个标志的用处在上下文中很容易推出来 如果有DataItem压栈 则在后面出栈 if (this IsBindingContainer)//判断控件是不是数据绑定容器 实际上就是判断控件类是不是实现了INamingContainer { bool flag ; object obj = DataBinder GetDataItem(this out flag );//这个方法是判断控件是不是有DataItem属性 并把它取出来 if (flag && (this Page != null))//如果控件有DataItem { this Page PushDataBindingContext(obj );//把DataItem压栈 PushDataBindingContext就是调用_dataBindingContext的Push方法 flag = true; } } try { if (raiseOnDataBinding)//这里是判断是不是触发DataBinding事件的 { this OnDataBinding(EventArgs Empty); } this DataBindChildren();//对子控件进行数据绑定 如果这个控件有DataItem 则上面会将DataItem压入栈顶 这样 在子控件里面调用Eval或者GetDataItem方法 就会把刚刚压进去的DataItem给取出来 } finally { if (flag )//如果刚才有压栈 则现在弹出来 { this Page PopDataBindingContext();//PopDataBindingContext就是调用_dataBindingContext的Pop方法 } } } 当我们执行到this 控件ID DataBind() 时候 在低层上就会调用这个重载的方法来准备包含DataItem的_DatBindingContext堆栈
上面的代码中提到了DataBinding事件 那么它一般什么时候被触发呢?
1 如果用编程方式 那么在我们调用DataBind()方法时候自动触发DataBinding事件
2 如果我们用数据源控件(例如SqlDataSource等) 当把控件绑定到数据源控件时候 这个事件就会自动触发
一般数据绑定表达式常常放在模板中循环显示数据 例如Repeater和DataList等的模板 那么下面这个知识点应该知道 Repeater DataList FormView等控件必须使用模板 如果不使用模板 这些控件将无法显示数据 而GridView DetailsView Menu等控件也支持模板 但显示数据时不是必须的 而TreeView控件不支持模板
注意 一般情况下 数据绑定表达式不会自动计算它的值 除非它所在的页或者控件显示调用DataBind()方法 DataBind()方法能够将数据源绑定到被调用的服务器控件及其所有子控件 同时分析并计算数据绑定表达式的值
终于写的有点眉目了 好累!我们该回头看看Eval方法调用的静态DataBinder Eval方法在低层的实现了 我把DataBinder类的源代码作为附近提供下载
二 执行效率
从 一 讲述的低层实现 我们很容易来排序下面数据绑定表达式的执行效率<%#Container DataItem%><%#GetDataItem()%><%#Eval( 字段名 )%><%#DataBinder Eval(Container DataItem 字段名 )%><%#((DataRowView)Container DataItem)[ 字段名 ] %><%#((Type)Container DataItem) 成员 %><%#((Type)GetDataItem()) 成员 %> 效率最高应该是 <%#((Type)Container DataItem) 成员 %><%#Container DataItem%><%#((DataRowView)Container DataItem)[ 字段名 ] %> 效率排第二的是 <%#((Type)GetDataItem()) 成员 %><%#GetDataItem()%> 效率最低的是 <%#Eval( 字段名 )%><%#DataBinder Eval(Container DataItem 字段名 )%> 其实按上面的排序有失公允 原因是这七种数据表达绑定形式运用的场合不是完全相同的
使用场合大概如下
|<%#Eval( 字段名 )%><%#DataBinder Eval(Container DataItem 字段名 )%> 它们的使用场合最广 数据源可以为与数据库有关的DataSet DataTable DataView 也可以为普通集合(例如 数组 ArrayList HashTable等)和泛行集合(例如 List
Dictionary
等)
注 它们 个永远可以相互替换 至少目前是这样 凡是可以用Eval方法的地方 就可以用DataBinder Eval方法替换 从低层实现上 Eval比DataBinder Eval方法效率稍低 原因是Eval方法对了调用GetDataItem()方法这一步 但最终都是通过DataBinder Eval方法利用反射技术根据名称查找属性 从而计算出表达式的值 所以非常影响性能
<%#((DataRowView)Container DataItem)[ 字段名 ] %>
它只能使用在数据源为与数据库有关的Dataset DatTable DataView 这些数据源都实现了IListSource接口 其实从低层实现本质上来看 它和<%#((Type)Container DataItem) 成员 %>类似
lishixinzhi/Article/program/net/201311/11866
C#中关于DataBind()方法的问题
用DataourceId属性就不需要用DataBind()方法
如果用DataSource属性就必须要用DataBind()
this.GridView1.DataBind();是干嘛用的啊?
就是开始绑定数据,是关联到DS数据集的表列上的操作