当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > ASP.NET立即上手教程(10)

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

ASP.NET立即上手教程(10)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 41 ::
收藏到网摘: n/a

在SQL数据库中更新数据

在web应用程序中更新数据库常常是一件棘手的事情。DataGrid控件提供了一些内建的支持,使得更新数据库变得容易。要想编辑行记录,DataGrid支持一个整数类型的EditItemIndex属性,他用来指明表格控件的哪一行是可编辑的。当设定该属性之后,DataGrid中对应的行用输入框来代替标签。值-1表示没有可编辑的行。Asp.net页面可以在服务器端表单中包含DataGrid控件,通过DataGrid控件的对象模型来访问可编辑的数据。

为了判断哪一行将被编辑,你需要接收一些用户的输入,以此来判断他们将编辑哪一行。DataGrid可以包含EditCommandColumn属性,它提供了一个连接,用以激活三个特定的事件:EditCommand、UpdateCommand、和CancelCommand。EditCommandColumn被加在DataGrid的列集合中,如下面的例子所示:

以下为引用的内容:

<ASP:DataGrid id="MyDataGrid" runat="server"
 ...
 OnEditCommand="MyDataGrid_Edit"
 OnCancelCommand="MyDataGrid_Cancel"
 OnUpdateCommand="MyDataGrid_Update"
 DataKeyField="au_id"
>

 <Columns>
  <asp:EditCommandColumn EditText="Edit" CancelText="Cancel" UpdateText="Update" />
 </Columns>

</ASP:DataGrid>

在DataGrid标签上,可以绑定每一个从EditCommandColumn激活的命令事件句柄。这些句柄的DataGridCommandEventArgs参数可以让你直接访问从客户端选择的可编辑行索引值。注意,为了使更改生效,你需要重新绑定DataGrid,像下面的例子这样:

以下为引用的内容:
public void MyDataGrid_Edit(Object sender, DataGridCommandEventArgs E) {
  MyDataGrid.EditItemIndex = (int)E.Item.ItemIndex;
  BindGrid();
}

当编辑DataGrid中的行的时候,EditCommandColumn提供了可供使用的两个连接:Update 和 Cancel。如果客户端选择了cancel,你只需将EditItemIndex设置为-1。如果客户端选择了Update,你需要对数据库执行你的更新命令。执行更新命令的时候,你需要知道被编辑行在数据库中对应记录的主键。为了支持这个功能,DataGrid提供了一个DataKeyField属性,可以用来设置主键对应的字段。在绑定到UpdateCommand的事件句柄中,你可以从DataGrid的数据键集合取得键的名称。你可以使用事件的ItemIndex来索引集合,像下面的例子:

myCommand.Parameters["@Id"].Value = MyDataGrid.DataKeys[(int)E.Item.ItemIndex];


在更新事件句柄结束以后,将EditItemIndex设置为-1。下面的例子演示了这种情况。

前面的例子中有一个问题,那就是当编辑一行的时候,主键字段(au_id)也提供了一个文本输入框。因为需要这个值来确定数据库中的哪一行记录被更新,所以你可能不希望客户端改变这个值。幸运的是,你可以通过详细指定每一个可编辑行的外观,来禁止该列提供文本输入框。具体方法是使用BoundColumn控件来分配每一列的数据字段,在DataGrid的列集合定义每一行。使用这种技术可以实现列的完全控制,当然也包括ReadOnly属性。对于au_id列,你可以设置它的ReadOnly属性为true。这样,当一行处于编辑模式的时候,au_id列依然显示为一个文本标签,而不是文本输入框。下面的例子演示了这种技术。

BoundColumn控件并非DataGrid的列集合中可以设置属性的唯一控件。你也可以指定TemplateColumn,它对列的内容提供了完全的控制。模板对内容的显示更具有随意性,你可以在DataGrid的列中提供你喜欢的任何控件,也包括服务器端控件。下面的例子演示了如何使用TemplateColumn,对"State"列使用下拉列表服务器控件,对"Contract"列使用复选框html控件。Asp.net数据绑定语法用于在模板中输出数据字段的值。注意在编辑行中映射下拉列表和复选框到的state时候有一点小技巧。

如同在TemplateColumn中放置下拉列表框或者复选框一样,你也可以在其中放置其他控件。下面的例子中,添加了一个Validator验证控件,在执行更新之前检查客户端的输入。

在SQL数据库中删除数据

从数据库中删除记录非常类似于更新或者插入命令,但是你依然需要确定表格中要删除的特定行。可以添加到DataGrid列中的另一个控件是ButtonColumn,它仅仅提供了一个按钮控件。ButtonColumn支持一个CommandName属性,可以设置为“Delete”。在DataGrid上,当你执行删除操作的时候,需要对DeleteCommand绑定一个事件句柄。此外,你需要使用数据键(DataKeys)集合来确定客户端选定的行。下面的例子演示了这一过程:

从SQL数据库中排序

对于任何表格来说,常常要求它对所包含的数据具有排序的能力。然而,DataGrid控件本身并不具有数据排序的功能。它通过用户单击要对数据排序的列标题,调用事件句柄。当DataGrid的 AllowSorting属性被设置为true,DataGrid就为列标题提供了一个超链接,用以对表格激活Sort命令。你可以给DataGrid的OnSortCommand属性设置句柄,来处理用户的单击。列的名字作为SortExpression 的属性,传递给DataGridSortCommandEventArgs的参数。该参数可以用来设置绑定到表格的DataView的Sort属性。请看下面的代码和例子。

以下为引用的内容:

<script>
  protected void MyDataGrid_Sort(Object Src, DataGridSortCommandEventArgs E) {
    ...
    DataView Source = ds.Tables["Authors"].DefaultView;
    Source.Sort = E.SortExpression;
    MyDataGrid.DataBind();
  }
</script>

<form runat="server">
  <ASP:DataGrid id="MyDataGrid" OnSortCommand="MyDataGrid_Sort" AllowSorting="true" runat="server" />
</form>

当你使用BoundColumn控件的时候,可以明确地为每一列设置SortExpression属性,就象下面的实例
C# DataGrid12.aspx
[运行] | [源代码]
运用主-从关系
常常有这样的情况:数据模型包含的关系不能仅仅通过一个表格来表现。很多时候,在基于web的界面中,用户选择数据中的某一行(通常是标题),然后重新定位到“细节”页面(通常是内容),显示用户所选行的详细信息。为了使用DataGrid来完成这个工作,需要添加HyperLinkColumn到列集合。HyperLinkColumn指定当用户单击超连接的时候将要重新定向的细节页面。你可以在这个超链接中使用格式化字符串语法提交字段值,字段值作为get方式提交字符串的参数。下面的例子演示了这一过程。

以下为引用的内容:
  <ASP:DataGrid id="MyDataGrid" runat="server">
   <Columns>
     <asp:HyperLinkColumn
      DataNavigateUrlField="au_id"
      DataNavigateUrlFormatString="datagrid13_details.aspx?id={0}"
      Text="Get Details"
     />
   </Columns>
  </ASP:DataGrid>

在细节页面中,可以取得提交字符串的参数,并且执行一个联合(join)查询语句,从数据库中获取详细信息。参阅下面的例子:

书写和使用存储过程

一般来说,执行特定的查询可以取得不同的执行性能。使用存储过程可以降低应用程序中数据库的负荷。存储过程很容易创建,甚至可以使用SQL语句来创建。下面的代码建立了一个简单的返回一个表的存储过程:

以下为引用的内容:
CREATE Procedure GetAuthors AS
  SELECT * FROM Authors
  return
GO

你也可以建立一个可以接受参数的存储过程,例如:

以下为引用的内容:
CREATE Procedure LoadPersonalizationSettings (@UserId varchar(50)) AS
  SELECT * FROM Personalization WHERE UserID=@UserId
  return
GO

从ASP.NET页面中使用存储过程不过是SqlCommand对象的扩展。CommandText是用来代替特定查询文本的存储过程的名字。你可以通过设定CommandType的属性来指定SqlCommand的CommandText为存储过程。

myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;

下面的例子演示了调用存储过程来填充DataSet。