当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET RadioButton弄乱了名字(groupname)

如何解决《ASP.NETRadioButton弄乱了名字(groupname)》经验,为你挑选了5个好方法。

我有一个模板控件(转发器)列出了一些文本和其他标记.每个项目都有一个与之关联的单选按钮,使用户可以选择由转发器创建的项目之一.

转发器将radiobutton设置为使用默认ASP.NET命名约定生成的id和名称,使每个radiobutton成为一个完整的"组".这意味着所有的无线电按钮彼此独立,遗憾的是,这意味着我可以同时选择所有的无线电按钮.radiobutton具有用于设置公共名称的聪明属性"groupname",因此它们被组合在一起,因此应该是相关的(因此我一次只能选择一个).问题是 - 这不起作用 - 转发器确保id和名称(控制分组)不同.

由于我使用转发器(可能是listview或任何其他模板化的数据绑定控件),我无法使用RadioButtonList.那么这让我离开了什么地方?

我知道我以前遇到过这个问题并解决了.我知道几乎每个ASP.NET程序员都必须拥有它,所以为什么我不能google并找到解决问题的可靠方法呢?我遇到了通过JavaScript强制执行分组的解决方案(丑陋!)甚至将无线电按钮作为非服务器控件处理,迫使我做一个Request.Form[name]读取状态.我也试过尝试覆盖PreRender事件上的name属性- 不幸的是,拥有的页面和母版页再次覆盖了这个名称以反映完整的id/name,所以我最终得到了相同的错误结果.

如果你没有比我发布的更好的解决方案,你仍然非常欢迎你发表你的想法 - 至少我会知道我的朋友'杰克'是关于ASP.NET有时搞砸了;)



1> 小智..:

ASP.NET提示:在Repeater中使用RadioButton控件

这是JavaScript函数的代码:

function SetUniqueRadioButton(nameregex, current)
{
   re = new RegExp(nameregex);
   for(i = 0; i < document.forms[0].elements.length; i++)
   {
      elm = document.forms[0].elements[i]
      if (elm.type == 'radio')
      {
         if (re.test(elm.name))
         {
            elm.checked = false;
         }
      }
   }
   current.checked = true;
}

代码通过ItemDataBound事件链接到Repeater.要使其正常工作,您需要知道Repeater控件的名称,以及您分配给RadioButtons的GroupName.在这种情况下,我使用rptPortfolios作为Repeater的名称,并使用Portfolios作为组名:

protected void rptPortfolios_ItemDataBound(object sender,
                                           RepeaterItemEventArgs e)
{
   if (e.Item.ItemType != ListItemType.Item && e.Item.ItemType
      != ListItemType.AlternatingItem)
      return;

   RadioButton rdo = (RadioButton)e.Item.FindControl("rdoSelected");
   string script =
      "SetUniqueRadioButton('rptPortfolios.*Portfolios',this)";
   rdo.Attributes.Add("onclick", script);

}

参考:http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c12371/



2> Cristian Lib..:

Google-fu:asp.net radiobutton repeater问题

确实是身份损失的不幸后果.我的想法是创建一个 - 或者选择一个可用的 - 自定义控件,在客户端上添加对同名的支持.



3> Chris Magnus..:

Vladimir Smirnov已经创建了一个很好的自定义控件来解决这个问题.我们一直在我们的项目中使用GroupRadioButton,它一直与在转发器内创建的单选按钮以及转发器外部的其他按钮完美配合,所有这些都是同一组的一部分.



4> 小智..:

我使用jQuery脚本:



谨防!如果您使用此解决方案,您将无法处理代码隐藏中的用户更改,因为服务器期望的名称/值对将永远不会更改._i.e._在页面加载期间检查/取消选中的任何内容将保持选中/取消选中,尽管用户操作.

5> Kit Z. Fox..:

我知道这是一个老帖子,但这是我最后用listview做的.我的listview绑定在VB代码隐藏中,所以我不确定这是否适用于转发器,但我想它可能类似.

我所做的是处理radiobuttons的OnCheckChanged事件,其功能是取消选择任何其他单选按钮.然后,当我离开页面时,我查找了所选的单选按钮.

此解决方案避免使用JavaScript和jQuery,并完全忽略GroupName问题.它并不理想,但它的作用是(I)预期的.我希望它对其他人有帮助.

标记:


  `
    
Radio

码:

Protected Sub rdbSelect_Changed(ByVal sender As Object, ByVal e As System.EventArgs)

  Dim rb1 As RadioButton = CType(sender, RadioButton)

  For Each row As ListViewItem In lvw.Items
    Dim rb As RadioButton = row.FindControl("rdbSelect")
      If rb IsNot Nothing AndAlso rb.Checked Then
         rb.Checked = False
      End If
  Next
  rb1.Checked = True
End Sub

然后单击"提交"按钮时:

Protected Sub btnSubmit_Click(ByVal sender As Object, ByVal e As System.EventArgs)  Handles btnSubmit.Click

  For Each row As ListViewItem In lvw.Items
    Dim rb As RadioButton = row.FindControl("rdbSelect")
        Dim lbl As Label
        If rb IsNot Nothing AndAlso rb.Checked = True Then
            lbl = row.FindControl("StudentID")
            Session("StudentID") = lbl.Text
        End If
    Next

    Response.Redirect("~/TransferStudent.aspx")
End Sub

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有