Вот настройки. У меня есть страница ASP.NET4 с включенным viewstate, с RadioButtonList с двумя переключателями, CheckBox и включенным UserControl. Я хочу скрыть флажок, если выбрана одна радиокнопка, и показать его, если выбрана другая. Я хочу, чтобы CheckBox сохранял свое состояние, когда он скрыт и повторно показан; если он был проверен перед скрытием, когда он снова отображается, я все еще хочу, чтобы он был проверен.
Суть в том, что код для отображения / скрытия CheckBox, в зависимости от того, какой переключатель выбран, находится в событии OnPreRender в UserControl. Таким образом, он выполняет Parent.FindControl () для получения элементов управления, а затем скрывает / показывает CheckBox в зависимости от состояния RadioButtonList.
Проблема заключается в том, что при выполнении этой логики в OnPreRender () UserControl флажок не сохраняет свое состояние после того, как он скрыт, а затем повторно показан. То есть, если флажок установлен, то я нажимаю переключатель, чтобы скрыть его, когда я нажимаю другой переключатель, я хочу, чтобы флажок все еще был установлен, когда он теперь отображается. У меня такое ощущение, что я не понимаю некоторые механизмы состояния представления, но когда я попытался добавить TextBox и скрыть / показать его, он сохранил свое текстовое значение, как и ожидалось.
Я могу переместить логику в Page_Load UserControl, и состояние флажка ведет себя, как и ожидалось. Но я пытаюсь заставить его работать в OnPreRender () или, по крайней мере, ищу объяснение, почему я вижу такое поведение.
В default.aspx:
<asp:RadioButtonList runat="server" ID="uxRadio" AutoPostBack="true">
<asp:ListItem Text="choice 1" Value="1"></asp:ListItem>
<asp:ListItem Text="choice 2" Value="2"></asp:ListItem>
<asp:ListItem Text="choice 3" Value="3"></asp:ListItem>
</asp:RadioButtonList>
<asp:CheckBox runat="server" ID="uxCheck" AutoPostBack="true" />
<uc1:Control ID="uxControl" runat="server"></uc1:Control>
UserControl.ascx.cs:
protected override void OnPreRender(EventArgs e)
{
RadioButtonList rb = (RadioButtonList)Parent.FindControl("uxRadio");
CheckBox cb = (CheckBox)Parent.FindControl("uxCheck");
if (rb.SelectedValue == "2")
{
cb.Visible = false;
}
else
{
cb.Visible = true;
}
base.OnPreRender(e);
}