DataGrid,HeadTemplate and Client-Side Script
DataGrid真的是一个好东西,不光是方便的解决的数据列表和分页的问题。对于Editable Grid的支持也不错,虽然比起当初我在Asp时代的全部用JavaScript生成的那个Editable Grid的功能差了一些,不过我那个东东的封装可是没有人家这个这么直接。好在DataGrid提供的功能已经能够足够满足大多数的应用。
HeadTemplate中最让人感觉受不了的就是没有onClick的Server-Side事件,据我所知国人非常喜欢用href的onClick来实现很多的功能,最终选择了来实现对选中的记录的删除,删除本身是很好实现的,问题是我们一般在删除的时候习惯于对用户提示是否删除,而我们知道Server-Side是不可能提供这样的功能的。因此我们必须想办法使用Client-Side的脚本代码。
问题是这样的Client-Side的代码如何同我们的代码关联起来呢?
通过查询MSDN,我们知道了四种方法可以实现ClientScript的功能,分别是
1.GetPostBackEventReference
2 RegisterArrayDeclaration
3 RegisterClientScriptBlock
4 RegisterStartupScript
其中,GetPostBackEventReference一般在user custom control中使用,我们在这里不做讨论Kaneboy's Blog尚有一个例子,我们着重讨论一下剩余的三个Register函数的用法。
RegisterArrayDeclaration向客户端声明一个Client Array以便 Client Script使用
RegisterClientScriptBlock和RegisterStartupScript 的区别在于,RegisterStartupScript 一般都只有一行代码,而且RegisterClientScriptBlock将ClientScript放在开始的地方,而RegisterStartupScript 将代码放在结束的位置。
OK,有了这些知识以后,我们开始下面的代码。首先我们需要为我们的ImageButton增加Attributes,可是我们如何去得到这个ImageButton呢?这个Button是Grid的内部控件,我们在ItemDataBound事件中通过下面的代码得到
Dim InnerControl As Control
InnerControl = e.Item.FindControl("delLink")
If Not InnerControl Is Nothing Then
Dim InnerButton As ImageButton
InnerButton = CType(InnerControl, ImageButton)
InnerButton.Attributes.Add("onclick", "return confirm(确认要删除吗?');")
End If
这段代码执行起来没有任何问题,但是这个时候我们自然会有这样的想法,如果这个ClientScript代码非常复杂的话,我们该如何来处理呢?说起来,这个问题其实也很常见,比如我们如果想将最后的一句话修改成为
InnerButton.Attributes.Add("onclick", "return confirmDel();")
我们自然会想到 这样的方法,不错这个方法很好,不过别着急。这样的努力是不会成功的,虽然我们把这样的运行的代码另存成HTML以后,我们会发现Js代码按照我们的预期执行了,但是在运行模式下,这样的不会成功的。解释如下:“ASP.Net can only emit code where there is either databinding <%# %>or runat=server. Thus, the "standard processing area" is the area. This is required for ASP.Net to function and therefore only allows dynamic content to be added between the
申明
非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!
博文欢迎转载,但请给出原文连接。