GridView中自定义单选按钮列的实现!

最近工作中需要实现GridView中单选按钮列,用于单选GridView中的数据行。经过研究,终于解决了这个问题,不过限于能力有限,还有点不足。
实现思路:
经过思考,觉得如何使GridView选中某一行,是关键。GridView自动生成的选择列,是通过点击时执行Javascript回发实现的。具体的Javascript形如:javascript:__doPostBack('gdvSample','Select$4'),研究发现:gdvSample是GridView的UniqueID(是UniqueID,并不是ID,也不是ClientID)。而Select$4更简单,“4”就是数据行的索引。
如果我们在单选控件的onclick事件中调用这个脚本一定也可以实现。
为了易于使用,减少代码修改量,经研究,决定通过集成实现BoundField类。

具体实现,有兴趣的朋友可以参见代码。为了给大家解释,代码注释并没有可以规范书写(^_^也因为能力嘛。呵呵)。
代码中,有两处向单元格中添加RadioButton控件,一处是重写的OnDataBindField方法中,用于初次绑定数据源时。另一处是重写的InitializeCell方法中,用于页面回发后,生成GridView时。

主要代码:
(一)
            /*
             *
             *有时候,页面不没有回发需要的脚本函数及一些Hidden元素,需要自己添加
             *
             */
            string postBackScript = "var _theForm = document.forms['" + gridView.Page.Form.ClientID + "'];"
                + "if (!_theForm) {"
                + "    _theForm = document." + gridView.Page.Form.ClientID + ";"
                + "}"
               
   (  省略的代码 )

                + "function __doRBPostBack(eventTarget, eventArgument) {"
                + "     if (!_theForm.onsubmit || (_theForm.onsubmit() != false)) {"
                + "        _theForm.__EVENTTARGET.value = eventTarget;"
                + "        _theForm.__EVENTARGUMENT.value = eventArgument;"
                + "        _theForm.submit();"
                + "     }"
                + "}";

            gridView.Page.ClientScript.RegisterStartupScript(typeof(System.Web.UI.Page),
                "GridView_RN_PostBackScript", postBackScript, true);


  这段代码是为了防止页面上没有支持PostBack的脚本函数及需要的__EVENTTARGET和__EVENTARGUMENT元素。


(二)
                    rb.Attributes.Add("onclick", "javascript:__doRBPostBack('" +
                    gridView.UniqueID +
                    "','Select$" +
                    rowIndex.ToString() +
                    "')");

这就是向RadioButton添加onclick事件函数。
不足之处:
由于功能简单,所以没有实现状态管理功能。对于GridView的选择行的索引,是在重写的Initialize方法中直接获取的。
当GridView不可作为PostBack事件的目标控件时,需要 EnableEventValidation="false"语句来禁用页面的EventValidation。
限于能力有限,无法在Page的Render事件中通过ClientScriptManager..::.RegisterForEventValidation注册GridView控件。遗憾!只好将事件验证禁用掉。

欢迎指教:
QQ:113560077
MSN:fgq990302@hotmail.com
代码文件:
/Files/fgq841103/WebSite_RadioField.rar
posted @ 2009-08-04 22:51  孤独流星  阅读(1746)  评论(0编辑  收藏  举报