Добрый день.
Ситуация следующая. На страничке имеет DropDownList содержащий в себе 4 значения, эти значения добавляются динамически на OnInit'e страницы, хотя можно забивать и в ручную, не суть важно. Необходимо в зависимости от выбранного айтема в листе менять контент странички. Контент серверный (чекбоксы, радиобаттоны, текстбоксы). Собственно данная страничка - это набор свойств web-приложения, задаваемых юзером.
Для реализации этой функциональности я видел два пути:
1. Создать 4 юзерконтрола, и подставлять их в зависимости от выбранного в плэйсхолдер на странице.
2. (мне так больше нравится) На самой странице нарисовать 4 невидимых DIV'a, и подставлять их в тот-же плейсхолдер, предаврительно делая видимым тот который нужно.
В итоге сделал и так и так :). Но оба варианта не работают. Пожалуйста объясните, что именно не так.
DropDownList у меня автопостит страницу на сервер, после чего в плейсхолдер подставляется соответствующий DIV. Внимание проблема:
DIV не сохраняет своего состояния.
Т.е. если я сначала поменяю состояния контролов на одном диве, потом перейду к другому и вновь вернусь к первому, все мои изменения по боку. По идее, на постбэк изменения должны сохраняться во ViewState, но этого не происходит. Более того, если я в ручную прописываю в DIVе атрибут enableviewstate="true", эффект тот же. Что не так?
Часть кода:<table align="center" width="100%" runat="server">
<tr>
<td align="center" width="100%">
Select Data Type:
<asp:DropDownList ID="ddlDataType" runat="server" AutoPostBack="true"
OnSelectedIndexChanged="ShowSelectedLayerForSpectraSimilarityOptions">
<asp:ListItem Value="1DNMRControl">1DNMR</asp:ListItem>
<asp:ListItem Value="2DNMRControl">2DNMR</asp:ListItem>
<asp:ListItem Value="MASSControl">MASS</asp:ListItem>
<asp:ListItem Value="UVIRControl">UVIR</asp:ListItem>
</asp:DropDownList>
<hr />
</td>
</tr>
<tr>
<td align="center" runat="server" id="tcSpectraSimilarityContent">
<asp:PlaceHolder runat="server" ID ="phSpectraSimilarityOptions">
</asp:PlaceHolder>
</td>
</tr>
</table>
Обработчик OnSelectedIndexChangedpublic void ShowSelectedLayerForSpectraSimilarityOptions(Object sender, EventArgs e)
{
tcSpectraSimilarityContent.Controls.Clear();
//phSpectraSimilarityOptions.Controls.Clear();
//Control cnt = null;
switch (ddlDataType.SelectedValue)
{
case SPECTRA_SIMILARITY_1DNMR_CONTROL_VALUE:
{
MakeDivVisible(SpectraSimilarityDiv1DNMR);
tcSpectraSimilarityContent.Controls.Add(SpectraSimilarityDiv1DNMR);
//cnt = _D1NMRControl;
}
break;
case SPECTRA_SIMILARITY_2DNMR_CONTROL_VALUE:
{
MakeDivVisible(SpectraSimilarityDiv2DNMR);
tcSpectraSimilarityContent.Controls.Add(SpectraSimilarityDiv2DNMR);
//cnt = _D2NMRControl;
}
break;
case SPECTRA_SIMILARITY_MASS_CONTROL_VALUE:
{
MakeDivVisible(SpectraSimilarityDivMASS);
tcSpectraSimilarityContent.Controls.Add(SpectraSimilarityDivMASS);
//cnt = _MASSControl;
}
break;
case SPECTRA_SIMILARITY_UVIR_CONTROL_VALUE:
{
MakeDivVisible(SpectraSimilarityDivUVIR);
tcSpectraSimilarityContent.Controls.Add(SpectraSimilarityDivUVIR);
//cnt = _UVIRControl;
}
break;
}
//if (cnt != null)
//{
// phSpectraSimilarityOptions.Controls.Add(cnt);
//}
}
private void MakeDivVisible(HtmlGenericControl div)
{
foreach (Control control in form1.Controls)
{
if (control.ID != null && control.ID.Contains(COMMON_PART_OF_DIVS_NAMES))
{
if (control.ID != div.ID)
{
(control as HtmlGenericControl).Style.Add(HtmlTextWriterStyle.Display, "none");
}
else
{
div.Style.Add(HtmlTextWriterStyle.Display, "block");
}
}
}
}
DIV-ы имеют следующий вид: <div runat="server" ID="SpectraSimilarityDiv1DNMR" style="display:none">
<table>
...
</table>
</div>