分享
 
 
 

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

王朝asp·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

在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。下面的例子演示了这种情况。

C# DataGrid6.aspx

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

C# DataGrid7.aspx

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

C# DataGrid8.aspx

[运行] | [源代码]

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

C# DataGrid9.aspx

[运行] | [源代码]

在SQL数据库中删除数据

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

C# DataGrid10.aspx

[运行] | [源代码]

从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>

C# DataGrid11.aspx

[运行] | [源代码]

当你使用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)查询语句,从数据库中获取详细信息。参阅下面的例子:

C# DataGrid13.aspx

[运行] | [源代码]

书写和使用存储过程

一般来说,执行特定的查询可以取得不同的执行性能。使用存储过程可以降低应用程序中数据库的负荷。存储过程很容易创建,甚至可以使用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对象的扩展

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有