【发布时间】:2014-07-31 16:15:58
【问题描述】:
我目前正在构建一个使用下拉列表和单选按钮列表等的网络表单。有一些小的验证,如果您在其中任何一个元素上选择一个值,则必须进行回发,并且可能必须重新加载某些元素,具体取决于业务逻辑。 现在我为 RBL 和 DDL 创建了 eventHandler,但是我遇到了问题。
如果我更改 DDL 上的值,则会触发回发并且程序循环通过我的方法,没问题。如果我更改 RBL 上的值,则不会触发回发,根本不会触发。奇怪的是,如果我先更改 RBL 中的某些内容,然后更改 DDL 中的某些内容,它会以正确的顺序循环通过两个事件处理程序。
但显然这对我来说并不理想。如果用户先在 DDL 中更改某些内容,然后在 RBL 中更改,程序将无法正常运行。
我将在下面发布我的代码,有人知道如何让 RadioButtonList 触发回发/事件处理程序吗?
C#
protected void SchoolTypeID_Index_Changed(object sender, EventArgs e)
{
//code
}
protected void ddlStudentenStad_IndexChanged(object sender, EventArgs e)
{
//code
}
ASP.net
<asp:DropDownList ID="ddlStudentenStad" DataTextField="stad" DataValueField="id" AutoPostBack="true"
OnSelectedIndexChanged="ddlStudentenStad_IndexChanged" runat="server" class="SelectDropDown"></asp:DropDownList>
<asp:RadioButtonList ID="rblSchoolType" runat="server" AutoPostBack="true" DataTextField="type"
DataValueField="id" OnSelectedIndexChanged="SchoolTypeID_Index_Changed" RepeatDirection="Horizontal"/>
编辑:我们还制作了 RadioButtonListAdapter 类,因为过去我们在这个元素上遇到过更多问题。代码贴在下面,如果有人碰巧看到错误。
公共类 RadioButtonListControlAdapter : ControlAdapter {
public RadioButtonListControlAdapter()
{
}
protected override void Render(HtmlTextWriter writer)
{
RadioButtonList ButtonList = Control as RadioButtonList;
if (null != ButtonList)
{
int i = 0;
if (ButtonList.RepeatDirection == RepeatDirection.Horizontal)
{
writer.WriteFullBeginTag("div class=\"row collapse\"");
int aantalCols = (int)Math.Floor((double)12 / (double)ButtonList.Items.Count);
foreach (ListItem li in ButtonList.Items)
{
string itemClientID = Helpers.GetListItemClientID(ButtonList, li);
writer.WriteFullBeginTag("div class=\"large-" + aantalCols + " columns\" style=\"width:" + 100/ButtonList.Items.Count + "% !important; \"");
writer.WriteFullBeginTag("label for=\"" + ButtonList.UniqueID + "\"");
if (ButtonList.TextAlign == TextAlign.Right)
{
RenderRadioButtonListInput(writer, ButtonList, li);
RenderRadioButtonListLabel(writer, ButtonList, li);
}
else
{
RenderRadioButtonListLabel(writer, ButtonList, li);
RenderRadioButtonListInput(writer, ButtonList, li);
}
writer.WriteEndTag("label");
writer.WriteEndTag("div");
if (this.Page != null)
Page.ClientScript.RegisterForEventValidation(ButtonList.UniqueID, li.Value);
//if (ButtonList.RepeatDirection == RepeatDirection.Vertical)
// writer.Write("<br />");
writer.WriteLine();
}
writer.WriteEndTag("div");
if (this.Page != null)
{
Page.ClientScript.RegisterForEventValidation(ButtonList.UniqueID);
}
}
else
{
foreach (ListItem li in ButtonList.Items)
{
string itemClientID = Helpers.GetListItemClientID(ButtonList, li);
//writer.WriteFullBeginTag("div class=\"row\"");
writer.WriteFullBeginTag("label for=\"" + ButtonList.UniqueID + "\"");
if (ButtonList.TextAlign == TextAlign.Right)
{
RenderRadioButtonListInput(writer, ButtonList, li);
RenderRadioButtonListLabel(writer, ButtonList, li);
}
else
{
RenderRadioButtonListLabel(writer, ButtonList, li);
RenderRadioButtonListInput(writer, ButtonList, li);
}
writer.WriteEndTag("label");
//writer.WriteEndTag("div");
if (this.Page != null)
Page.ClientScript.RegisterForEventValidation(ButtonList.UniqueID, li.Value);
//if (ButtonList.RepeatDirection == RepeatDirection.Vertical)
// writer.Write("<br />");
writer.WriteLine();
}
}
if (this.Page != null)
Page.ClientScript.RegisterForEventValidation(ButtonList.UniqueID);
}
}
private void RenderRadioButtonListInput(HtmlTextWriter writer, RadioButtonList ButtonList, ListItem li)
{
writer.AddAttribute(HtmlTextWriterAttribute.Id, Helpers.GetListItemClientID(ButtonList, li));
writer.AddAttribute(HtmlTextWriterAttribute.Type, "radio");
writer.AddAttribute(HtmlTextWriterAttribute.Name, ButtonList.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Value, li.Value);
writer.AddStyleAttribute(HtmlTextWriterStyle.Display, "none");
writer.AddAttribute(HtmlTextWriterAttribute.Class, "hidden-field");
if (li.Selected)
writer.AddAttribute(HtmlTextWriterAttribute.Checked, "checked");
if (li.Enabled == false || ButtonList.Enabled == false)
writer.AddAttribute(HtmlTextWriterAttribute.Disabled, "disabled");
if (li.Enabled == true && ButtonList.Enabled == true && ButtonList.AutoPostBack)
{
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, String.Format(@"javascript:setTimeout('__doPostBack(\'{0}\',\'\')', 0)", Helpers.GetListItemUniqueID(ButtonList, li)));
}
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
}
private void RenderRadioButtonListLabel(HtmlTextWriter writer, RadioButtonList ButtonList, ListItem li)
{
writer.WriteFullBeginTag("span class=\"custom radio\"");
writer.WriteEndTag("span");
writer.Write(" " + li.Text);
}
}
【问题讨论】:
-
你在 DropDownList 中的“类”是什么意思?。
-
这只是 css 相关的东西,我认为这对 autpostback tbh 来说并不重要
-
您的数据绑定代码是否在
IsPostback中检查您的Page_Load? -
不,那行不通。在我的 page_load 中,数据绑定在 if (!(Page.IsPostBack)) 语句中
标签: c# asp.net postback radiobuttonlist autopostback