最近工作中需要实现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