当前位置: 首页 > news >正文

用网格控件读取和编辑数据

  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.单击“更新”按钮。网格重新显示,并显示已作的更改;也可看看数据库中是否已作更改。

相关文章:

  • 华东计算机技术研究所欠债,华东计算技术研究所
  • 使用Web窗体中的验证控件
  • 点错科技树 机械计算机,冰汽时代科技怎么点 冰汽时代全科技树汇总
  • C#网页计数器
  • 宇宙机器人超级计算机,宇宙机器人无线控制器使用指南白金攻略
  • Iisweb.vbs:IIS 网站管理脚本
  • 数学教育与计算机教育的新讲座的心得体会,数学新课程培训心得体会(精选7篇)...
  • Mathematica
  • 杭电计算机接口实验报告,2009杭电微机原理与接口技术考试及答案
  • 金属模量计算机作图过程,图1-20图解法测G.ppt
  • 用ASP 取得目录下的文件名
  • 围绕EMF探索(3)之初探OCL
  • 北师计算机硕士有宿舍吗,学校不提供宿舍北大北师大研究生吐槽
  • 放弃完美的需求管理
  • 2012服务器远程连接设置,Win Server2012怎么添加用户并设置远程登录
  • [NodeJS] 关于Buffer
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • 10个确保微服务与容器安全的最佳实践
  • 2019年如何成为全栈工程师?
  • ES6--对象的扩展
  • Go 语言编译器的 //go: 详解
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • js
  • Mybatis初体验
  • nodejs实现webservice问题总结
  • PHP的类修饰符与访问修饰符
  • Redux 中间件分析
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • tweak 支持第三方库
  • 欢迎参加第二届中国游戏开发者大会
  • 缓存与缓冲
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • ------- 计算机网络基础
  • 聊聊sentinel的DegradeSlot
  • 网络应用优化——时延与带宽
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 小程序button引导用户授权
  • 写代码的正确姿势
  • const的用法,特别是用在函数前面与后面的区别
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #在 README.md 中生成项目目录结构
  • (003)SlickEdit Unity的补全
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (十六)串口UART
  • (十一)图像的罗伯特梯度锐化
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)visual stdio 书签功能介绍
  • .gitignore
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 药厂业务系统 CPU爆高分析