中继器控制中的单选按钮列表

时间:2010-10-27 05:14:10

标签: asp.net

我的页面中有一个转发器控件。在检查单选按钮时,我需要在所有行(项目模板)中都有一个单选按钮,其余单选按钮必须取消选中。

怎么做?

提前致谢, TOR

4 个答案:

答案 0 :(得分:11)

不幸的是,在Repeater中使用GroupName属性时,它是一个已知错误(http://support.microsoft.com/kb/316495)。问题是Repeater实现了INamingContainer接口,该接口要求所有嵌套控件在呈现为HTML时具有唯一名称。这会导致单选按钮中断,因为为了使它们正常工作,它们必须具有相同的名称

我遇到过两种解决方法:

1 - 第一个是客户端JavaScript解决方案。它由Microsoft support提供。或者更易于阅读的版本here。 说明如下。在HEAD中包含以下javascript:

function SetUniqueRadioButton(nameregex, current)
{
      re = new RegExp(nameregex);
      for(i = 0; i < document.forms[0].elements.length; i++)
      {
            elm = document.forms[0].elements[i]
            if (elm.type == 'radio')
            {
                  if (re.test(elm.name))
                  {
                          elm.checked = false;
                  }
             }
      }
      current.checked = true;
}

现在该函数需要链接到转发器的OnDataItemBound事件中的Radio Buttons。将“RadioButton”替换为RadioButton控件的名称,将“RadioGroup”替换为您选择的GroupName:

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
      if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType != ListItemType.AlternatingItem) return;
      RadioButton rb = (RadioButton) e.Item.FindControl("RadioButton");
      string script = "SetUniqueRadioButton('Repeater1.*RadioGroup',this)";
      rb.Attributes.Add("onclick", script);
}

2 - 第二个解决方案是使用继承自RadioButton的自定义用户控件的服务器端解决方案。可以在此处下载教程和源代码:http://www.codeproject.com/KB/webforms/How_group_RButtons.aspx

答案 1 :(得分:1)

只需在单选按钮中添加OnCheckedChanged事件,循环转发器中的所有单选按钮即可取消选中它们。如果您不想回发,可以使用UpatePanel

<强>的.aspx

<asp:Repeater ID="Repeater1" runat="server" >
    <ItemTemplate>
        <asp:RadioButton ID="RadioButton1" runat="server" OnCheckedChanged="RadioButton1_OnCheckedChanged" AutoPostBack="true" />
    </ItemTemplate>
</asp:Repeater>

<强>的.cs

protected void RadioButton1_OnCheckedChanged(object sender, EventArgs e)
{
    foreach (RepeaterItem item in Repeater1.Items)
    {
        RadioButton rbtn = (RadioButton)item.FindControl("RadioButton1");
        rbtn.Checked = false;
    }
    ((RadioButton)sender).Checked = true;
}

答案 2 :(得分:0)

我知道这是旧的,但按钮无法工作的原因是因为name属性被覆盖。如果使用jQuery,您可以将单选按钮分配给类,然后设置name属性以覆盖新名称。

$('.MyRadioClass').attr("name","MyFixedName");

答案 3 :(得分:0)

另一个更简单的替代方案,即不需要花哨的格式化,就是使用RadioButtonList:

<asp:RadioButtonList ... />