数据源控件是在ADO.NET的基础上进行封装,以达到快速开发的目地。.net提供的数据控件分为数据源控件和数据绑定控件,数据源控件主要负责数据的连接、数据的增删改查;数据绑定控件主要负责数据的显示。
常用数据源控件:
控件名称 |
说明 |
SqlDataSource |
可以连接到 ADO.NET 支持的任何 SQL 数据库 |
AccessDataSource |
连接到使用 Microsoft Office 创建的 Access 数据库 |
ObjectDataSource |
连接到应用程序的 Bin 或 App_Code 目录中的中间层业务对象或数据集 |
XmlDataSource |
连接到 XML 文件 |
SitemapDataSource |
连接到此应用程序的站点导航树(要求应用程序根目录处有一个有效的站点地图文件,默认的文件名为“Web.sitemap”),站点地图文件其实也是一个XML文件 |
LINQDataSource |
.NET 3.0新增,可以访问各种类型的数据,包括数据库和XML文件。与C#/VB.NET等.NET语言直接集成 |
常用数据绑定控件:
控件名称 |
说明 |
GridView |
以表格的方式显示和编辑数据 |
DetailsView |
一次显示、编辑、插入或删除一条记录。默认情况下,DetailsView 控件将记录的每个字段显示在它自己的一行内 |
FormView |
FormView控件与DetailsView控件相似,一次也只能显示或编辑一条记录。FormView需要给其设定一个模板 |
DataList |
控件可以用某种用户指定的格式来显示数据(比如分列显示),这种格式由模板和样式进行定义 |
Repeater |
Repeater控件没有包含内置的布局或样式,需要由Web开发者指定所有的用于显示数据的内部控件和显示样式 |
ListView |
ASP.NET 3.5新增,以嵌套容器模板和占位符的方式提供灵活的数据显示模式 |
在数据绑定控件中,GridView等一些控件有自己模版,并且封装了删除、更新还有分页的方法,可以通过一些配置来操作数据源。但是Repeater数据绑定控件没有自己的模版,对数据的操作只有一个Repeater_ItemCommand一个事件方法。因此怎么在Repeater_ItemCommand方法中利用数据源控件删除数据困扰了我一下午,要解决这个问题,我们首先来看数据源控件的代码:
1 <asp:SqlDataSource ID="SqlDataSource1" runat="server" 2 ConnectionString="<%$ ConnectionStrings:SqlDataSourceTestConnectionString %>" 3 DeleteCommand="DELETE FROM test1 WHERE (id = @id)"> 4 <DeleteParameters> 5 <asp:ControlParameter ControlID="GridView1" Name="id" 6 PropertyName="SelectedValue" /> 7 </DeleteParameters> 8 </asp:SqlDataSource>
同样的目地直接在ADO.NET里面的操作如下:
1 Public bool del(int id)
2 { 3 bool flag = false; 4 SqlConnection conn = new SqlConnection(“连接字符串”); 5 SqlCommand cmd = new SqlCommand(“DELETE FROM test1 WHERE id=”+id+””,conn); 6 Conn.open(); 7 int i= cmd.ExcuteNonQuery(); 8 if(i!=0) 9 { 10 flag = true; 11 } 12 return flag; 13 }
下面我们来分析数据源控件和ADO.NET的对应关系:
从数据源控件代码中我们可以很清楚的看到第1行首先声明了一个<asp:SqlDataSource>并且为其设置了其ID="SqlDataSource1"可以理解这句话的意思是声明一个名为SqlDataSource1的SqlConnection对象,如:
SqlConnection SqlDataSource1;
第二行设置属性ConnectionString="<%$ ConnectionStrings:SqlDataSourceTestConnectionString %
ConnectionString是在web.config中配置好了的
<connectionStrings> <add name="SqlDataSourceTestConnectionString" connectionString="Data Source=WS-I-MYRONE-01\SQLEXPRESS;Initial Catalog=SqlDataSourceTest;Persist Security Info=True;User ID=sa;Password=**************" providerName="System.Data.SqlClient" /> </connectionStrings>
所以第2行的意思是将SqlDataSource1对象实例化,如:
SqlDataSource1 = new SqlConnection(“WS-I-MYRONE-01\SQLEXPRESS;Initial Catalog=SqlDataSourceTest;Persist Security Info=True;User ID=sa;Password=**************”);
第3行DeleteCommand="DELETE FROM test1 WHERE (id = @id)"可以理解为声明并实例化一个SqlCommand对象,如:
SqlCommand cmd = new SqlCommand(“DELETE FROM test1 WHERE id = “+id+””);
第4行到第7行设置DeleteParameters属性,可以理解为执行预处理给SqlCommand赋值并执行SqlCommand。
第5行到第7行是设置DeleteParameters的赋值方式、,SqlDataSources设置参数的方法如下:
参数类型 |
说明 |
ControlParameter |
将参数设置为 ASP.NET 网页中的 Control 的属性值。 使用 ControlID 属性指定 Control。 使用 ControlParameter 对象的 PropertyName 属性指定提供参数值的属性的名称。 从 Control 派生的某些控件将定义 ControlValuePropertyAttribute,从而确定从中检索控件值的默认属性。 只要没有显式设置 PropertyName 属性,就会使用默认属性。 ControlValuePropertyAttribute 应用于以下控件属性:
|
CookieParameter |
将参数设置为 HttpCookie 对象的值。 使用 CookieName 属性指定 HttpCookie 对象的名称。 如果指定的 HttpCookie 对象不S存在,则将使用 DefaultValue 属性的值作为参数值。 注意 仅支持单值 Cookie。 |
FormParameter |
将参数设置为 HTML 窗体字段的值。 使用 FormField 属性指定 HTML 窗体字段的名称。 如果指定的 HTML 窗体字段值不存在,则将使用 DefaultValue 属性的值作为参数值。 |
ProfileParameter |
将参数设置为当前用户配置文件 (Profile) 中的属性的值。 使用 PropertyName 属性指定配置文件属性的名称。 如果指定的配置文件属性不存在,则将使用 DefaultValue 属性的值作为参数值。 有关用户配置文件的信息,请参见 ASP.NET 配置文件属性概述。 |
QueryStringParameter |
将参数设置为 QueryString 字段的值。 使用 QueryStringField 属性指定 QueryString 字段的名称。 如果指定的 QueryString 字段不存在,则将使用 DefaultValue 属性的值作为参数值。 |
SessionParameter |
将参数设置为 Session 对象的值。 使用 SessionField 属性指定 Session 对象的名称。 如果指定的 Session 对象不存在,则将使用 DefaultValue 属性的值作为参数值。 |
理清楚SqlDataSource与ADO.NET的对应关系后,下面就是在利用数据源控件在Repeater中实现删除数据
代码如下:
前台代码:
1 <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" 2 onitemcommand="Repeater1_ItemCommand" DataMember="DefaultView"> 3 <HeaderTemplate> 4 <table> 5 <tr> 6 <td> 7 name <asp:TextBox AutoPostBack="true" ID="name" runat="server"></asp:TextBox> 8 </td> 9 <td> 10 pwd <asp:TextBox ID="pwd" runat="server"></asp:TextBox> 11 </td> 12 <td> 13 <asp:Button ID="add" CommandName="add" CommandArgument="1" runat="server" Text="add" /> 14 </td> 15 </tr> 16 </table> 17 </HeaderTemplate> 18 <ItemTemplate> 19 <table border="1"> 20 <tr> 21 <td> 22 <asp:Label ID="Label2" runat="server" Text='<%#Eval("name")%>'/> 23 </td> 24 <td> 25 <asp:Label ID="Label3" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "pwd")%>'/> 26 </td> 27 <td> 28 <asp:Button Text="delete" ID="b1" CommandArgument='<%#Eval("id")%>' CommandName="del" runat="server"/> 29 </td> 30 </tr> 31 </table> 32 </ItemTemplate> 33 </asp:Repeater>
后台事件处理:
1 protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e) 2 { 3 if(e.CommandName=="del") 4 { 5 SqlDataSource1.DeleteCommand = "DELETE FROM test1 where id=" + e.CommandArgument.ToString(); 6 SqlDataSource1.Delete(); 7 } 8 if (e.CommandName == "add") 9 { 10 TextBox1.Text = "add"+a; 11 } 12 }
删除事件是通过<asp:Button Text="delete" ID="b1" CommandArgument='<%#Eval("id")%>' CommandName="del" runat="server"/>来触发的
在后台代码e.CommandName是为了得到按钮的CommandName属性的值,e. CommandArgument是为了得到CommandArgument的值。
然后通过SqlDataSource1.DeleteCommand = "DELETE FROM test1 where id=" + e.CommandArgument.ToString();
设置删除的Sql语句通过调用SqlDataSource1.Delete()方法来执行删除事件。