我有一个转发器,在转发器内部有一个radiobutton控件,在后面的代码中我填充了radiobutton控件的groupname,所以,当我运行它时,我有一个有很多行的表,其中一些有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$1
Radiobutton row 2:
Repeater1$ctl06$1
所以它检查了所有的radiobuttons,而不是在同一组的另一个被解雇时取消选中。
我在论坛中找到了这段代码,但只有当我只有一个组名时,它才有效,但我可以有多个组名:
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
但是可以有多组radiobuttons,所以在这种情况下我不能使用此代码。
有什么地方可以做到这一点吗?感谢
答案 0 :(得分:8)
这是与RadioButton
或ItemTemplate
(more info)内AlternatingItemTemplate
控件使用相关的已知错误。这是由Repeater
修改控件ID和控件的命名引起的。在后台自动分配的组名(使用动态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
注意:setExclusiveRadioButton
方法的第一个参数应设置为此正则表达式约定:[repeater control ID].*[RadioButton_GroupName]
(RadioButton_GroupName
值可以使用Eval
检索。或者,您可以使用基本HTML input type="radio"
或使用RadioButtonList
代替。
参考:
Using RadioButton Controls in a Repeater
类似问题:
答案 1 :(得分:5)
由于其他用户提供了问题的根本原因,所以我不会解释相同但我会为您提供基于 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
元素找到的第一个值。 attr("name")
函数(此处以'get'格式使用)始终返回列表中的第一个。因此,所有选项按钮在Html中都具有相同的“名称”属性,这使得select可以正常工作。
答案 2 :(得分:2)
在客户端,将无线电的name
设置为您喜欢的任何组,但是在data-
属性中记下生成的名称。
然后,在表单提交之前,将data-
属性复制回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();");
}