65.9K
CodeProject 正在变化。 阅读更多。
Home

如何将 DataGrid 转换为数据录入表单

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.45/5 (33投票s)

2004年9月16日

5分钟阅读

viewsIcon

245676

downloadIcon

9114

本文介绍如何将 DataGrid 转换为用于录入同类数据的录入表单。

引言

DataGrid 不仅仅是一个简单的数据展示控件,通过其内置的各种属性,我们可以在商业应用程序中使用它。DataGrid 控件支持重复数据的显示,例如数据库报表和查询。DataGrid 控件被渲染为一个表格,并包含许多允许您自定义外观和丰富控件整体功能的特性。

背景

在本示例中,我使用了 DataGrid 的模板列编辑属性,并对 DataGrid 进行了修改,使其能够轻松地将数据录入到 DataGrid 内部的控件中,并从中检索值,从而使 DataGrid 看起来像一个同类数据的录入表单。

Sample Image - EditDataGrid.jpg

示例应用程序的截图如下所示。

该示例使用了 SQL Server 2000 数据库,连接字符串放在 Web.Config 文件中。这样做的优点是,即使更改 .config 文件中的数据库连接字符串,应用程序也能在不重新编译的情况下执行。数据库设计也在下面进行说明。示例代码下载也有 C# 和 Visual Basic .NET 版本。

DataGrid 编辑

DataGrid 提供了 EditCommandColumn 控件用于编辑。EditCommandColumn 控件会在 DataGrid 中添加一个新列,并在每行旁边放置一个编辑按钮。点击该按钮会触发回发并激发 EditCommand 事件。我们需要编写代码来处理此事件。

<Columns>
    <asp:EditCommandColumn EditText="Edit"  ID="DataGrid1"  
          ButtonType="PushButton"
          UpdateText="Update" CancelText="Cancel" />
</Columns>

EditCommandColumn 控件的 ButtonType 包括默认的 LinkButtonPushButtonDataGridEditItemIndex 属性指定了正在编辑的 DataGrid 的哪一行。DataGrid 无法自行编辑数据,因此当点击编辑按钮时,我们必须编写代码在 EditCommand 事件处理程序中进行处理。EditCommand 事件处理程序是当点击编辑按钮时激发的 DataGrid 事件处理程序。此事件处理程序只需将 EditItemIndex 属性设置为点击了编辑按钮的行,然后重新绑定 DataGridDataGrid 行的编号从 0 开始,默认情况下,EditItemIndex 的值为 -1。

DataGrid1.EditItemIndex = e.Item.ItemIndex;

取消按钮用于在不保存任何更改的情况下将 DataGrid 返回到非编辑状态。取消按钮还会激发 CancelCommand 事件。在代码隐藏中,我们需要将 EditItemIndex 属性设置为 -1 并重新绑定 DataGrid 控件。

更新按钮在被点击时会激发 UpdateCommand 事件。DataGrid 不提供任何更新功能,更新的责任在于我们。更新按钮的事件处理程序接受两个传入参数:一个 Object 和一个 DataGridCommandEventArgsDataGridCommandEventArgs 参数包含一个 PropertyItem,它是与点击了更新按钮的 DataGrid 行对应的 DataGridItem 的一个实例。此 DataGridItem 对象包含一个 Cells 集合,可以迭代此集合以检索 DataGrid 各列的文本或控件。为了确定用户输入的值,我们必须使用 DataGridItem 对象。

数据库

考虑一家软件公司的员工表,它存储了所有员工记录。可以使用以下 CREATE TABLE 语句创建该表。

CREATE TABLE [dbo].[EMPLOYEEDETAILS] (
 [ID] [int] IDENTITY (1, 1) NOT NULL ,
 [NAME] [char] (20) NULL ,
 [DESIGNATION] [char] (20) NULL ,
 [SEX] [char] (20) NULL ,
 [AGE] [int] NULL ,
 [SALARY] [decimal](18, 0) NULL 
) ON [PRIMARY]
GO

您可以在新数据库或任何现有数据库中创建上述表格。示例应用程序中的 DataGrid 将与上述表格进行绑定。

代码工作原理?

要将 DataGrid 转换为数据录入表单,请定义一个编辑模板,并在列单元格中填充所需的 HTML 控件和代码,以实现有效的数据录入。在示例应用程序中,我使用了不同的图像来代替编辑、取消和更新按钮。

<asp:TemplateColumn HeaderText="AGE">
 <HeaderStyle HorizontalAlign="Center"></HeaderStyle>
 <ItemTemplate>
  <asp:label runat="server" 
      Text='<%# DataBinder.Eval(Container.DataItem, "AGE")  %>' 
      ID="Label3" />
 </ItemTemplate>
 <EditItemTemplate>
  <asp:textbox runat="server" 
      Text='<%# DataBinder.Eval(Container.DataItem, "AGE") %>' 
      ID="Textbox2" />
 </EditItemTemplate>
</asp:TemplateColumn>

ItemTemplate 是标识用于正常渲染的 HTML 模板的关键字。AlternatingItemTemplate 是用于渲染偶数位置行的模板名称。对于正在编辑的行,模板名称是 EditTemplateName。模板列必须有机会定义其单元格在所有可能情况下如何渲染。这包括正常和交替项,以及行被选中或编辑时的项的外观。

ASP.NET 数据绑定技术允许您将内联控件(如 LabelTextBox)与来自数据源的文本关联起来。由于我们必须从 EditItemTemplate 中的控件检索当前值,因此我们必须为控件分配唯一的 ID。数据绑定可以减少与服务器的往返次数,因为一旦下载了请求的数据,通常就不需要与服务器进行交互了。数据源可以是实现 System.Collection.ICollection 接口的任何对象。

DataBinder.Eval(Container.DataItem, fieldname);
DataSource='<%# ListOfDesignations()%>

DataBinder 类提供了一个静态方法 Eval,它使用反射在运行时解析和评估对象上的数据绑定表达式。ASP.NET <%# 语法将 Eval 返回的值绑定到 ControlDataGrid 单元格。本地函数 ListOfDesignations 必须返回一个派生自 ICollection 的类型,因为这是 DataSource 属性期望接收的内容。

取消按钮和编辑按钮的工作方式与前面解释的普通 DataGrid 相同,但要更新可编辑 DataGrid 的内容,我们必须从涉及更新的控件中检索最新信息。我们可以在 Datagrid1_Update 中编写代码,使用以下任何一种方法从控件中检索值:

TextBox tb =  (TextBox) e.Item.FindControl("Textbox2");

或者

TextBox tb =  (TextBox) e.Item.Cells(2).Controls(0);

我们可以通过列的零基序数位置来引用每个控件。由于我们使用了模板进行编辑,控件是由我们生成的,我们知道必要的 ID。FindControlControl 类的一个方法,用于搜索具有指定名称的子控件。

在此示例中,编辑按钮用于通过数据库的 ID 字段处理新条目和编辑。如果 ID 为 null,则可以得出结论用户正在输入新数据,并且 ID 字段在 DataGrid 中被设置为只读,以便用户无法编辑 ID。

结论

DataGrid 控件的用途不仅限于数据展示,还可以通过简单的代码行实现编辑功能。我希望本文能帮助您更深入地了解 DataGrid 编辑。

© . All rights reserved.