宝哥软件园

ASP.NET网格视图添加了一个单选按钮不能单选的解决方案

编辑:宝哥软件园 来源:互联网 时间:2021-10-02

当今开发中遇到的一个问题是,当包含RadioButton的模板列被添加到GridView时,结果将会运行。天哪,你可以选择不止一个单选按钮!尴尬!为了演示我今天的错误,我最好模拟一个功能场景。我想实现的功能是显示一个包含单选按钮的学生信息列表,选择一行显示详细信息~!

1.问题陈述。

(1)首先准备一个GridView,展示学生的基本信息和最重要的单选按钮。代码如下:

asp3360 GridView ID=' GridView 1 ' Runat=' server ' AutoGenerateColumns=' false ' Columns asp: template field item template ASP : radio button ID=' rbStudent Runat=' server '/item template/ASP : template field ASP : bound field data field=' sname ' header text='用户名'/ASP : bound field data field=' ssex ' header text='性别'/Columns

公共类Student {公共字符串SID { get设置;}公共字符串SName { get设置;}公共字符串SSex { get设置;}} (3)初始化数据并绑定GridView列表。代码如下:

受保护的void Page_Load(对象发送方,事件参数e) { if(!IsPostBack) {这个。bingridview();} } public void bind GridView(){ list Student slip=New list Student(){ New Student(){ SID=' s001 ',sname='张三',SSex='男' },New Student(){ SID='s002 ',SName='李四',SSex='女' },new student () {sid=' s003 ',sname='王五',SSex='男' };GridView1。DataSource=sListGridView1。DataBind();}这个时候好像没什么问题,但是我确实发现收音盒一运行就失去了功能,如图:

原因是什么?细心的人可能会说你不属于一个组,因为你没有设置RadioButton的GroupName属性,但事实是我设置了这个属性后它仍然是无效的!

2.解决方案。

问题分析。

运行后,我右击源代码,发现了这个奇怪的问题。原来是GridView自动给输入的name属性赋值,导致每行的name属性不一样,导致不能单选的问题。GridView生成的代码如下:

table cell spacing=' 0 ' rules=' all ' border=' 1 ' id=' GridView 1 ' style=' border-collapse : collapse;'trscope=' col '/thscope=' col ' username/thscope=' col ' gender/th/Trtdinput id=' GridView 1 _ rbstudent _ 0 ' type=' radio ' name=' GridView 1 $ CTL 02 $ rbstudent ' value=' rbstudent '/tdtd张三/tdtd男/TD/Trtdinput id=' GridView 1 _ rbstudent _ 1 ' type=' radio ' name=' GridView 1 $ CTL 03 $ rbstudent ' value=' rbstudent '/tdtd Li Si tr TD input id=' GridView 1 _ rbstudent _ 2 ' type=' radio ' name=' GridView 1 $ CTL 04 $ rbstudent ' value=' rbstudent '/tdtd Wang Wu/tdtd man/TD/tr/table可以发现,每个RadioButton控件的name属性都不一样,导致无法进行单一选择的问题。

我的第一个想法是手动将名称属性更改为uniform,那么如何更改呢?有些人可能会说这很简单,只需要在绑定行的时候使用GridView的OnRowDataBound事件来更改RadioButton的name属性!代码如下:

受保护的void GridView1 _ RowDataBound(对象发送方,GridView RowEventArgs e){ if(e . row . RowType==DatacontrolRowType。DataRow){ radio button radio buttonrb=(radio button)e . row . find control(' rbStudent ');RadioButtionRB。属性[' name ']=' student ';}}但是跑完之后,我又失望了。原因是什么?就是因为RadioButton在客户端输出的时候会在外面有一个SPAN标签,名字属性加到SPAN里面,比较尴尬。证据如下:

span name=' student '输入id=' GridView 1 _ rbStudent _ 0 ' type=' radio ' name=' GridView 1 $ CTL 02 $ rbStudent ' value=' rbStudent '/span/tdtd张三/tdtd男/TD/trtr TD span name=' student '输入id=' GridView 1 _ rbStudent _ 1 ' type=' radio ' name=' GridView 1 $ CTL 03 $ rbStudent ' value=' rbStudent '/span/tdtd李四/tdtd女/TD/trtr TD跨度名称=student ' input id=' GridView 1 _ rbStudent _ 2 ' type=' radio ' name=' GridView 1 $ CTL 04 $ rbStudent ' value=' rbStudent '/span/tdtd王五/tdtd男/td看来这种思路行不通啊,只能用射流研究…啦,所以正题来了,我决定在数据绑定后通过射流研究…遍历显示数据表格(一种控件)中的单选按钮将名字属性改为相同的值,行得通吗? 试试看呗! 问题解决首先先来实现一个射流研究…函数,用来获取遍历显示数据表格(一种控件)中的单选按钮并将其名字属性设置为一个统一的值,例如"迈拉迪奥",代码如下:

脚本类型='text/javascript '函数SetRadioName(){ var gv=document。getelementbyid(' GridView 1 ');//获取显示数据表格(一种控件)的客户端我的收音机=gv。getelementsbytagname(' input ');//获取显示数据表格(一种控件)的(var I=0;I myradio . lentigi){ if(myradio[I]).type==' radio ')//隐藏myradio[i].setAttribute('name ',' myradio ');} } }/脚本接下来在绑定数据后注册调用这段脚本,或者将该脚本写到页面标签视图的最下面,代码如下:

受保护的无效页面_加载(对象发送方,事件参数e) { if(!IsPostBack){ 0这个bingridview();脚本管理器.RegisterStartupScript(这个,这个GetType(),Guid .NewGuid().ToString(),' SetRadioName()',true);} }问题解决了!

经过一番努力问题终于得到完美解决,整个问题分析思路清晰,希望可以真正帮助到亲们解决类似问题,有好的想法,欢迎大家一起探讨

更多资讯
游戏推荐
更多+