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 @   孤独流星  阅读(1760)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示