2017-09-14 72 views
8

我有一个中继器和中继器内的单选按钮控制,在后面的代码我填的单选按钮控制的组名,所以,当我运行它,我有一个表有许多行,其中一些有单选按钮:组名不超过一个单选按钮转发asp.net里面工作

<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 

所以这让检查所有的单选按钮,当另一个用于同一组cheked而不是取消。

我发现在一个论坛上的代码,但只有当我只有一个组名它的工作,但我可以有一个以上的组名:

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 

但有一点是单选按钮的多个组,所以在这种情况下我不能使用这个代码。

在哪里有做到这一点?谢谢

回答

7

这是ItemTemplateAlternatingItemTemplatemore info)内的RadioButton控制用法相关的已知错误。 (设为使用动态ClientIDMode)这引起Repeater重整的这在后台自动分配的控制ID &组名称的命名。要解决这个问题,成立了一个客户端的功能是这样的:

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

参考:

Using RadioButton Controls in a Repeater

类似的问题:

radiobutton inside repeater

only one radiobutton selection in repeater

ASP.NET - Radio Buttons In Repeaters

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中都有相同的'name'属性,这使得select可以正常工作。

一部伟大的作品,从周围this Source

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();"); 
} 
+0

感谢您的回答,我有一个问题,对于idx和榆树有什么价值? –

+0

它们分别包含array_中元素的_index和_element_本身。 jQuery将为你提供它们;不需要你做任何事情来初始化它们。只需在函数体内使用它们,传递给'.each'方法。 –