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
实现思路:
经过思考,觉得如何使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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述