用网格控件读取和编辑数据
来源:互联网 发布:js 获取兄弟节点 编辑:程序博客网 时间:2024/05/01 21:54
Web窗体数据的数据绑定虽然好用,但不能对数据库进行更改,因此如果要将数据写入数据库中就只有通过别的方法来实现,例如,我们用一个网格控件(DataGrid)来实现这一任务。
在这个例子中,我们想实现图2.25所示的功能,通过一个网格控件来显示数据,允许用户对它上面的数据进行编辑,且还能将编辑后的数据发送回数据库。本工作示例的实现可分为以下几个过程:
·创建Web窗体页。
·添加必要的数据组件。
·添加显示数据的DataGrid控件。
·添加从数据库读取数据并将网格绑定到数据的代码。
·配置DataGrid控件以允许用户编辑数据。
·添加更新数据的代码。
1创建项目和窗体
首先让我们来创建Web应用程序和Web窗体页。
2创建和配置数据集
下面我们用数据集来访问数据,包含以下两个过程:
·使用向导创建数据适配器。该适配器包含用于读取和写入数据库信息的SQL语句。该向导帮助我们定义所需的SQL语句。如有必要,该向导还可创建与数据库的连接。
·生成数据集架构。我们将让VisualStudio基于正在访问的表和列创建一个新的数据集类。在生成数据集类时,将向窗体中添加该类的一个实例。配置数据连接和数据适配器根据以上方案,我们将首先创建一个数据适配器,该数据适配器包含以后用于填充数据集的SQL语句。作为此过程的一部分,定义连接以访问数据库。我们使用向导配置数据适配器,该向导使创建数据访问所需的SQL语句变得容易。
1.单击WebForm1.aspx,然后将OleDbDataAdapter对象从“工具箱”的“数据”选项卡拖到页上。此时,启动“数据适配器配置向导”。
2.在该向导中,执行下列操作:
·在第二个窗格中,创建或选择一个指向SQLServerNorthwind数据库的连接。
·在第三个窗格中,指定要使用SQL语句访问数据库。
·在第四个窗格中创建以下SQL语句:
SELECT CategoryID,CategoryName,Description FROM Categories
·单击“完成”按钮。
此时,向导创建了一个连接,它包含有关如何访问数据库的信息。我们还将具有一个包含查询的数据适配器,该查询定义所要访问数据库中的表和列。创建数据集在建立连接到数据库的方法并通过SQL命令指定所需的信息后,接下来生成数据集。
1.执行“数据”|“生成数据集”命令,出现“生成数据集”对话框。
2.选择“新建”选项,将该数据集命名为dsCategories。在“选择要添加到数据集中的表”的列表中,确保选择了Categories表。
3.确保选中“将此数据集添加到设计器”选项,然后单击“确定”按钮。此时,可在“解决方案资源管理器”中看到数据集文件(dsCategories.xsd)。
3添加显示数据的DataGrid控件
创建数据集之后,就可以添加DataGrid控件了,并可将它绑定到数据集以显示数据。
1.单击当前窗口顶部的选项卡切换到Web窗体设计器。
2.从“工具箱”的“Web窗体”选项卡中,将一个DataGrid控件拖到窗体上。
3.选择该控件,按F4键显示“属性”窗口,在窗口的底部,单击“属性生成器”,出现“DataGrid1属性”对话框。
4.在“常规”选项卡中,完成如下表所示的属性设置:
属性设置说明
DataSourcedsCategories1将网格绑定到数据集
DataMemberCategories指定网格应该显示的数据
DatakeyfieldCategoryID指定类别记录的主键是CategoryID列,确定更新数据集中的哪个记录
5.单击“确定”按钮关闭“DataGrid1属性”对话框。
6.如果要更改网格的外观,可设置“Font”(字体)、“BackColor”(背景色)及其他属性。
4填充数据集并在DataGrid控件中显示数据
为了在DataGrid控件中显示数据,我们还需要实现以下过程:
①调用数据适配器方法来填充数据集;
②将网格显式绑定到它的数据源。
1.双击当前页,在代码编辑器中显示该页的类文件。
2.在Page_Load事件处理程序中,调用数据适配器的Fill方法并向其传递要填充的数据集,如下所示:
//C#
sqlDataAdapter1.Fill(dsCategories1);
3.调用DataGrid控件的DataBind方法,将该控件绑定到数据集。但是,我们不想在页每次往返时都重新绑定控件,因为如果这样做,将丢失用户已在网格中进行的更改。因此,在以下这些情况中绑定网格:
·第一次调用页时。
·数据集更改时。
现在,我们要在第一次调用页时绑定网格,这可以通过测试页的IsPostBack属性完成。在调用了适配器的Fill方法之后将代码添加到Page_Load事件处理程序中。如下所示:
//C#
privatevoidPage_Load(objectsender,System.EventArgse)
{
//Putusercodetoinitializethepagehere
sqlDataAdapter1.Fill(dsCategories1);
if(!IsPostBack)
{
DataGrid1.DataBind();
}
}
5添加编辑数据的功能
现在,DataGrid控件将显示Categories表中的数据,但是我们还不能编辑这些数据并加以保存,为此,我们将向网格的每一行添加一个“编辑”按钮。用户单击该按钮时,网格以编辑模式重新显示,用户可以在文本框中逐个编辑。当行处于编辑模式时,“编辑”按钮由另外两个按钮(一个“更新”按钮和一个“取消”按钮)代替。现在我们要实现以下过程:
·“编辑”按钮使当前行进入编辑状态;
·“取消”按钮使已完成的编辑作废,并返回到显示模式;
·“更新”按钮能够用当前的内容更新数据库。第2章用C#开发Web程序65
向DataGrid控件添加编辑功能
1.在Web窗体设计器的“设计”视图中,选择DataGrid控件,按F4键显示“属性”窗口,然后单击该窗口底部的“属性生成器”,显示“DataGrid1属性”对话框。
2.单击“列”选项卡。
3.在“列列表”下面,在“可用列”列表中打开“按钮列”节点。
4.选择“编辑、更新、取消”并单击“添加”按钮,将这些按钮添加到“选定的列”框中。
5.单击“确定”按钮。
DataGrid控件重新显示,同时在左侧的列中显示“编辑”链接按钮(LinkButton)。(最初,我们看不到“更新”和“取消”按钮。)既已具有了“编辑”按钮,我们还需要创建事件处理程序来设置行的编辑模式。若要
控制编辑模式,请将DataGrid控件的EditItemIndex属性设置为要编辑行的索引(从零开始的)。例如,若要将第三行设置为编辑模式,请将该属性设置为2。若要某行返回到显示模式,请将该属性设置为–1。在更改了编辑模式后,必须重新绑定网格使其显示该行中的数据。
我们可以通过传递到处理程序的事件对象确定用户当前所在的行。这些事件的事件对象包含一个Item属性,该属性表示正在被更新的整个DataGrid行。Item对象又支持多个属性,其中包含Item.ItemIndex属性,该属性返回正在操作的行的索引值。
设置编辑模式
1.在“设计”视图中,选择网格并按F4键打开“属性”窗口。
2.单击“属性”窗口顶部的“事件”按钮。
3.双击“属性”窗口中的“EditCommand”。创建一个DataGrid1_EditCommand处理程序。
4.为CancelCommand事件重复步骤2和步骤3。创建一个DataGrid1_CancelCommand处理程序。
5.在EditCommand事件处理程序中添加下面的代码:
//C#
DataGrid1.EditItemIndex=e.Item.ItemIndex;
DataGrid1.DataBind();
6.在CancelCommand事件处理程序中添加下面的代码:
//C#
DataGrid1.EditItemIndex=-1;
DataGrid1.DataBind();
6测试现有的功能
1.在“解决方案资源管理器”中,右击Web窗体页并选择“在浏览器中查看”命令,此时网格中充满数据。
2.单击网格中任何行的“编辑”链接,重新显示该行,并带有以下更改:
·“编辑”替换为“更新”和“取消”链接。
·数据重新显示在TextBox控件中。
3.单击“取消”按钮,该行重新显示在其原始窗体中。
7更新数据集和数据库
因为要将用户在网格中的修改写入数据库,所以分两个过程来实现:首先通过网格中所作的更改来更新数据集,然后将数据集中的更改写回数据库。
1.在“设计”视图中,选择网格并按F4键打开“属性”窗口。
2.单击“属性”窗口顶部的“事件”按钮。
3.双击网格中的“UpdateCommand””。
现在我们创建了DataGrid1_UpdateCommand事件处理程序,接下来需要编写代码,使它能够将数据集中的更改写回数据库。
从DataGrid控件进行更新
从DataGrid控件进行更新包含以下几个过程:
·确定DataGrid控件中哪一行(根据索引)已被更新。然后,从该网格行获取数据键,以便确定正在更新的行(根据ID)。
·从用户更新的网格行获取更改的值。
·使用数据键值在数据集表中查找对应的行,然后将更改写入该行。此时,我们已更新了数据集,但未更新数据库本身。
·将更改从数据集发送到数据库。执行将更改数据从数据集复制到数据库的SQL命令或存储过程。
·刷新DataGrid控件的内容。
下面介绍这些过程中的详细步骤。
1.通过获取传入事件对象的行(Item对象)的ItemIndex属性来确定哪个DataGrid行已被更新。然后使用该索引值从网格的DataKeys集合中获取对应的值。如下所示:
//C#
stringkey=DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
2.从DataGrid行中获取更改的值,可通过以下操作来实现:
·从传入事件对象的项的Cells集合中获取适当的单元格(从零开始的)。例如,网格中最左边一列为Cells(0)。
·对于每个单元格,获取其Controls集合,它包含显示在该单元格中的所有元素。
·从该集合中获取且仅获取第一个控件,在本例中为TextBox控件。若要获取TextBox,声明一个类型TextBox的局部变量,并将Controls集合中的对象分配给它。
·获取TextBox控件的值(其Text属性)。以下面代码显示如何执行这些步骤。
//C#
stringcategoryName;
stringcategoryDescription;
TextBoxtb;
tb=(TextBox)e.Item.Cells[2].Controls[0];
categoryName=tb.Text;
tb=(TextBox)e.Item.Cells[3].Controls[0];
categoryDescription=tb.Text
3.在数据表中查找对应的行。类型化的dsCategories数据集包含一个特殊的FindBy方法(在本例中为FindByCategoryID方法),该方法通过行的主键定位行,并返回一个对行的引用。创建类型化数据行的变量并调用该方法如下所示:
//C#
dsCategories.CategoriesRowr;
r=dsCategories1.Categories.FindByCategoryID(int.Parse(key));
4.通过更改在步骤3所在行中的值更新该行,如下所示:68VisualC#.NET2003开发与技巧
//C#
r.CategoryName=categoryName;
r.Description=categoryDescription;
5.通过调用数据适配器的Update方法将更改从数据集发送到数据库,如下所示:
//C#
sqlDataAdapter1.Update(dsCategories1);
DataGrid1.DataBind();
6.将网格中的当前行切换出编辑模式。如下所示:
//C#
DataGrid1.EditItemIndex=-1;
7.数据绑定DataGrid控件,如下所示:
//C#
DataGrid1.DataBind();
下面的代码显示UpdateCommand事件处理程序。复制该代码并将其粘贴到Web窗体页的类文件。
注意:一定要改写先前创建的主干事件处理程序,否则将有两个方法具有相同的名称和签名。
//C#
privatevoidDataGrid1_UpdateCommand(objectsource,
System.Web.UI.WebControls.DataGridCommandEventArgse)
{
stringcategoryName,categoryDescription;
//Getsthevalueofthekeyfieldoftherowbeingupdated
stringkey=DataGrid1.DataKeys[e.Item.ItemIndex].ToString();
//Getsgetthevalueofthecontrols(textboxes)thattheuser
//updated.TheDataGridcolumnsareexposedastheCellscollection.
//Eachcellhasacollectionofcontrols.Inthiscase,thereisonly
//onecontrolineachcell--aTextBoxcontrol.Togetitsvalue,
//youcopytheTextBoxtoalocalinstance(whichrequirescasting)
//andextractitsTextproperty.
//
//Thefirstcolumn--Cells(0)--containstheUpdateandCancelbuttons.TextBoxtb;
//GetsthevaluetheTextBoxcontrolinthethirdcolumn
tb=(TextBox)(e.Item.Cells[2].Controls[0]);
categoryName=tb.Text;
//GetsthevaluetheTextBoxcontrolinthefourthcolumn
tb=(TextBox)(e.Item.Cells[3].Controls[0]);
categoryDescription=tb.Text;
//Findstherowinthedatasettablethatmatchesthe
//onetheuserupdatedinthegrid.Thisexampleusesa
//specialFindmethoddefinedforthetypeddataset,which
//returnsareferencetotherow.
dsCategories.CategoriesRowr;
r=dsCategories1.Categories.FindByCategoryID(int.Parse(key));
//Updatesthedatasettable.
r.CategoryName=categoryName;
r.Description=categoryDescription;
//CallsaSQLstatementtoupdatethedatabasefromthedataset
sqlDataAdapter1.Update(dsCategories1);
//TakestheDataGridrowoutofeditingmode
DataGrid1.EditItemIndex=-1;
//Refreshesthegrid
DataGrid1.DataBind();
}
8对页进行测试
1.在“解决方案资源管理器”中,右击Web窗体页并选择“在浏览器中查看”命令。当前项目将被编译,Web窗体页将显示在设计器的浏览器窗格中。
2.单击网格中任何一行的“编辑”链接,然后使用文本框编辑该行。
3.单击“更新”按钮。网格重新显示,并显示已作的更改;也可看看数据库中是否已作更改。
- 用网格控件读取和编辑数据
- 数据网格的编辑
- 7 数据网格的编辑
- 数据绑定和数据网格视图(DataGridView)控件
- 从一个文本文件中读取数据显示在网格控件mshflexgrid中
- 在流传的时候,用控件来读取和编辑在线文档.?
- R161208_SPSS数据读取、数据编辑
- dropDownList 控件动态绑定数据和读取
- 如何获得当前编辑行的句柄(网格控件)
- ExtJs学习笔记(4)_EditorGridPanel(可编辑的网格控件)
- 用户控件的运用和读取控件的数据
- thinkphp 读取mysql数据 编辑
- jQuery EasyUI使用教程之启用数据网格内联编辑
- 读取,编辑和执行文件
- 在Azure环境里,Sharepoint 2013 实现从CRM(Dynamics)读取数据,编辑和新建。
- --=== 利用微软网格控件进行编辑输入==--
- --=== 利用微软网格控件进行编辑输入==--
- --=== 利用微软网格控件进行编辑输入==--
- TCP端口作用,漏洞,操作详析--杨义贤
- 打印机墨水添加方法
- VeriSign:专门做信息安全的公司有这么外行的错误
- 验证吗
- IIS管理
- 用网格控件读取和编辑数据
- 图片加水印
- C# 视频教程
- VC++ 的串口通讯
- java Native Method初涉
- ARP攻击原理及解决方法
- 使用wxWidgets开发跨平台的GUI程序
- 中国政府向索马里过渡政府提供2000万元无偿援助
- ARP的欺骗原理及路由器的先天免疫