DataGrid,HeadTemplate and Client-Side Script

DataGrid真的是一个好东西,不光是方便的解决的数据列表和分页的问题。对于Editable Grid的支持也不错,虽然比起当初我在Asp时代的全部用JavaScript生成的那个Editable Grid的功能差了一些,不过我那个东东的封装可是没有人家这个这么直接。好在DataGrid提供的功能已经能够足够满足大多数的应用。

Editable Grid 

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使用
RegisterClientScriptBlockRegisterStartupScript 的区别在于,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

tags. ”

不过既然这样,我们也不要去强求,我们可以利用下面的代码使得我们的工作顺利进行下去:

        Dim scriptFile As System.IO.File

        Dim readStread As System.IO.StreamReader

        readStread = scriptFile.OpenText(Server.MapPath("MemberManage.js"))

        Dim strScript As String

        strScript = readStread.ReadToEnd()

        readStread.Close()

        strScript = " "

        If (Not Page.IsClientScriptBlockRegistered("clientScript")) Then

            Page.RegisterClientScriptBlock("clientScript", strScript)

        End If

 

Link:http://weblogs.asp.net/asmith/articles/25465.aspx

posted @ 2006-11-08 09:55  Athrun  阅读(218)  评论(0编辑  收藏  举报