我有用户控制
<table style="border-width: 0">
<tr>
<td style="vertical-align: middle;">
<asp:RadioButton ID="rdOption" runat="server" Text="I m testing"
GroupName="Questions" oncheckedchanged="rdOption_CheckedChanged"
AutoPostBack="True"/>
</td>
<td style="vertical-align: middle; padding-left: 10px">
<asp:TextBox ID="txtOthers" runat="server" CssClass="txtbox" Visible="false"></asp:TextBox>
</td>
</tr>
</table>
protected void Page_Load(object sender, EventArgs e)
{
rdOption.GroupName = "myGroup";
rdOption.Text = Option.OptionDesc;
}
在 Survey.aspx 上,我动态加载了用户控件
foreach (clsOptions option in _CurrentQuestion.Options)
{
UserControls_OptionField ctrl = Page.LoadControl("~/UserControls/OptionField.ascx") as UserControls_OptionField;
ctrl.Option = option;
pnlOption.Controls.Add(ctrl);
}
问题是每个选项都有不同的组名称,如下所示。这就是为什么选项无法正常工作并且可以选择所有选项,而在 MCQ 中只能选择一个选项。
<input id="ContentPlaceHolder1_ctl01_rdOption" type="radio" name="ctl00$ContentPlaceHolder1$ctl01$myGroup" value="rdOption">
<input id="ContentPlaceHolder1_ctl02_rdOption" type="radio" name="ctl00$ContentPlaceHolder1$ctl02$myGroup" value="rdOption">
正如大家所建议的,这是设计使然,后来被认为是一个错误。
Joel 建议的控件非常棒,只是它覆盖了整个渲染逻辑,因此,编写此控件后框架中的任何增强功能都不会使用。
所以,我建议更换Render()
另一个控件中的方法:
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
using (var stringWriter = new StringWriter())
using (var htmlWriter = new HtmlTextWriter(stringWriter))
{
base.Render(htmlWriter);
var tagText = stringWriter.ToString();
tagText = Regex.Replace(tagText, "name=\"(\\S+)\"", "name=\"" + GroupName + "\"");
writer.Write(tagText);
}
}
好处是能够保留可能来自基础渲染的所有额外内容。
请注意,您可以:
<system.web>
<pages>
<tagMapping>
<add tagType="System.Web.UI.WebControls.RadioButton" mappedTagType="WebformsLibrary.CustomRadioButton" />
</tagMapping>
</pages>
</system.web>
Where WebformsLibrary.CustomRadioButton
是班级。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)