1

I have a Repeater like this

    <asp:Repeater runat="server" DataSourceID="HeaderFooterSqlDataSource">
        <HeaderTemplate>
            <table border="0" width="100%">
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td>
            <input runat="server" id="SelectRadio" type="radio" 
 name="HeaderFooter" onclick='SelectAndSetHeaderFooter(this);" %>' />
                </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>

Now here when this Repeater is rendered the name attribute of my input radio "SelectRadio" gets auto generated but name attribute for all the radiobuttons in my repeater should be same so that they can work like a group & get checked / unchecked automatically according to other elements in that group, So how can I overcome this situation ??

Edit

I got the solution my self, Actually I have defined my input radio control as runat="server" because I thought otherwise Eval() binding wouldn't work but I was wrong Eval() binding does work without runat="server" , So when I remove that attribute name doesn't generated automatically and everything is fine now, But thanx to all for sparing time for my question.

4

4 回答 4

1

您想查看asp:RadioButton控件 (http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.radiobutton.aspx)。

特别是GroupName该控件上的属性可用于“指定一组单选按钮以创建一组互斥的控件”

所以粗略地说:

<asp:RadioButton runat="server" id="SelectRadio"
 GroupName="HeaderFooter" %>' />

编辑:似乎在这种特殊情况下 GroupName 没有做它的设计。http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.radiobutton.groupname.aspx最后在社区内容中讨论了它,但归结为它使用当前的NamingContainer 仍然作为其名称的一部分,而不仅仅是使用您给它的组名。感谢神秘的 user1429080 在评论中引起我的注意。

于 2012-07-03T13:53:35.400 回答
1

您应该使用内置的RaidoButtonList控件,而不是破解它。

<asp:RadioButtonList id="RadioButtonList1" runat="server">
    <asp:ListItem>Item 1</asp:ListItem>
    <asp:ListItem>Item 2</asp:ListItem>
    <asp:ListItem>Item 3</asp:ListItem>
    <asp:ListItem>Item 4</asp:ListItem>
    <asp:ListItem>Item 5</asp:ListItem>
    <asp:ListItem>Item 6</asp:ListItem>
</asp:RadioButtonList>
于 2012-07-03T13:32:04.553 回答
0

您的单选按钮不作为一个组的原因是因为您有 runat="server" 这将导致 name 和 id 属性以父母的 id 为前缀。以下将导致单选按钮表现为一个有凝聚力的组(注意缺少 runat="server"):

ascx代码:

<asp:Repeater ID="uxRadioSelections" runat="server">
        <HeaderTemplate>
          <table border="0" width="300px">
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
              <td>
                <input type="radio" value='<%# Eval("Name") %>' name="HeaderFooter" onclick="alert(this.value);"><%# Eval("Name") %></input>
              </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
          </table>
        </FooterTemplate>
    </asp:Repeater>

后面的代码:

protected void Page_Load(object sender, EventArgs e)
{
   string[] names = new string[] {"Alvin", "Simon", "Theodore"};
   uxRadioSelections.DataSource = names.Select(x => new { Name = x });
   uxRadioSelections.DataBind();
}

但是,以下内容不会作为一个有凝聚力的组执行:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    Test
    <asp:Repeater ID="uxRadioSelections" runat="server">
        <HeaderTemplate>
          <table border="0" width="300px">
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
              <td>
                  <asp:RadioButton Text='<%#Eval("Name") %>' runat="server" />
              </td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
          </table>
        </FooterTemplate>
    </asp:Repeater>
</asp:Content>

由于您提到的命名约定,这些单独的单选按钮将找不到彼此。ASP.NET 使用 RadioButtonLists 来克服这个问题:

ascx代码:

<asp:RadioButtonList ID="uxRadioButtons" runat="server">
</asp:RadioButtonList>

后面的代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        string[] names = new string[] {"Alvin", "Simon", "Theodore"};
        uxRadioButtons.DataTextField = "Name";
        uxRadioButtons.DataValueField = "Name";
        uxRadioButtons.DataSource = names.Select(x => new { Name = x });
        uxRadioButtons.DataBind();
    }

这不会为您提供精细控制,但会提供对选择的轻松服务器端访问。如果您只需要与 javascript 相关的功能和增加格式的灵活性,那么第一种格式(与您提供的几乎相同)可能是您最好的选择。祝你好运!

于 2012-07-03T13:44:34.187 回答
0

另一个选项是将 ClientIDMode 设置为“静态”,这会将其值设置为指定 ID 的值。由于它是一个转发器控件,因此生成的所有项目都将具有相同的生成 ID。所以你只需设置:

<asp:RadioButton runat="server" id="SelectRadio" GroupName="HeaderFooter" ClientIDMode="static">' />

这意味着所有生成的控件都将具有指定的相同 ID,即“SelectRadio”。这可能有问题,也可能没有问题,您应该小心,这正是您想要的。

请注意,ClientIDMode 是 ASP.Net 4.0 的一个特性。更多信息在这里:ASP.NET 4.0 中的 ClientIDMode和这里​​:MSDN。我希望这有帮助。

更新 1:您可以从之前在 StackOverflow 上提出的这个问题中获得更多见解。(虽然它是 jQuery)。

于 2017-03-12T12:33:24.560 回答