Как получить выбранные значения из динамически созданного массива DropDownList после PostBack (нажатие кнопки) - PullRequest
0 голосов
/ 05 мая 2011

У меня есть CheckBoxList, который содержит имена сотрудников на шаге мастера.Когда сотрудники выбираются и активный шаг изменяется, вызывается функция Wizard1_ActiveStepChanged, которая динамически создает массив DropDownList для каждого выбранного сотрудника.Каждый DropDownList указывает состояние сотрудника.DropDownList создан правильно.Когда пользователь нажимает кнопку «Отправить», массив DropDownList удаляется, и из массива невозможно извлечь выбранные значения.

Я понимаю, что это проблема с PostBack и может быть исправлена ​​с помощью ViewState, но я пытаюсь понятьчто я могу сделать, чтобы это исправить.ViewState включен для списка флажков и DropDownList.

Это то, что у меня есть в теле моего класса System.Web.UI.Page

    private int empcount;
    private DropDownList[] DDL_Emp
    {
        get
        {
           return (DropDownList[])ViewState["DDL_Emp"];
        }
        set
        {
            ViewState["DDL_Emp"] = value;
        }
    }

Соответствующий код:

    protected void Wizard1_ActiveStepChanged(object sender, EventArgs e)
    {

        if (Request.QueryString["type"] == "Accident"  && BulletedList1.Items.Count > 0)
        {
            this.empcount = 0;

            for (int i = 0; i < CBL_EmpInvolved.Items.Count; i++)
            {
                if (CBL_EmpInvolved.Items[i].Selected)
                {
                    this.empcount++;
                }

            }

            if(this.empcount > 0)
            {
                this.DDL_Emp = new DropDownList[this.empcount];                   



                for (int i = 0, j=0; i < CBL_EmpInvolved.Items.Count; i++) 
                {
                    if (CBL_EmpInvolved.Items[i].Selected)
                    {
                        List<ListItem> cond = new List<ListItem>();

                        cond.Add(new ListItem("Disabled", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("Diseased - Fatality", CBL_EmpInvolved.Items[i].Value));                          
                        cond.Add(new ListItem("On Treatment - Short Term Disability", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("On Treatment - Long Term Disability", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("Treated - Back to Work", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("Treated - Relocated", CBL_EmpInvolved.Items[i].Value));
                        cond.Add(new ListItem("Treated - Transferred", CBL_EmpInvolved.Items[i].Value));

                        this.DDL_Emp[j] = new DropDownList();

                        this.DDL_Emp[j].ID = "DD_LabCondition_" + CBL_EmpInvolved.Items[i].Value;
                        this.DDL_Emp[j].EnableViewState = true;
                        this.DDL_Emp[j].Visible = true;
                        this.DDL_Emp[j].Items.AddRange(cond.ToArray());
                        this.DDL_Emp[j].Items.Insert(0, new ListItem("-- Select condition of employee: " + CBL_EmpInvolved.Items[i].Text, ""));


                        PH_LabCondition.Controls.Add(this.DDL_Emp[j]);
                        j++;
                    }

                }

                PH_LabCondition.Visible = true;
                MV_LabCondition.Visible = true;

                Label1_ReportTitle.Text += "Control Count: " + PH_LabCondition.Controls.Count.ToString();

            }

            MV_LabCondition.ActiveViewIndex = 1;
            MV_LostTime.ActiveViewIndex = 1;
        }
    }

Этот код дает мне следующую ошибку:

Введите 'System.Web.UI.WebControls.DropDownList' в сборке 'System.Web, версия = 4.0.0.0,Культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a 'не помечена как сериализуемая.

Я пытался изменить кнопки на изображения, играя с функцией AutoPostBack.Я заблудился о том, как сохранить мой выпадающий список в ViewState и получить к нему доступ после обратной передачи.

1 Ответ

0 голосов
/ 05 мая 2011

Похоже, у вас проблема с жизненным циклом страницы ASP.NET.Поскольку вы создаете ListItems после загрузки ViewState, ViewState не знает о существовании ListItems.Дело не в том, что элементы управления удалены, они не существуют.

Если бы вы создавали элементы управления на этапе инициализации страниц, состояние просмотра будет знать об объектах и ​​поддерживать состояние.Вам придется проверить элемент управления, вызвавший обратную передачу в Page_Init, и выполнить некоторую логику вместо обработчика событий элемента управления, чтобы получить ожидаемые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...