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 в ретрансляторе
Похожие темы:
поскольку другой пользователь предоставил основную причину проблемы , поэтому я бы не объяснял то же самое, но я бы предоставил вам в 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();");
}