2011-08-26 19 views
1

我在ASP.NET 2.0中有一个Web应用程序,我需要一个高度自定义的网格。网格中的一列包含每行的单选按钮。RadioButtons在ASP.NET 2.0中继器中没有正确分组

我正在实施它作为Repeater控件,每个ItemTemplate中有一个div。问题是单选按钮(ASP:RadioButton标签)没有像他们应该组合;选择其中一个不会取消其余的选择。我已经在它们上面设置了GroupName属性,但是我没有看到通过Firebug在任何地方呈现HTML。谷歌搜索tells me<input type='radio>上的“名称”属性决定了其组成员资格,但ASP已经将其用作某种唯一标识符。当呈现为HTML时,每个单选按钮看起来都是这样的:

<input id="{asp_garbage_naming}_ctl01_rbFoo" type="radio" 
    name="ctl03$controlName$otherControlName$ctl01$name" 
    value="rbHost" checked="checked" /> 

有没有办法让这项工作?或者我将不得不提供我自己的单选按钮行为(JavaScript等)?

+0

问题?你是否需要这些单选按钮作为服务器控件(即,是否需要runat = server标签)?如果没有,您可以简单地在该列上使用常规的html单选按钮,并使用<%#Eval(“Property”)%>语法将任何属性绑定到该列上。只是一个想法。 – Icarus

+0

@Icarus - 我需要它们可以被服务器端代码访问,因为我需要以某种方式将值保存到数据库中。但我可以使用隐藏的字段来指示哪一个被选中... –

+0

你使用的是asp:radiobox还是asp:radioboxlist? – David

回答

0

有问题?你是否需要这些单选按钮作为服务器控件(即,是否需要runat = server标签)?如果没有,您可以在列上简单地使用常规的html单选按钮,并使用<%#Eval("Property")%>语法将任何属性绑定到该列。只是一个想法

+0

我最终做了''。使用$('。myRadioButtonClass')'上的jQuery点击处理程序,使用填充了该RowID属性的隐藏字段很好地工作。 –

+0

@Mr。杰弗逊好:)我很高兴它的工作。 – Icarus

1

一位同事跑过这个问题并实施了一个jQuery解决方案。下面是它的摘录:

这给了我想要的单选按钮功能,但它阻止了我在回发中获取选定的单选按钮。所以我决定手动实现单选按钮功能。

var radios = $("input:radio"); 
radios.click(function() { 
    radios.removeAttr('checked'); 
    $(this).attr('checked', 'checked'); 
    return true; 
}); 

这给了我正确的功能,我仍然可以得到回传所选择的单选按钮和文本框。可能不是最优雅的解决方案,但我找不到任何其他方式来做到这一点。

完整讯息:Radio button within a repeater problem

1

在服务器端执行如下操作:

protected void rptRepeaterName_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    RadioButton rdbRadioButtonName = e.Item.FindControl("rdbRadioButtonName") as RadioButton; 
    Repeater rptRepeaterName = sender as Repeater; 
    rdbRadioButtonName.Attributes.Add("onclick", string.Format("return radioSelected('{0}', '{1}')", rptRepeaterName.ClientID, rdbRadioButtonName.ClientID)); 
} 

在JavaScript做如下

function radioSelected(rptpricelevel, rdbPriceLevel) 
{   
    for (cnt = 0; cnt<100; cnt++) 
    {    
     var rdbId = rptpricelevel; 
     if(cnt < 10) 
     { 
      rdbId = + '_ctl0' + cnt + '_rdbRadioButtonName'; 
     } 
     else 
     { 
      rdbId = + '_ctl' + cnt + '_rdbRadioButtonName'; 
     } 
     var rdb = document.getElementById(rdbId); 
     if(rdb != null) 
     { 
      if(rdbId != rdbPriceLevel) 
      { 
       rdb.checked = false; 
      } 
     } 
    }   
}