Per*_*eck 36 asp.net radio-button
我有一个模板控件(转发器)列出了一些文本和其他标记.每个项目都有一个与之关联的单选按钮,使用户可以选择由转发器创建的项目之一.
转发器将radiobutton设置为使用默认ASP.NET命名约定生成的id和名称,使每个radiobutton成为一个完整的"组".这意味着所有的无线电按钮彼此独立,遗憾的是,这意味着我可以同时选择所有的无线电按钮.radiobutton具有用于设置公共名称的聪明属性"groupname",因此它们被组合在一起,因此应该是相关的(因此我一次只能选择一个).问题是 - 这不起作用 - 转发器确保id和名称(控制分组)不同.
由于我使用转发器(可能是listview或任何其他模板化的数据绑定控件),我无法使用RadioButtonList.那么这让我离开了什么地方?
我知道我以前遇到过这个问题并解决了.我知道几乎每个ASP.NET程序员都必须拥有它,所以为什么我不能google并找到解决问题的可靠方法呢?我遇到了通过JavaScript强制执行分组的解决方案(丑陋!)甚至将无线电按钮作为非服务器控件处理,迫使我做一个Request.Form[name]读取状态.我也试过尝试覆盖PreRender事件上的name属性- 不幸的是,拥有的页面和母版页再次覆盖了这个名称以反映完整的id/name,所以我最终得到了相同的错误结果.
如果你没有比我发布的更好的解决方案,你仍然非常欢迎你发表你的想法 - 至少我会知道我的朋友'杰克'是关于ASP.NET有时搞砸了;)
小智 8
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;
}
Run Code Online (Sandbox Code Playgroud)
代码通过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);
}
Run Code Online (Sandbox Code Playgroud)
参考:http://www.codeguru.com/csharp/csharp/cs_controls/custom/article.php/c12371/
Vladimir Smirnov已经创建了一个很好的自定义控件来解决这个问题.我们一直在我们的项目中使用GroupRadioButton,它一直与在转发器内创建的单选按钮以及转发器外部的其他按钮完美配合,所有这些都是同一组的一部分.
小智 6
我使用jQuery脚本:
<script type="text/javascript">
function norm_radio_name() {
$("[type=radio]").each(function (i) {
var name = $(this).attr("name");
var splitted = name.split("$");
$(this).attr("name", splitted[splitted.length - 1]);
});
};
$(document).ready(function () {
norm_radio_name();
});
// for UpdatePannel
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_endRequest(function () {
norm_radio_name();
});
</script>
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老帖子,但这是我最后用listview做的.我的listview绑定在VB代码隐藏中,所以我不确定这是否适用于转发器,但我想它可能类似.
我所做的是处理radiobuttons的OnCheckChanged事件,其功能是取消选择任何其他单选按钮.然后,当我离开页面时,我查找了所选的单选按钮.
此解决方案避免使用JavaScript和jQuery,并完全忽略GroupName问题.它并不理想,但它的作用是(I)预期的.我希望它对其他人有帮助.
标记:
<asp:ListView ID="lvw" runat="server">
<LayoutTemplate>`
<table>
<th>Radio</th>
<tr id="itemPlaceholder"></tr>
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><asp:RadioButton ID="rdbSelect" runat="server" AutoPostBack="true"
OnCheckedChanged="rdbSelect_Changed"/></td>
</tr>
</ItemTemplate>
</asp:ListView>
Run Code Online (Sandbox Code Playgroud)
码:
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
Run Code Online (Sandbox Code Playgroud)
然后单击"提交"按钮时:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43520 次 |
| 最近记录: |