gpt4 book ai didi

c# - 组名在中继器 asp.net 内的多个单选按钮中不起作用

转载 作者:行者123 更新时间:2023-12-02 02:12:40 25 4
gpt4 key购买 nike

我有一个中继器,中继器内部有一个单选按钮控件,在后面的代码中我填充了单选按钮控件的组名,因此,当我运行它时,我有一个包含许多行的表,其中一些有单选按钮:

  <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 中,我填写组名的值:

  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

因此,它会检查所有单选按钮,而不是在选中同一组的另一个单选按钮时取消选中。

我在论坛中找到了这段代码,但只有当我只有一个组名时它才有效,但我可以有多个组名:

  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 相关的已知错误控制内部使用ItemTemplateAlternatingItemTemplate (more info)。这是由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

类似问题:

radiobutton inside repeater

only one radiobutton selection in repeater

ASP.NET - Radio Buttons In Repeaters

关于c# - 组名在中继器 asp.net 内的多个单选按钮中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46218157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com