DropDownList + DIV + ViewState

$HiC0
Дата: 28.04.2007 16:20:34
Добрый день.
Ситуация следующая. На страничке имеет 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>
pecha
Дата: 29.04.2007 11:24:29
Для этих целей нужно использовать MultiView

GoDevs.com - Cheap Domain Names, Free/Cheap ASP.NET AJAX Web Hosting, 24x7 support and much more.