groupname не работает более чем в одном RadioButton внутри ретранслятора asp.net

у меня есть ретранслятор и внутри ретранслятора элемент управления radiobutton, в коде позади я заполняю groupname для элемента управления radiobutton, поэтому, когда я его запускаю, у меня есть таблица со многими строками, и некоторые из них имеют radiobutton:

  <asp:updatepanel id="UpdatePanel1" runat="server" updatemode="Conditional">
    <ContentTemplate>
        <asp:Repeater ID="Repeater1" runat="server" ViewStateMode="Enabled">
            <HeaderTemplate>
                <table class="table table-responsive table-bordered ">
                    <tr class="text-center" style="background-color: #6e6259; color: white;">
                        <th class="text-center">DESCRIPTION</th>
</HeaderTemplate>
            <ItemTemplate>
         <tr>
        <td style="padding-left: 20px;">
      <asp:RadioButton ID="rbtDinamic"  OnCheckedChanged="rbtDinamic_CheckedChanged" AutoPostBack="true"
           ViewStateMode="Enabled" Visible="false"  GroupName='<%#Eval("groupvalue") %>'   runat="server"/></td>
</ItemTemplate>
      <FooterTemplate>
    </table>
     </FooterTemplate>
    </asp:Repeater>
     </ContentTemplate>
      </asp:UpdatePanel>

и в itemdatabound ретранслятора я заполняю значение для groupname:

  Private Sub Repeater1_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
    Try
        If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
            If CType(e.Item.FindControl("hdf1"), Label).Text = False Then
                CType(e.Item.FindControl("rbtDinamic"), RadioButton).Visible = True
                CType(e.Item.FindControl("rbtDinamic"), RadioButton).GroupName = CType(e.Item.FindControl("groupvalue"), Label).Text = False
            End If
        End If
    Catch ex As Exception          
    End Try
End Sub

но когда я запускаю его, повторитель создает имя группы с разными именами:

Radiobutton row 1:
Repeater1$ctl05

Radiobutton row 2:

Repeater1$ctl06

поэтому он позволил проверить все радиобуттоны, вместо этого чтобы снять флажок, когда другой для той же группы отмечен.

Я нахожу этот код на форуме, но он работает, только если у меня есть только одно имя группы, но у меня может быть более одного имени группы:

  Protected Sub rbtDinamic_CheckedChanged(sender As Object, e As EventArgs)
    For Each item As RepeaterItem In Repeater1.Items
        Dim rbtn As RadioButton = DirectCast(item.FindControl("rbtDinamic"), RadioButton)
        rbtn.Checked = False
    Next
    DirectCast(sender, RadioButton).Checked = True
End Sub

но там может быть больше, чем одна группа компонентов RadioButton, поэтому в данном случае я не могу использовать этот код.

есть ли где это сделать? спасибо

3 ответов


это известная ошибка, связанная с RadioButton контроль использования внутри ItemTemplate или AlternatingItemTemplate (подробнее). Это вызвано Repeater искажение именования идентификаторов элементов управления и имен групп, которые назначаются автоматически в фоновом режиме (предполагается с помощью dynamic ClientIDMode). Чтобы устранить эту проблему, настройте клиентскую функцию следующим образом:

function setExclusiveRadioButton(name, current)
{
    regex = new RegExp(name);  

    for (i = 0; i < document.forms[0].elements.length; i++)
    {
        var elem = document.forms[0].elements[i];
        if (elem.type == 'radio')
        {
           elem.checked = false;
        }
    }
    current.checked = true;
}

позже установите скрипт, нацеленный на управление переключателем, как указано ниже:

Private Sub Repeater1_ItemDataBound(sender As Object, e As RepeaterItemEventArgs) Handles Repeater1.ItemDataBound
    Try
        If e.Item.ItemType = ListItemType.AlternatingItem Or e.Item.ItemType = ListItemType.Item Then
            If CType(e.Item.FindControl("hdf1"), Label).Text = False Then
                CType(e.Item.FindControl("rbtDinamic"), RadioButton).Visible = True
                CType(e.Item.FindControl("rbtDinamic"), RadioButton).GroupName = CType(e.Item.FindControl("groupvalue"), Label).Text = False
            End If
        End If

        ' put the proper client-side handler for RadioButton
        Dim radio As RadioButton = CType(e.Item.FindControl("rbtDinamic"), RadioButton)
        Dim script As String = "setExclusiveRadioButton('Repeater1.*[RadioButton_GroupName]', this)"

        radio.Attributes.Add("onclick", script)

    Catch ex As Exception          
    End Try
End Sub

NB: первый аргумент setExclusiveRadioButton метод должен быть установлен в это соглашение регулярных выражений:[repeater control ID].*[RadioButton_GroupName] (RadioButton_GroupName значение может быть получено с помощью Eval). В качестве альтернативы вы можете использовать базовый HTML input type="radio" или использовать RadioButtonList вместо.

ссылки:

использование элементов управления RadioButton в ретрансляторе

Похожие темы:

переключатель внутри репитера

только один выбор radiobutton в репитер

ASP.NET -переключатели в Репитерах


поскольку другой пользователь предоставил основную причину проблемы , поэтому я бы не объяснял то же самое, но я бы предоставил вам в jQuery решение:

jQuery("[name$='$optValue']").attr("name",jQuery("[name$='$optValue']").attr("name"));

jQuery("[name$='$optValue]").click(function (){ 
                //set name for all to name of clicked 
                jQuery("[name$='$optValue]").attr("name", this.attr("name")); 
            });

С attr("name",jQuery("[name$='optValue']") попытается выбрать все входные данные на странице, которая заканчивается на optValue то естьoptValue элементы в повторителе. после этого он меняет name атрибут первого значения, найденного для всех optValue элементы. The attr("name") функция (используется здесь в формате "get") всегда возвращает первый в списке. Таким образом, все кнопки опций получают один и тот же атрибут "name" в Html, что позволяет select работать правильно.

отличная работа вокруг этот источник


на стороне клиента, установить name радио в любую группу, которую вы хотите, но запишите сгенерированное имя в .

затем, непосредственно перед отправкой формы, скопируйте обратно в name атрибут, поэтому ASP.NET может распознать элемент управления на сервере.

этот скрипт сделает это:

<script type="text/javascript">
    $(document).ready(function (e) {            
        $("input[type='radio']").each(function (idx, elm) {
            var generatedName = $(elm).attr("name");
            $(elm).data("name", generatedName);
            $(elm).attr("name", "whatever-group-name");
        });

    });

    function onSubmit() {
        $("input[type='radio']").each(function (idx, elm) {
            var generatedName = $(elm).data("name");
            $(elm).attr("name", generatedName);
        });
    }
</script>

чтобы обнаружить представление формы, вы вызываете RegisterOnSubmitStatement. Е. Г. в Page_Load:

if (!IsPostBack)
{
    Page.ClientScript.RegisterOnSubmitStatement(Page.GetType(), "prepareSubmit", "onSubmit();");
}