ASP.NET和ADO.NET

ADO.NET中最重要的两个概念:Managed Provider和DataSet。

  Managed Provider

  Managed Providers提供简单的方法连接和访问数据库,有点类似于数据库连接,当然又比它强的多。Managed Providers提供OleDb和SQL Server两种编程接口。因为SQL Server是微软自己的产品,因此,专门提供了一个针对SQL Server的接口,使用这个接口访问SQL Server的效率应该比使用OleDb强。

        过去,通过ADO的数据存取采用了两层的基于连接的编程模型。随着多层应用的需求不断增加,程序员需要一个无连接的模型。ADO.NET就应运而生了。ADO.NET的Managed Provider就是一个多层结构的无连接的一致的编程模型。

  Managed Provider提供了DataSet和数据中心(如MS SQL)之间的联系。Managed Provider包含了存取数据中心(数据库)的一系列接口。主要有三个部件:

  1、连接对象Connection、命令对象Command、参数对象Parameter提供了数据源和DataSet之间的接口。DataSetCommand接口定义了数据列和表映射,并最终取回一个DataSet。

  2、数据流提供了高性能的、前向的数据存取机制。通过IdataReader,你可以轻松而高效地访问数据流。

  3、更底层的对象允许你连接到数据库,然后执行数据库系统一级的特定命令。

  过去,数据处理主要依赖于两层结构,并且是基于连接的。连接断开,数据就不能再存取。现在,数据处理被延伸到三层以上的结构,相应地,程序员需要切换到无连接的应用模型。这样,DataSetCommand就在ADO.NET中扮演了极其重要的角色。它可以取回一个DataSet,并维护一个数据源和DataSet之间的"桥",以便于数据访问和修改、保存。DataSetCommand自动将数据的各种操作变换到数据源相关的合适的SQL语句。四个Command对象:SelectCommand、InsertCommand、UpdateCommand、DeleteCommand分别代替了数据库的查询、插入、更新、删除操作。

  Managed Provider利用本地的OLEDB通过COM Interop来实现数据存取。OLEDB支持自动的和手动的事务处理。所以,Managed Provider也提供了事务处理的能力。


  DataSet

  DataSet是ADO.NET的中心概念。你可以把DataSet想象成内存中的数据库。正是由于DataSet,才使得程序员在编程序时可以屏蔽数据库之间的差异,从而获得一致的编程模型。DataSet被分解为很多部分比如DataTables和DataRows,可以使用它们创建一个DataSet而不一定要连接到一个具体的数据库。当然,DataSet本身就是离线数据,所有的数据都可以离线使用而不必一直连接到数据库,只有需要对数据库进行编辑的时候才需要连接到数据库。

  DataSet支持多表、表间关系、数据约束等等。这些和关系数据库的模型基本一致。

 

  通过ADO.NET访问数据库

  不论从语法来看,还是从风格和设计目标来看,ADO.NET都和ADO有显著的不同。ADO.NET的最重要概念之一是DataSet。DataSet是不依赖于数据库的独立数据集合。所谓独立,就是:即使断开数据链路,或者关闭数据库,DataSet依然是可用的。如果你在ASP里面使用过非连接记录集合(Connectionless Recordset),那么DataSet就是这种技术的最彻底的替代品。有了DataSet,那么,ADO.NET访问数据库的步骤就相应地改变了:

  1、创建一个数据库链路;

  2、请求一个记录集合;

  3、把记录集合暂存到DataSet;

  4、如果需要,返回第2步;(DataSet可以容纳多个数据集合)

  5、关闭数据库链路;

  6、在DataSet上作所需要的操作。

  DataSet在内部是用XML来描述数据的。由于XML是一种平台无关、语言无关的数据描述语言,而且可以描述复杂数据关系的数据,比如父子关系的数据,所以DataSet实际上可以容纳具有复杂关系的数据,而且不再依赖于数据库链路。

  ADO.NET有许多对象,我们先看看最基本的也最常用的几个。首先看看ADOConnection。和ADO的ADODB.Connection对象相对应,ADOConnection维护一个到数据库的链路。为了使用ADO.NET对象,我们需要引入两个NameSpace:System.Data和System.Data.ADO,使用ASP.NET的Import指令就可以了:

  <%@ Import Namespace="System.Data" %> 

  <%@ Import Namespace="System.Data.ADO" %> 

 

和ADO的Connection对象类似,ADOConnection对象也有Open和Close两个方法。下面的这个例子展示了如何连接到本地的MS SQL Server上的Pubs数据库。

<%@ Import Namespace="System.Data" %> 
<%@ Import Namespace="System.Data.ADO" %> 
<%
'设置连接串...
Dim strConnString as String
strConnString = "Provider=SQLOLEDB; Data Source=(local); " & "Initial Catalog=pubs; User ID=sa"

'创建对象ADOConnection
Dim objConn as ADOConnection
objConn = New ADOConnection

'设置ADOCOnnection对象的连接串
objConn.ConnectionString = strConnString

objConn.Open() '打开数据链路

'数据库操作代码省略

objConn.Close() '关闭数据链路
objConn = Nothing '清除对象
%> 

 

上面的代码和ADO没有什么太大的差别。应该提到的是,ADO.NET提供了两种数据库连接方式:ADO方式和SQL方式。这里我们是通过ADO方式连接到数据库。

 

  ADODatasetCommand

  另一个不得不提到的ADO.NET对象是ADODatasetCommand,这个对象专门负责创建我们前面提到的DataSet对象。另一个重要的ADO.NET对象是Dataview,它是DataSet的一个视图。还记得DataSet可以容纳各种各种关系的复杂数据吗?通过Dataview,我们可以把DataSet的数据限制到某个特定的范围。

  下面的代码展示了如何利用ADODatasetCommand为DataSet填充数据:

'创建SQL字符串
Dim strSQL as String = "SELECT * FROM authors"

'创建对象ADODatasetCommand 和Dataset
Dim objDSCommand as ADODatasetCommand
Dim objDataset as Dataset = New Dataset
objDSCommand = New ADODatasetCommand(strSQL, objConn)

'填充数据到Dataset
'并将数据集合命名为 "Author Information"
objDSCommand.FillDataSet(objDataset, "Author Information")

 

  显示Dataset

  前面我们已经把数据准备好。下面我们来看看如何显示Dataset中的数据。在ASP.NET中,显示DataSet的常用控件是DataGrid,它是ASP.NET中的一个HTML控件,可以很好地表现为一个表格,表格的外观可以任意控制,甚至可以分页显示。这里我们只需要简单地使用它:

  <asp:DataGrid id="DataGridName" runat="server"/> 

  剩下的任务就是把Dataset绑定到这个DataGrid,绑定是ASP.NET的重要概念,我们将另文讲解。一般来说,你需要把一个Dataview绑定到DataGrid,而不是直接绑定Dataset。好在Dataset有一个缺省的Dataview,下面我们就把它和DataGrid绑定:
MyFirstDataGrid.DataSource = _
objDataset.Tables("Author Information").DefaultView
MyFirstDataGrid.DataBind()


  

Dataset的用法
  Dataset 并不是Recordset的简单翻版。从一定的意义上来说,DataView更类似于Recordset。如果说DataReader是访问数据的最容易的方式,那么Dataset则是最完整的数据访问对象。通过Dataset,你可以操作已有的数据,还可以通过程序创建Dataset,加入Table到Dataset,并建立这些Table之间的关系。

  使用Dataset的几个步骤

  第1步,创建到数据源的连接:

   SQLConnection con =new SQLConnection("server=localhost;uid=sa;pwd=;database=pubs");

  第2步,创建DataSetCommand对象,指定一个存储过程的名字或者一个SQL语句,指定数据链路;

   SQLDataSetCommand cmd =new SQLDataSetCommand("SELECT * FROM Authors", con);

  第3步,创建一个Dataset对象

   DataSet ds = new DataSet();

  第4步,调用DataSetCommand的FillData方法,为Dataset填充数据。注意:数据链路没有必要是打开的。如果数据链路是关闭状态,FillData函数会打开它,并在FillData之后关闭数据链路。如果数据链路本来就是打开的,在FillData之后,数据链路依然保持打开状态。

   int iRowCount = cmd.FillDataSet(ds, "Authors");

  第5步,操作数据。由于FillData返回了记录的个数,我们可以构造一个循环,来操纵Dataset中的数据。


for(int i=0; i< iRowCount; i++){
DataRow dr = ds.Tables[0].Rows[i];
Console.WriteLine(dr["au_lname"]);
}
 

  

数据绑定技术

  Repeater、DataList 、DataGrid控件是System.Web.UI.WebControls名空间(Namespace)里几个相关的页面组件。这些控件把绑定到它们的数据通过HTML表现出来,它们又被成为"列表绑定控件"(list-bound controls)。

  和其他Web组件一样,这些组件不仅提供了一个一致的编程模型,而且封装了与浏览器版本相关的HTML逻辑。这种特点使得程序员可以针对这个对象模型编程,而无须考虑各种浏览器版本的差别和不一致性。

  这三个控件具有把它们的相关数据"翻译"成各种外观的能力。这些外观包括表格、多列列表、或者任何的HTML流。同时,它们也允许你创建任意的显示效果。除此之外,它们还封装了处理提交数据、状态管理、事件激发的功能。最后,它们还提供了各种级别的标准操作,包括选择、编辑、分页、排序等等。利用这些控件,你可以轻松地完成如下的Web应用:报表、购物推车、产品列表、查询结果显示、导航菜单等等。

 

 ======================================================PART II

'或<%@ Import Namespace="System.Data" %>
'  <%@ Import Namespace="System.Data.Oledb" %>

'Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:/sff/site/db/users.mdb")

objConn.Open()

Dim objCmd as New OleDbCommand()
objCmd.Connection = objConn
objCmd.CommandText = "SELECT * FROM users"

'''当执行没有返回数据的操作的时候

objCmd.ExecuteNoQuery  

'ExecuteReader: 在需要一个Data Reader的时候

Dim objReader  as OleDbDataReader
  objReader = objCmd.ExeuteReader
  While objReader.Read
  Response.Write(objReader.GetString(0) & "<br>")
  End While

'''使用ExecuteScalar方法来取得一个单个地返回数据,比如对数据的统计

OleDbDataAdapter取得数据并且数据与DataSet之间建一座桥梁

Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn)

OleDbAdapter可以填充DataSet,也可以修改数据然后提交以实现对具体数据的修改:

Dim ds as Dataset = New DataSet()
  objAdapter.Fill(ds, "users")

Mappings可以实现对DataSet的列取别名:

objAdapter.TableMappings.Add("adbtable", "users")
With objAdapter.TableMappings(0).ColumnMappings
.Add("PID", "ID")
.Add("LastName", "LName")
.Add("StreetAddress", "Addy")
End With
objAdapter.Fill(ds)

建立了一个DataSet和一个叫People的DataTable,然后,我们为这个DataTable加入了三个列并将"UID"列设为自动递增。最后,将这个DataTable加入到了DataSet。

Dim ds1 As New DataSet()
  Dim dtable As new DataTable("people")
  With dtable.Columns
  .Add("FName", System.Type.GetType("System.String"))
  .Add("LName", System.Type.GetType("System.String"))
  .Add("UID", System.Type.GetType("System.Int32"))
  End With
  dtable.Columns("UID").AutoIncrement = True
  ds1.Tables.Add(dtable)

dim pkey() as DataColumn = {ds1.Tables("people").Columns("UID")}
  ds1.Tables("people").PrimaryKey = pkey  ' 定义了主键

DataTable就是一个数据表,我们可以对这个表进行如:增加数据、修改数据等操作。我们也可以通过DataSet建立一个DataTable:

Dim dtable As DataTable = ds1.Tables("people")

这样,将DataSet的表People的结构和数据拷贝到了DataTable中,尽管它是无连接的,但是仍然可以通过修改这个DataSet来更新DataSet表,因此,如果我们在dtable中增加一列并且接受改变就以实现对DataSet的修改:

Dim row as DataRow = dtable.NewRow()
  row(0) = "Philip"
  row(1) = "Quinn"
  dtable.Rows.Add(row)
  dtable.AcceptChanges

这样我们就建立了一个新的DataRow,这和用dtable.NewRow()建立一个新的数据列一样,我们还可以给这个列取名了Fname。

因为以上的DataTable来自DataSet,如果我们使用dtable.AcceptChanges方法更新DataTable,DataSet也会被更新:

<%@ Import Namespace="System.Data" %>
  <script language="VB" runat="server">
  Sub Page_Load(sender as object, e as eventargs)
  Dim ds1 As New DataSet()
  Dim dtable As new DataTable("people")
  With dtable.Columns
  .Add("FName", System.Type.GetType("System.String"))
  .Add("LName", System.Type.GetType("System.String"))
  .Add("UID", System.Type.GetType("System.Int32"))
  End With

dtable.Columns("UID").AutoIncrement = True
  ds1.Tables.Add(dtable)

Dim dtable2 As DataTable = ds1.Tables("people")

Dim row as DataRow = dtable2.NewRow()
  row(0) = "Philip"
  row(1) = "Quinn"
  dtable2.Rows.Add(row)
  dtable2.AcceptChanges

Response.Write(ds1.Tables("people").Rows(0)("FName").ToString)
  End Sub
  </script>

以上代码将显示"Philip",现在我们来看看具体过程:

1、 建立一个DataSet和一个叫"People"的DataTable;
  2、 增加三个数据列并且设置它们的数据属性;
  3、 将它们加入到DataSet;
  4、 建立另外一个DataTable,这个DataTable是刚才建立的那个的拷贝;
  5、 用DataTable建立新的DataRow并加入数据;
  6、 接受数据改变同时更新了DataSet;
  7、 显示第一个数据列;

DataRows

DataRow是DataTable的数据列,刚才我们已经看到,我们可以使用DataTable的以下方法建立一个新的DataRow:

ds1.Tables("people").Rows(0)("FName") = "Phil"

以上语句中,ds1.Tables("people")选择表"people",.Rows(0)选择表的第一行,("FName")选择表的字段为"Fname"。

DataRows是数据列的集合,通过以下语句取得:

Dim drow as DataRowCollection = ds1.Tables("people").Rows

对于DataRows,我们基本上不能做太多。如果针对一个具体的数据列,我们可以这样:

Dim drow2 as DataRow = drow.Item(0)

需要修改这个列的数据,可以这样:

drow2(0) = "Philip"
  drow2.AcceptChanges

可能说了那么多,我们都觉得比较复杂,我们来看看这个图示:

 

 

通过这个图示我们很容易就理清了DataSet、DataTable、DataRowCollection、DataRows、DataColumn和DataColumnCollection之间的相互关系。

 

DataSet和Data Source通过DataAdapter进行联系,当DataSet取得数据库数据以后,就和数据库断开连接,针对数据作的所有数据修改在没有提交以前都在DataSet里面保存。

数据修改

我们将通过一个小的举例来说明数据怎样被修改和提交。

这是数据结构(Access设计)

Field NameTypeFName LNameID
FNameTextPhilipQuinn 1
LName TextJoesphPayne2
IDAutoNumberDouglasAdams 3
  MichaelOkuda4

举例一:

<%@ Page Language="VB" %>

<%@ Import Namespace="System.Data" %>
  <%@ Import Namespace="System.Data.Oledb" %>
  <script language="VB" runat="server">
  Sub Page_Load(sender as object, e as eventargs)

以上代码导入NameSpace同时说明编程语言为VB;

Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:/sff/site/db/test.mdb")
  objConn.Open()

Dim ds as Dataset = New DataSet()
  Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn)
  Dim objCmdBld as New OleDbCommandBuilder(objAdapter)

objAdapter.Fill(ds, "users")

以上代码建立了Connection、DataAdapter和CommandBuilder,并且填充了DataSet。我们必须注意以下几点:

一、 DataAdapter是数据和DataSet之间的桥梁;

二、 CommandBuilder建SQL语句来执行;

Dim drow as DataRow

以上语句声明一个DataRow;

drow = ds.Tables("users").NewRow()

drow(0) = "Gene"
  drow(1) = "Rodenberry"
  ds.Tables("users").Rows.Add(drow)

drow = ds.Tables("users").NewRow()

drow(0) = "Maxwell"
  drow(1) = "Stewart"
  ds.Tables("users").Rows.Add(drow)

以上代码为DataSet增加一个新的列;

objAdapter.Update(ds, "users")

以上代码将更新提交到数据库;

End Sub
  </script>

现在看看数据库,会发现已经多了两列。

 

 

另外一个举例

<%@ Page Language="VB" Debug="true" %>

<%@ Import Namespace="System.Data" %>
  <%@ Import Namespace="System.Data.Oledb" %>
  <script language="VB" runat="server">
  Sub Page_Load(sender as object, e as eventargs)

Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:/sff/site/db/test.mdb")
  objConn.Open()

Dim ds as Dataset = New DataSet()
  Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn)
  Dim objCmdBld as New OleDbCommandBuilder(objAdapter)

objAdapter.Fill(ds, "users")

Dim drow as DataRow

drow = ds.Tables("users").Rows(1)

drow(0) = "Joseph"

ds.Tables("users").Rows(0).AcceptChanges

objAdapter.Update(ds, "users")

End Sub
  </script>

 

数据显示和修改

<%@ Page Language="VB" Debug="true" %>

<%@ Import Namespace="System.Data" %>
  <%@ Import Namespace="System.Data.Oledb" %>
  <script language="VB" runat="server">
  Sub Page_Load(sender as object, e as eventargs)

Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:/sff/site/db/test.mdb")
  objConn.Open()

Dim ds as Dataset = New DataSet()
  Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn)
  Dim objCmdBld as New OleDbCommandBuilder(objAdapter)

objAdapter.Fill(ds, "users")

Repeater

Repeater是一个根据面板循环显示数据的控件。
  ItemTemplate:数据主要在这里显示
  AlternativeItemTemplate:利用它可以应用交替的样式;
  HeaderTemplate:头格式;
  SeparatorTemplate:分隔数据列;
  FooterTemplate:脚格式
  DataBind()
  DataBind()将数据与页面控件绑定:

Repeater1.DataSource = ds.Tables("users").DefaultView
  DataBind()

以上代码将数据绑定到Repeater,如果没有绑定,数据不会显示。

其他代码

以下是举例的其他代码:

Rpt.DataSource = ds.Tables("users").DefaultView
  DataBind()
  End Sub
  </script>
  <html><body><font face="Arial" size="2">
  <asp:repeater id="Rpt" runat="server">

<HeaderTemplate>
  <table border="0" cellspacing="1" cellpadding="3">
  <tr>
  <td bgcolor="#6699FF" width="25%">Last Name</td>
  <td bgcolor="#6699FF" width="25%">First Name</td>
  </tr>
  </HeaderTemplate>

<ItemTemplate>
  <tr>
  <td>
  <%# Container.DataItem("LName") %>
  </td><td>
  <%# Container.DataItem("FName") %>
  </td>
  </tr>
  </ItemTemplate>

<FooterTemplate>
  </table>
  </FooterTemplate>

</asp:repeater>
  </font></body></html>

说明:

一、 设置了Repeater的DataSource;
  二、 绑定数据到Repeater;
  三、 Repeater数据控件开始;
  四、 HeadTemplate定义Repeater的头信息;
  五、 ItemTemplate定义具体数据填充;
  六、 FooterTemplate定义Repeater脚信息;

DataList

DataList和Repeater有点相似,和Repeater不同的是,DataList可以编辑数据。可以和Repeater一样使用Template,但是它具有两点不同:

SelectedItemTemplate:显示选择的列;

EditItemTemplate:显示要编辑的列;

以下是一个使用DataList的简单举例:

dl.DataSource = ds.Tables("users").DefaultView
  Databind()
  End Sub
  Sub dl_ItemCommand(sender as object, e as DataListCommandEventArgs)
  dl.SelectedIndex = e.Item.ItemIndex
  dl.DataBind()
  End Sub
  </script>

<html><body><font face="arial" size="2"><form runat="server">
  <asp:datalist id="dl" runat="server"
  HeaderStyle-BackColor="#6699FF"
  SelectedItemStyle-BackColor="#6666FF"
  SelectedItemStyle-ForeColor="#FFFFFF"
  RepeatLayout = "table"
  RepeatDirection = "vertical"
  DataKeyField = "ID"
  OnItemCommand="dl_ItemCommand">

<HeaderTemplate>
  Last Name, click for full name.
  </HeaderTemplate>

<ItemTemplate>
  <asp:linkbutton id="b1" runat="server" Text='<%# Container.DataItem("LName") %>' CommandName = "select" />
  <br>
  </ItemTemplate>

<SelecteditemTemplate>
  <%# Container.DataItem("LName") & ", " & Container.DataItem("FName") %>
  <br>
  </SelectedItemTemplate>
  </asp:datalist>
  </form></font>
  </body>
  </html>

说明:

一、 绑定数据以后,建立了一个过程;
  二、 将DataList放入Form中,因为在以下的步骤中要求根据选择列刷新页面;
  三、 接着定义了一些数据显示格式;
  四、 HeaderTemplate:DataList头信息;
  五、 ItemTemplate:加入链接,定义事件;
  六、 SelectedItemTemplate:显示First 和 Last Name;

DataGrid

可能它是功能最强大的控件,不管简单还是复杂它都可以实现。
  和ItemTemplate不同,DataGrid有不同类型的列:
  Bound Columns:DataGird默认列显示方式;
  Button Columns:按钮列;
  Edit Command Column:可以编辑的列;
  Hyperlink Column :带连接的列;
  Templated Column :自定义列显示;

 
可能有一点复杂,我们看说明:

一、 绑定数据以后,设置了一些DataSet显示效果,包括字体、表宽、头信息背景颜色、交替背景颜色、是否自动生成数据表等;

二、 加入一个自定义格式列,该列名为Name,由字段Fname和Lname组成;

现在才刚刚开始

可能现在你还没有感受到DataSet的好处,以后的章节我们将学习怎样编辑数据。

五、理解DataGrid

数据放入DataGrid以后,除了一般的显示以外,我们还需要对这些数据进行编辑、修改。看了前几个章节你可能认为DataGrid比较简单,数据处理也比较方便。其实,如果需要真正做一个应用,我们会发现前面的知识还远远不够。以下所用的数据库和前面的章节完全相同,一些设置我们可以参考前面章节。我们先来看代码:

<%@ Page Language="VB" Debug="true" %>
  <%@ Import Namespace="System.Data" %>
  <%@ Import Namespace="System.Data.Oledb" %>
  <script language="VB" runat="server">
  Dim objConn as New OleDBConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=e:/sff/site/db/test.mdb")
  Dim ds as Dataset = New DataSet()
  Dim objAdapter as New OleDbDataAdapter("SELECT * FROM users", objConn)

Sub Page_Load(sender as object, e as eventargs)
  objConn.Open()
  objAdapter.Fill(ds, "users")
  dg.DataSource = ds
  dg.DataMember = "users"
  If Not Page.IsPostBack Then
  dg.Databind()
  End If
  End Sub

sub dg_edit(sender as object, e as DataGridCommandEventArgs)
  dg.edititemindex = -1
  dg.DataBind()
  end sub

sub dg_cancel(sender as object, e as DataGridCommandEventArgs)
  dg.edititemindex = -1
  dg.databind()
  end sub
  </script>

以上程序代码很简单直接,我们应该都可以看懂。只是需要注意Page_Load的对数据绑定的处理,在几乎所有的数据库程序中,我们都使用这种方式处理数据绑定,所以,这个处理方式一定要牢记。以上是数据连接和事件处理部分,现在我们看DataGrid部分。

自定义DataGrid

以下代码演示了自定义DataGrid的实现,在实际应用中,我们基本都是这样使用DataGrid,以下代码很有典型性,可以作为一个好的参考。

<form runat="server">
  <asp:DataGrid id="dg" runat="server"
  Bordercolor="black"
  gridlines="vertical"
  font-names="Arial"
  font-size="10pt"
  HeaderStyle-BackColor="#FFCC00" '表格头信息
  ItemStyle-BackColor="#FFCC66" '每行背景色
  AlternatingItemStyle-BackColor="#FFFFFF" '交替背景色
  AutoGenerateColumns="False" '自定义每行
  OnEditCommand="dg_edit" '以下三个事件处理
  OnCancelCommand="dg_cancel"
  OnUpdateCommand="dg_update">

'自定义每行显示
  <Columns>
  <asp:boundcolumn readonly="true" headertext="ID" DataField="Auto" />
  <asp:boundcolumn headertext="First Name" DataField="Number1" />
  <asp:boundcolumn headertext="Last Name" Datafield="Number2" />
  <asp:editcommandcolumn edittext="Edit" CancelText="Cancel" UpdateText="Save" HeaderText="" />
  </Columns>

</asp:dataGrid>
  </form>

以上代码中,自定义了数据编辑列,这些相应的处理在前面已经给出代码。我们现在来看事件处理。

OnEditCommand

以下是编辑按钮处理代码:

sub dg_edit(sender as object, e as DataGridCommandEventArgs)

dg.edititemindex = e.item.itemindex
  dg.databind()
  end sub

以上代码需要注意的是,e.item.itemindex就是我们需要编辑的那行数据。在对数据作任何变动以后,都需要重新绑定数据,也就是DataBing()。

OnCancelCommand

取消按钮处理和上面的编辑按钮处理差不多,区别的是,在这里,dg.edititemindex被设为-1,也就是将数据恢复到原来状态。

OnUpdateCommand

先来看数据更新代码:

sub dg_update(sender as object, e as DataGridCommandEventArgs)
  Dim FNAME As TextBox = e.item.cells(1).controls(0)
  Dim LNAME As TextBox = e.item.cells(2).controls(0)
  Dim sqlstr As String

sqlstr = "UPDATE users SET " & _
  "Number1 = '" & FNAME.Text & "', " & _
  "Number2 = '" & LNAME.Text & "' " & _
  "WHERE Auto = " & e.item.cells(0).text

Dim objCommand = New OLEDBCommand(sqlstr, objConn)
  objCommand.ExecuteNonQuery()

ds.Tables.Clear
  objAdapter.Fill(ds, "users")

dg.edititemindex = -1
  dg.DataBind()
  end sub

以上代码将建立两个TextBox,这两个TextBox就是DataGrid中的复本。然后用SQL语句更新数据,最后重新绑定数据。

DataGrid数据排序

 

数据排序在一些特殊的场合是必要的。下面我们将详细介绍DataGrid中的数据排序功能。在对DataGrid数据实现排序功能以前,我们需要做以下准备:

1、 将AutoGenerateColumns设为打开,这样自定义数据列功能将失去,同时也将失去直接编辑功能。其实这无关紧要的,数据显示和编辑分开不同页面这种模式其实是现在比较认可的方法。

2、 必须将AllowSorting设为真,这样,在每一列数据的标题将建立一个链接,点击这个链接将按照这个字段排序。

3、 必须建立排序事件,也就是OnSortCommand。

现在看代码:

<asp:DataGrid id="dg" runat="server"
  Bordercolor="black"
  gridlines="vertical"
  font-names="Arial"
  font-size="10pt"
  HeaderStyle-BackColor="#FFCC00"
  ItemStyle-BackColor="#FFCC66"
  AlternatingItemStyle-BackColor="#FFFFFF"
  AutoGenerateColumns="True"
  OnEditCommand="dg_edit"
  OnCancelCommand="dg_cancel"
  OnUpdateCommand="dg_update"
  OnSortCommand="dg_sort"
  AllowSorting="True"
  >
  </asp:dataGrid>

以下是运行界面:

 

 

排序事件处理

排序需要用到DataView,现在我们来看排序处理:

sub dg_sort(sender as object, e as DataGridSortCommandEventArgs)
  Dim dtable as DataTable = ds.Tables("users")
  Dim dview as new DataView(dtable)
  dview.sort = e.SortExpression.ToString & " ASC"
  dg.DataSource = dview
  dg.databind()
  end sub

从以上代码我们可以发现,数据排序功能的实现是需要依靠DataView的,排序以后,绑定数据。应用Data View还可以实现其他很多功能,我们在这里只介绍它的排序应用。

升序和降序

我们可以给用户选择升序和降序来排列数据:

<form runat="server">
  <asp:DataGrid id="dg" runat="server"
  Bordercolor="black"
  gridlines="vertical"
  font-names="Arial"
  font-size="10pt"
  HeaderStyle-BackColor="#FFCC00"
  ItemStyle-BackColor="#FFCC66"
  AlternatingItemStyle-BackColor="#FFFFFF"
  AutoGenerateColumns="True"
  OnEditCommand="dg_edit"
  OnCancelCommand="dg_cancel"
  OnUpdateCommand="dg_update"
  OnSortCommand="dg_sort"
  AllowSorting="True"
  >
  </asp:dataGrid>
  <p>
  <asp:radiobuttonlist runat="server" id="sortby" repeatdirection="horizontal" textalign="right" >
  <asp:listitem selected="true">Ascending</asp:listitem>
  <asp:listitem>Descending</asp:listitem>
  </asp:radiobuttonlist>
  </form>
  以上大部分代码我们都很熟悉,只是在最后加了两个选项来选择升序还是降序。我们来看事件处理:
  sub dg_sort(sender as object, e as DataGridSortCommandEventArgs)
  Dim sortby = Request.Form("sortby")
  Dim dtable as DataTable = ds.Tables("users")
  Dim dview as new DataView(dtable)
  If sortby = "Ascending" Then
  dview.sort = e.SortExpression.ToString & " ASC"
  Else If sortby = "Descending" Then
  dview.sort = e.SortExpression.ToString & " DESC"
  End If
  dg.DataSource = dview
  dg.databind()
  end sub

事件先查看用户选择,然后根据用户选择来处理排序方式。图示如下:

 

 


 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值