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

来源:互联网 发布: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.单击“更新”按钮。网格重新显示,并显示已作的更改;也可看看数据库中是否已作更改。
原创粉丝点击