名词解释
inline:一种处理数据的方法,即这些数据事先不必经过编辑或分类排序,按照它们到达 的顺序,按次序排队处理.
导言:
本文,我们考察 DataGrid 的一项有用的特点—inline 编辑(inline editing)
在很多情况下,我们需要在 DataGrid 里编辑数据。比如,在一个data-driven 网站,你可能有一组administrative Web pages 页面,这些页面包含了各种不同类型的数据库表(database tables),并允许管理员修改这些表格里的数据。通过 DataGrid,我们可以很轻松的将数据库表的信息显示出来(更多信息请参考 Part 2 和 Part 5),同样,我们也可以用 DataGrid 来编辑数据!
使用 DataGrid 的编辑功能(editing features)是很简单的,相比较而言,为了达到相同的目的,DataGrid 所需要的代码比经典 ASP 页面要少地多.此外,在阅读本文之前,你应该对 SQL 有所了解,也即相关的构建和更新命令(可以参考官方的 SQL 在线书籍:http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp)同样的,你也应该对DataGrid 控件本身比较了解,理解其事件(events)处理机制,为次可参考本系列的Part 3部分。
首先:显示数据
在我们将注意力集中到编辑 DataGrid 里的数据之前,我们首先要将数据用 DataGrid 显示出来。在前面的文章我们已经深入的探讨过这个问题,在此我不打算花过多笔墨。在本例中我们使用的是 GrocerToGo 数据库(它是一种 Access 2000的数据库,可以在本文结束处下载).在此,我们将要显示 Products 里的数据。
我们将在 DataGrid 里显示 Products 表里的如下几个列:ProductID, UnitPrice, ProductName, 以及 ProductDescription,为了使 DataGrid 看起来比较美观,还包含了一些界面格式代码,下面的代码将 Products 表的数据显示在 DataGrid:
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub Page_Load(sender as Object, e as EventArgs)
If Not Page.IsPostBack
BindData()
End If
End Sub
Sub BindData()
'1. Create a connection
Const strConnStr as String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\GrocerToGo.mdb"
Dim objConn as New OleDbConnection(strConnStr)
objConn.Open()
'2. Create a command object for the query
Const strSQL as String = "SELECT * FROM Products"
Dim objCmd as New OleDbCommand(strSQL, objConn)
'3. Create/Populate the DataReader
Dim objDR as OleDbDataReader
objDR = objCmd.ExecuteReader()
dgProducts.DataSource = objDR
dgProducts.DataBind()
End Sub
</script>
<asp:DataGrid id="dgProducts" runat="server"
AutoGenerateColumns="False" CellPadding="4"
HeaderStyle-BackColor="Black"
HeaderStyle-ForeColor="White"
HeaderStyle-HorizontalAlign="Center"
HeaderStyle-Font-Bold="True">
<Columns>
<asp:BoundColumn HeaderText="Product ID" DataField="ProductID" />
<asp:BoundColumn HeaderText="Price" DataField="UnitPrice"
ItemStyle-HorizontalAlign="Right"
DataFormatString="{0:$#,###.##}" />
<asp:BoundColumn HeaderText="Name" DataField="ProductName" />
<asp:BoundColumn HeaderText="Description"
DataField="ProductDescription" />
</Columns>
</asp:DataGrid>
上述代码浅显易懂,BindData()函数读取 Products 表的数据到一个 DataReader,然后绑定到一个名为 dgProducts 的 DataGrid。
留意 Page_Load 件处理器
我们注意到在 Page_Load 事件处理器里,只有当初次登录页面时,才调用 BindData()子程序.也就是说,当页面产生回传时并不会调用 BindData()子程序,这是非常关键的!如何你进行修改,每次登录页面时都调用 BindData(),你编辑的数值就不会保存在数据库里。欲知详情请参考常见问题答疑:Why Your DataGrid's Updates Don't Show Up。(相关链接为http://datawebcontrols.com/faqs/Editing/EditedValuesNotSaved.shtml)
现在我们将数据显示在 DataGrid 里,接下来我们要对数据进行编辑。在 DataGrid 里有一个名为EditCommandColumn 的控件,其在 DataGrid 的每一行显示一个"Edit" 按钮。EditCommandColumn 控件是如何允许最终用户编辑某一特定行的呢?我们将在下半部分阐述。
【注:本文由控件中国网转载】