- 浏览: 244124 次
- 性别:
- 来自: 葡萄牙
文章分类
最新评论
-
lightbulb:
...
jQuery中的动画与效果 -
kendezhu:
opportunity 写道 谢谢kendezhu分享,今天正 ...
jQuery 获取和设置select下拉框的值 -
opportunity:
谢谢kendezhu分享,今天正好用上了!
jQuery 获取和设置select下拉框的值
6.数据源控件
ASP.NET具有强大的数据绑定功能。所谓数据绑定是指数据与控件相互结合的方式。可以绑定到属性,集合,表达式或方
法。大多数服务器控件都提供了对数据绑定的支持。单值绑定允许为控件的某个属性绑定一个变量,表达式或一个函数
。如果绑定后置代码里的变量或函数,必须指定其访问级别为public或protected(包括后面的<%= %>原因:http://kendezhu.iteye.com/admin/blogs/788770)。
语法是<%# %>
如给label的text属性绑定当前时间<asp:Label ID="Label1" runat="server" Text='<#DateTime.Now.ToString()%>'> 这里的绑定没有绑定后置代码里的成员
这时运行页面时没有效果的,要在后置代码中调用Page.DataBind()(根据http://www.cnblogs.com/KingStar/archive/2009/11/11/1600768.html页面生命周期来看,如果没有在控件事件里改变绑定值,放在Page_Load()里即可,在控件事件改变了绑定值的话还是将其放在控件事件里),该方法将对页面上所有的绑定表达式进行计算,也可以用Label1.DataBind()来计算特定控件的绑定表达式,<%# %>语法必须要有*.DataBind()才能绑定,也可以直接放在在页面上而不与控件结合。另外(<%= %>同样可以起到类似绑定后置代码里成员的效果,但其不能与控件结合,不能绑定到控件的属性,只能直接放在页面上)。还可以绑定后置属性,如显示当前网页文件的物理路径:<asp:Label ID="Label1" runat="server" Text='<%#Path%>'>,Path为字符串字段path的属性
private string path = null;
public string Path
{
get { return path; }
set { path = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
path = Server.MapPath(Request.Url.LocalPath);
Page.DataBind();
}
除了单值绑定,ASP.NET还有许多列表控件ListBox,DropDownList,CheckBoxList,RadioButtonList(只能显示一个字段(指向数据集的话)或属性(指向集合类的话))及功能更强大的GridView,DetealsView和FormView控件(能显示所有字段(指向数据集的话)或属性(指向集合类的话))支持重复值绑定。它们所共有的属性有:DataSource(指向数据集合,除DataReader,DataSet,DataTable等数据集以外,还可以是任何实现了ICollection接口的集合类如ArryList和泛型集合类List等)DataSourceID(数据源控件的ID)DataTextField(显示的字段(指向数据集的话)或属性(指向集合类的话))DataTextFormatString(显示的格式)DataValueField(值,对与列表控件可以用SelectedValue属性来获得相应的值)。下面就用DropDownList和RadioButtonList来演示绑定到集合类:
public class people
{
//给people类定义了3个属性
public string Name{get;set;}
public int Age{get;set;}
public string Tel { get; set; }
public people(string name,int age,string tel)
{ Name = name; Age = age; Tel = tel; }
}
使用List集合类要引入using System.Collections.Generic;
public List<people> Getpeople()
{
//Getpeople方法用于初始化people类,并将people实例装进List泛型集合类里,然后返回这个集合类作为数据源
List<people> Lists = new List<people> { new people("李四", 27, 13292828272),new people("王
五",26,15973648274),new people("张三",25,15083726453) };
return Lists;
}
protected void Page_Load(object sender, EventArgs e)
{
if(!Page.IsPostBack)
{
//对DropDownList和RadioButtonList的属性进行设置
List<people> Lists = Getpeople(); //获得数据源
DropDownList1.DataSource = Lists;
DropDownList1.DataTextField = "Name"; //只能绑定一个属性
DropDownList1.DataTextFormatString = "人名:{0}"; //格式
DropDownList1.DataValueField = "Tel"; //值是哪个属性的值
RadioButtonList1.DataSource = Lists;
RadioButtonList1.DataTextField = "Name";
RadioButtonList1.DataTextFormatString = "名字:{0}";
RadioButtonList1.DataValueField = "Tel";
Page.DataBind();
}
}
在开发ASP.NET应用程序时,可以直接使用ADO.NET访问数据库,获得数据源并绑定到ASP.NET服务器控件中,
这个过程需要开发人员编写大量的代码,ASP.NET2.0后提供了一些列的数据源控件,使这些过程大大简化了
。大多数服务器控件都具有DataSourceID属性,使用该属性指定一个数据源控件便建立了数据源与控件之
间的关联。在学习这些数据源控件之前,我们还必须了解一下数据绑定的页面生存周期。数据源控件能完
成两大关键任务(向连接控制提供数据源数据和为数据源更新在控件中所做的更改)。周期如下:(1)创建
Page对象(2)开始页面生命周期,Page.Init和Page.Load事件触发(3)所有控件事件触发(4)如果数据源控件
中有任何更新,则完成更新数据库行为(5)Page.PreRender事件触发(6)数据源控件完成查询,并将查询数据
发送到相连接的控件中。(7)页面输出完成并释放。
每当页面PostBack都会执行这个过程,所以每次数据源控件都会查询一次数据库,造成一定性能开支,可以
在内存中缓存数据以便重用。
ASP.NET3.5包含的数据源控件有:
1.SqlDataSource
该控件在前面的ASP.NET控件中多次使用,它是调用ADO.NET里的类来访问数据库,从而获取数据和更新数据
。使用SqlDataSource可以访问(SQLServer,SQLExpress,Access,Oracle,DB2,MySQL等数据源,只要这些数
据源具有ADO.NET的提供程序)。下面我们来分析一下使用SqlDataSource数据源控件时每步操作产生的代
码:有一步是将连接字符串放到web.config中,除了便于集中管理外,web.config有安全的加密性。再下一
步可以使用自定义的sql语句或存储过程来从数据库检索数据,更多是使用指定表或视图的方式来从数据库
检索数据。如果选择了值返回一行,意思是SQL语句将使用DISTINCT查询。ORDERBY就不说了。当配置完以
后(选择了生成增删改语句)代码如下:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:newsystemConnectionString %>"
SelectCommand="SELECT [id], [content], [newsid] FROM [comment]"
InsertCommand="INSERT INTO [comment] ([content], [newsid]) VALUES (@content,@newsid)"
DeleteCommand="DELETE FROM [comment] WHERE [id] = @id"
UpdateCommand="UPDATE [comment] SET [content] = @content, [newsid] = @newsid WHERE
[id] = @id">
<InsertParameters>
<asp:Parameter Name="content" Type="String" />
<asp:Parameter Name="newsid" Type="Int32" />
</InsertParameters>
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="content" Type="String" />
<asp:Parameter Name="newsid" Type="Int32" />
<asp:Parameter Name="id" Type="Int32" />
</UpdateParameters>
</asp:SqlDataSource>
重要属性有ConnectionString(指定连接字符串,还可以直接在其属性中指定连接字符串)另外还有一个属
性providerName(当使用SQLServer数据源时默认就是System.Data.SqlClient,但当使用其他数据源时就要
使用该属性了)***Command(指定执行的SQL语句)。
在选择生成增删改语句时,还有一个是否使用开发式并发(就是对当多个人同时执行了相同的更新和删除操作的处理,选择了的话,执行SQL语句时会对每个参数进行检查,如果不符合查询要求,那么更新和删除操作将会失败。有俩属性ConflictDetection:冲突检测的方式CompareAllValues表示比较所有值,OldValuesParameterFormatString:表示在DeleteCommand和UpdateCommand中,where子句中原始数据字段的格式,后面要加{0})。选择后代码如下:
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConflictDetection="CompareAllValues"
ConnectionString="<%$ ConnectionStrings:newsystemConnectionString %>"
DeleteCommand="DELETE FROM [comment] WHERE [id] = @original_id AND [content] = @original_content AND [newsid] = @original_newsid"
InsertCommand="INSERT INTO [comment] ([content], [newsid]) VALUES (@content, @newsid)"
OldValuesParameterFormatString="original_{0}"
SelectCommand="SELECT [id], [content], [newsid] FROM [comment]"
UpdateCommand="UPDATE [comment] SET [content] = @content, [newsid] = @newsid WHERE [id] = @original_id AND [content] = @original_content AND [newsid] = @original_newsid">
<DeleteParameters>
<asp:Parameter Name="original_id" Type="Int32" />
<asp:Parameter Name="original_content" Type="String" />
<asp:Parameter Name="original_newsid" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="content" Type="String" />
<asp:Parameter Name="newsid" Type="Int32" />
<asp:Parameter Name="original_id" Type="Int32" />
<asp:Parameter Name="original_content" Type="String" />
<asp:Parameter Name="original_newsid" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="content" Type="String" />
<asp:Parameter Name="newsid" Type="Int32" />
</InsertParameters>
</asp:SqlDataSource>
在讲GridView和DetealsView时都讲过主从表的效果,这其实就是对参数的过滤,只不过参数的值是从
GridView或DetealsView的selectedValue(在GridView或DetealsView中就是指选择的行的主键的值)中获
得。当然也可以从其他控件的某个属性获得,如DropDownList的selectedValue(在DropDownList中指选择的项的值)
当在where子句中添加了参数过滤后,SelectCommand="SELECT [id], [content], [newsid] FROM
[comment] WHERE ([newsid] = @newsid)",SelectCommand属性就在后面加了过滤条件,我们在去看看这个
值是从哪得到的:<SelectParameters>
<asp:ControlParameter ControlID="DropDownList2" Name="newsid"
PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
是从DropDownList2的SelectedValue中得到的。你也许发现了,在选择源的时候有6种源(Contol(控
件),Cookie,Session,Form,QueryString(请求字符串),Profile),可以为它们的值设置默认值在
DefaultValue里设置。这6种源对应到代码里就是6种参数ControlParameter(其中PropertyName属性就是
指从指定控件的哪个属性中获得值,许多控件有自己的默认属性GridView或DetealsView的
selectedValue,DropDownList的selectedValue,CheckBox的Checked,FileUpload的FileBytes,Calendar的
SelectedDate,TreeView的SelectedValue等)FormParameter(Html窗体字段的值)
CookieParameter(不说了)SessionParameter(不说了)ProfileParameter(当前用户配置文件中的属性的值
,PropertyName属性指定配置文件的属性的名称)QueryStringParameter(不说了)。
SqlDataSource提供了很多事件供编程时调用Selecting(查询之前触发)Selected(查询之后触发)
Inserting,Inserted,Updating,Updated,Deleting,Deleted。在前面你看到的SelectCommand,
InsertCommand,DeleteCommand,UpdateCommand这四个属性,其实就是一个DbCommand类型(抽象类,SqlCommand和OracleCommand都继承于它,有许多此种类共有的属性如commandtext,commandtype,
Parameters,cancel等)的命令对象,所以SelectCommand="SELECT [id], [content], [newsid] FROM
[comment] WHERE ([newsid] = @newsid)"
就相当于sqlcommand cmd=new sqlcommand();cmd.commandtext="SELECT [id], [content], [newsid] FROM [comment] WHERE ([newsid] =
@newsid)";cmd.sqlconection="....";cmd.commandtype=commandtype.text;然后是执行;
而在这些Sqldatasource事件中有一个SqlDataSource***EventArgs类型的参数,该参数的Command属性(e.command)可以得到一个触发该事件的命令对象(这时的@newsid参数已经有值了),这时你就能任意的操作命令对象所有的属性(commandtext等,也就是说在这里你可以重新定义sql语句等)了。而e.Command.Parameters就是获得当前命令对象的sql语句中的参数集合(相当于cmd.Parameters),在这里自然是@newsid这一个了。同样可以添加,修改参数。当然作为任何集合我们都有遍历它的方法。如果一条语句有多个参数可以e.Command.Parameters[x].Value来获得某个参数的值,实例中经常用来获得一个参数值,然后看该值是否满足某种条件,如果不满足可用e.Cancel=true来取消这条语
句。对于那些ing的事件是可以获得更新前的参数值,而对于ed的事件的e.Command表示获得执行完SQL语句后的命令
对象。
此外SqlDataSource还提供了Select,Insert,Delete,Update这四个方法,可以在任何事件里调用这些方法完成相应的
操作:
protected void Button1_Click(object sender,EventArgs e)
{
SqlDataSource1.Update();
}
2.ObjectDataSource控件:使用SqlDataSource控件操作非常简单,但有一个很大缺陷,SqlDataSource与UI层过于紧密
,造成以后维护和修改的困难。于是便出现了ObjectDataSource控件,该控件是绑定到业务逻辑层提供的数据上。操
作也非常简单,但主要还是要亲自编代码,感觉不如不用ObjectDataSource控件,直接使用ASP.NET三层的思想来做项
目。
3.LinqDataSource控件:.NET Framework3.5引入了功能强大的LINQ(语言集成查询)特性,该特性又可分为LINQ to
Object,LINQ to SQL,LINQ to XML以及一些其他类型的LINQ to xx。LINQ to SQL在数据库的表和对象之间建立了一
个映射(对象就可以表示那个表了),开发人员对映射的对象进行操作,而不用关心底层的实现细节。LINQ可以使用C#
或VB.NET编写实体类的查询,这些操作将被映射为相应的底层SQL操作,用户完全不用担心异构数据源的差异(后面会
讨论该技术)。
LinqDataSource控件将从语言集成查询中获取数据源(从LINQ to SQL实体类(表的映射)中获得数据),当与数据库中
的数据进行交互时,不会将LinqDataSource直接连接到数据库,而是与表示数据库和表的LINQ to SQL实体类(可在O/R
设计器里创建)进行交互,而LinqDataSource与LINQ to SQL实体类的交互是通过一个LINQ to SQL类的DataContext类(数据源实体上下文对象)实现的。DataContext包含它们的交互的连接字符串和用以操作数据库数据的方法,那些对
数据库的增删改查的方法都是默认拥有的,也可以在O/R设计器中将存储过程创建为DataContext的一个方法,当然也
可以自己创建方法到DataContext类中。
新添加LINQ to SQL类后进入O/R设计器可视化创建DataContext,在服务器资源管理器中把要被映射的表拖到右边栏
中形成表实体类,可以把存储过程或函数拖到左边栏从而形成DataContext的方法,右边的Name属性可以设置该
DataContext的名称。单击保存就自动生成代码了,同时也自动引入了System.Data.linq等相关命名空间,最后再重新
生成,至此,我们将数据库的实体类,表的实体类及这些实体类与LinqDataSource的连接管道DataContext都创建好了
。这时只要拖入LinqDataSource和数据绑定控件就可以完成效果了,LinqDataSource的使用与SqlDataSource的使用
大同小异。
最中生成的代码:
<asp:LinqDataSource ID="LinqDataSource1" runat="server"
ContextTypeName="CommentDataContext"
Select="new (id, content, newsid)" TableName="comment">
</asp:LinqDataSource>
ContextTypeName属性指定DataContext对象(该对象(映射到了)决定了可以对哪个数据库的哪些表进行操作)
TableName属性指定了对哪个表进行操作。
Select属性指定要查询字段的LINQ投影表达式(以后会讲)。
值得一提的是也可以在配置LinqDataSource时通过高级来启动增删改功能,但必须满足一下条件才能实现增删改功能
:(1)不能给Select属性赋值(2)不能给GroupBy属性赋值(3)ContextTypeName属性的值必须派生自DataContext
(4)TableName属性的值必须派生自Table<(Of<TEntity>)>
在配置数据源时你会发现当为select设置非*时,高级是不可用的。
发表评论
-
ASP.NET服务器控件
2010-08-31 23:03 49129. ASP.NET Ajax控件 Ajax英文 ... -
ASP.NET服务器控件
2010-08-27 15:40 2165ASP.NET服务器控件控件可分为以下几类: ... -
ASP.NET服务器控件
2010-08-19 00:40 18037.登录控件 在使用登录控件之前,必须先了解一下 ... -
ASP.NET服务器控件
2010-08-11 23:57 1036DetailsView控件 如其 ... -
ASP.NET服务器控件
2010-08-10 21:40 1216ListView与DataPager控件 ... -
ASP.NET服务器控件
2010-08-08 02:50 23685.数据绑定控件 GridView控件 显示一 ... -
ASP.NET服务器控件
2010-08-03 23:01 1610ASP.NET服务器控件 服务器控件就是在服务器 ...
相关推荐
ASP.NET服务器控件与组件开发电子书及示例代码ASP.NET服务器控件与组件开发电子书及示例代码ASP.NET服务器控件与组件开发电子书及示例代码ASP.NET服务器控件与组件开发电子书及示例代码ASP.NET服务器控件与组件开发...
ASP.NET服务器控件是.NET框架中的核心组成部分,用于构建动态Web应用程序。在ASP.NET中,服务器控件提供了丰富的功能,使开发人员能够更方便地创建交互式的网页。本教程“ASP.NET服务器控件高级编程”深入探讨了这些...
本教程将深入探讨ASP.NET服务器控件的开发技术,并通过实例来帮助你理解和应用这些知识。 一、服务器控件基础 ASP.NET服务器控件是运行在服务器端的,它们在HTML发送到客户端之前被处理。服务器控件具有丰富的属性...
ASP.NET 服务器控件:DropDownCheckBoxList ,支持下拉多选,支持.NET3.5 支持主流浏览器IE8及以上版本 FF3.5+,Chrome 9+,Safari 5 等浏览器。
《ASP.NET服务器控件与组件开发》是一门深入探讨ASP.NET技术中服务器控件和组件构建的专业主题。在ASP.NET框架中,服务器控件和组件是网页开发的核心元素,它们为开发者提供了丰富的功能,简化了网页交互逻辑的实现...
ASP.NET服务器控件与组件开发是Web开发领域中的核心概念,尤其对于构建动态、交互性强的Web应用程序至关重要。ASP.NET是Microsoft .NET框架的一部分,它提供了丰富的服务器控件和组件库,使得开发者能够以声明式的...
资源共享啦!!... <<ASP.NET 服务器控件开发技术与实例>>附光盘代码 是服务器控件开发的入门及应用的书,想做ASP.NET服务器控件开发的不妨看看,里面带有10个经典控件开发实例源码和DEMO...
《ASP.NET服务器控件开发技术与实例》一书的光盘源程序代码是学习和深入理解ASP.NET服务器控件开发的宝贵资源。该资源由C#编程语言和Visual Studio 2005(VS2005)环境构建,旨在为开发者提供实战性的指导和示例,...
ASP.net服务器控件与组件开发
ASP.NET服务器控件开发(en) 很好的服务器控件开发资料
Asp.Net服务器控件开发 源代码 书中所有工程均采用Visual Studio.NET 2003进行开发,其Microsoft .NET Framework版本为1.1.4322。更详细的说明见书的“光盘使用必读”。
ASP.NET服务器控件是.NET框架下用于构建动态Web应用程序的核心组件。它们在Web页面的生命周期中扮演着重要角色,提供了一种与客户端交互的方式,并在服务器端处理用户输入。本教程将深入探讨ASP.NET服务器控件的开发...
ASP.NET服务器控件是.NET Framework框架中用于构建动态Web应用程序的核心元素之一。这些控件提供了一种方便的方式来创建用户界面,使开发人员能够通过拖放和配置属性来快速开发功能丰富的网页。在“asp.net服务器...
Asp.Net服务器端控件是.NET框架中用于构建动态Web应用程序的关键组件。这些控件提供了一种方便的方式来创建交互式的用户界面,使开发者能够轻松地处理网页上的数据和功能。在Asp.Net中,服务器端控件是核心的开发...
ASP.NET服务器控件和组件是构建动态Web应用程序的关键元素,它们为开发者提供了丰富的功能和便捷的接口,使得在网页上创建交互式用户界面变得简单。本文将深入探讨这些控件和组件的开发过程,帮助初学者快速掌握核心...
ASP.NET服务器控件是.NET Framework下开发Web应用程序的重要组成部分,它们为开发者提供了丰富的交互性和功能。在ASP.NET中,服务器控件是运行在服务器端的,可以处理用户输入、生成HTML代码并将其发送到浏览器。这...
ASP.NET服务器控件高级编程 ASP.NET 服务器控件 自定义控件