ASP.NET中Datagrid常见错误

分类: asp.net技巧   出处:iocblog整理  更新时间:2008-09-03   添加到收藏  

  摘要:学习如何避免在使用 asp.net datagrid 控件进行开发时可能发生的一些常见错误。

  datagrid 控件是 microsoft? asp.net 中功能最强、用途最广的 web 控件之一,这一点已经得到了 asp.net 权威人士的认同。虽然 datagrid 控件易于使用,但同样易于给使用者带来麻烦。以下是许多人所犯的一些错误,这些人包括从初学者到富有经验的 .net 专家。您可以看到许多苦闷的使用者在 asp.net 新闻组和论坛就这些错误提出问题。遵循本文概述的相当简单的步骤,可以帮助您避免这些错误,并节约大量的开发时间。

  可以使用 datagrid 创建列表数据而没有使用

  我知道您不会再使用如下所示的代码,但 asp.net 领域中许多守旧的用户仍在继续使用它们:

response.write("<table>")
while mydatareader.read()
response.write("<tr>")
response.write("<td>")
response.write(mydatareader(0))
response.write("</td>")
response.write("</tr>")
loop
response.write("</table>") 

  可以对以上代码进行简化,使其仅为:

<asp:datagrid runat="server" datasource="mydatareader"/>

  并调用 .databind() 方法。即使需要对html输出进行特殊的控制,您也可以在用户界面上记录集的内容重复出现的情况下,使用某个数据 web 控件。

  忘记在 page_load 事件中检查 ispostback

  最常见的错误之一是忘记在数据绑定之前检查页面的 ispostback 条件。例如,datagrid 处于“edit”(编辑)模式时,忽略该项检查将导致已编辑的值被数据源中的原始值覆盖。然而,该规则至少有一个主要的例外,请参阅持续使用大型 viewstate。

  以下是包含 ispostback 检查的一个典型 page_load 事件。bindgrid() 是一个例程,用于导入并设置 datagrid 的数据源,并调用 databind() 方法。

sub page_load
if not ispostback then
bindgrid()
end if
end sub

  需要更大的灵活性时,仍坚持使用自动生成的列

  如果 datagrid 所处的环境需要任何一种特殊格式,或是需要使用 datagrid 中的其他任何 web 控件,那么必须关闭 autogeneratecolumns。将 autogeneratecolumns 属性的设置保持为“true”(默认设置)的做法,仅在最简单的 datagrid 方案中有效。但对几乎所有实际的应用程序,必须将该属性设置为“false”,并在 datagrid 声明的 <columns></columns> 段中明确地指定列。microsoft visual studio? .net 用户可以使用属性生成器以图形化的方式创建这些列。

  注意:如果将 autogeneratecolumns 的设置保持为“true”,并且在 datagrid 的 <columns> 段中指定了列,那么最终将得到对列的重复设置。系统将首先显示特别声明的列,随后是所有自动生成的列。

  尝试仅使用控件 id 来引用 datagrid 项目中的控件

  许多人没有认识到,对于 datagrid 的 templatecolumn 下的 itemtemplate 中的控件(例如带有“mytextbox”id 的 textbox 控件),不能在后面的代码或是在 aspx 页面的 <script> 段中用如下所示的代码来直接调用该控件:[来源 www.iocblog.net]

dim myvalue as string = mytextbox.text

  该代码将导致可怕的“名称‘mytextbox’没有声明”错误。

  因为 datagrid 是由多个行(项目)组成的,所以数据源中的每一行实际都会有一个单独的“mytextbox”实例。asp.net 在每个控件的 id 前面加上该控件层次结构中每个命名容器的 id,这样 textbox 将具有唯一的 id,与页面中所有其他控件的 id 都不相同。例如,如果 mytextbox 处于 datagrid1 中,那么生成的 id 将是 datagrid1:_ctl2:mytextbox。“_ctl2”代表 mytextbox 所处的当前行。页面中其他 mytextbox 实例的 id 可能是 datagrid1:_ctl3:mytextbox、datagrid1:_ctl4:mytextbox 等等。要检索需要查找的“mytextbox”值,需要对适当的 datagriditem 调用 findcontrol 方法。该 datagriditem 用作 textbox 的父命名容器。

  html:

<asp:datagrid runat="server" id="datagrid1">
<columns>
<asp:templatecolumn>
<itemtemplate>
<asp:textbox runat="server" id="mytextbox"/>
</itemtemplate>
</asp:templatecolumn>
</columns>

  代码:

sub datagrid1_updatecommand(sender as object, e as datagridcommandeventargs)
 dim myvalue as string = ctype(e.item.findcontrol("mytextbox"), textbox).text
 '对 myvalue 执行操作
end sub

  对 findcontrol 调用的结果调用 ctype,将会把返回值由 object 类型强制转换成 textbox 类型,以访问 .text 属性。

[1] [2] 下一页


Tag: DataGrid