c # ASP.Net Динамически заполняемый DropDownList теряет выбранный индекс при нажатии кнопки - PullRequest
6 голосов
/ 08 марта 2012

Я динамически заполняю раскрывающийся список всех 50 состояний из ArrayList на PageLoad.Когда пользователь выбирает кнопку SUBMIT (событие btnSubmit_Click), свойство SelectedIndex элемента управления dropdownlist всегда равно 0, независимо от того, какой выбор выбрал пользователь.


Добавлен дополнительный код для устранения неполадок.Получение -1 как из переменной сеанса (bbb), так и из ddlState.selectedindex (bbb).

HTML-код в форме:

<asp:DropDownList ID="ddlState" runat="server" AutoPostBack="True" 
    onselectedindexchanged="ddlState_SelectedIndexChanged" >
</asp:DropDownList>

Код позади:

protected void Page_Load(object sender, EventArgs e)
{
    //------------------------------------------------
    // Populates state dropdownlists
    //------------------------------------------------
    if (!IsPostBack)
    {
        GetAllStatesForDdl(ddlDLState);
        GetAllStatesForDdl(ddlOldState);
        GetStatesForDdl(ddlState);
    }
}

private void GetAllStatesForDdl(DropDownList ddlStateList)
{
    AppInputFormProcessor getStates = new AppInputFormProcessor();
    ArrayList States = new ArrayList();
    States = getStates.GetAllStates();
    ddlStateList.DataSource = States;
    ddlStateList.DataBind();
}

private void GetStatesForDdl(DropDownList ddlStateList)
{
    AppInputFormProcessor getStates = new AppInputFormProcessor();
    ArrayList States = new ArrayList();
    States = getStates.GetStates();
    ddlStateList.DataSource = States;
    ddlStateList.DataBind();
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
    int aaa = ddlState.SelectedIndex;
    int bbb = Convert.ToInt32(Session["ddlState"]);
}

protected void ddlState_SelectedIndexChanged(object sender, EventArgs e)
{
    Session["ddlState"] = ddlState.SelectedIndex;
}

Ответы [ 9 ]

4 голосов
/ 14 марта 2012

Когда у меня возникли проблемы с ViewState (это то, что я подозреваю в вашем случае), я использовал это для восстановления данных в динамически заполненном раскрывающемся объекте

    public void Page_Load(object sender, EventArgs e){
            if (!IsPostBack)
            {
                Databind();
            }
            else {
                LoadAllViewStates();
            }
    }
    private void Databind()
        {
            DataTable questionnaireDT = null;
            DataTable questionsDT = null;
            DataTable indicatorDT = null;

            DataView tempView = QuestionnaireDS.Select(DataSourceSelectArguments.Empty) as DataView;
            questionnaireDT = tempView.Table;
            ViewState["QuestionnaireDL"] = questionnaireDT;
            QuestionnaireDL.DataSource = ViewState["QuestionnaireDL"];
            QuestionnaireDL.DataBind();

            tempView = QuestionDS.Select(DataSourceSelectArguments.Empty) as DataView;
            questionsDT = tempView.Table;
            ViewState["QuestionList"] = questionsDT;
            QuestionList.DataSource = ViewState["QuestionList"];
            QuestionList.DataBind();

            tempView = IndicatorDS.Select(DataSourceSelectArguments.Empty) as DataView;
            indicatorDT = tempView.Table;
            ViewState["IndicatorLst"] = indicatorDT;
            IndicatorLst.DataSource = ViewState["IndicatorLst"];
            IndicatorLst.DataBind();
        }

        private void LoadAllViewStates()
        {
            QuestionnaireDL.DataSource = ViewState["QuestionnaireDL"];
            QuestionnaireDL.DataBind();

            QuestionList.DataSource = ViewState["QuestionList"];
            QuestionList.DataBind();

            IndicatorLst.DataSource = ViewState["IndicatorLst"];
            IndicatorLst.DataBind();
        }

Чтобы восстановить выбранный индекс, я передал selectedIndexв скрытое поле.

Надеюсь, это поможет?

Кстати, зачем передавать объект DropDownList в качестве параметра?Вместо этого вызовите функцию без параметров и заполните объект DropDownList внутри функции.

Также убедитесь, что ViewState не выключен.

1 голос
/ 08 марта 2012

В вашем примере вы пытаетесь получить выбранное значение из переменной сеанса, но не показан код, который фактически устанавливает что-либо в сеансе.

Даже если у вас есть какой-то асинхронный вызов, который устанавливает переменную сеанса, это очень опасная практика: как только кто-то открывает вторую вкладку, вы рискуете испортить данные.

1 голос
/ 08 марта 2012

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

protected void Page_Load(object sender, EventArgs e)
{
    if(!IsPostBack)
        GetStatesForDdl(ddl);
}

 private void GetStatesForDdl(DropDownList ddlStateList)
 {
     AppInputFormProcessor getStates = new AppInputFormProcessor();
     ArrayList States = new ArrayList();
     States = getStates.GetStates();
     ddlStateList.DataSource = States;
     ddlStateList.DataBind();
 }
0 голосов
/ 06 июня 2012

Если вы связываете элементы выпадающего списка в OnInit, все состояние просмотра будет автоматически обрабатываться платформой.Если вы связываете это в Page_Load, вы не добавите их до тех пор, пока представление состояния уже не будет применено.Переместите его в OnInit, и вам не придется об этом беспокоиться.

0 голосов
/ 16 марта 2012

Когда вы говорите, что вы не используете ViewState, значит ли это, что он отключен для страницы или вашего выпадающего списка?Это может быть вашей проблемой.Я знаю, что многие люди спрашивали вас об этом, но я не вижу ответа от вас, чтобы предположить, используете ли вы viewstate или нет.Когда ваш пользователь делает выбор и ваша страница отправляет обратно, вам по-прежнему необходимо представление состояния, чтобы ваша страница знала, что пользователь выбирает, даже после отправки назад.Затем вы можете либо сохранить его в сеансе, либо в viewstate.

С другой стороны, если ваше состояние просмотра включено, добавьте один фрагмент кода на новую страницу, чтобы увидеть, когда проблема начнет появляться.Не забывайте не трогать состояние просмотра и идти с настройками по умолчанию.Для начала добавьте страницу с выпадающим списком и кнопкой, свяжите ее с 2-мя фиктивными значениями и прочитайте выбор пользователя на обратной странице.Если вы продолжите добавлять больше кода и элементов управления, если проблема вновь появится, вы сможете узнать, какая строка кода вызывает у вас горе.

Надеюсь, это поможет.

0 голосов
/ 16 марта 2012

Если у вас отключен ViewState, вам нужно сохранить SelectedIndex в сеансе и в Page_Load, вы всегда перезагружаете данные и устанавливаете индекс напрямую.Когда вы связываете источник данных, отправьте индекс в качестве параметра для индекса по умолчанию (из сеанса) и установите SelectedIndex на это число после вызова DataBind ().

0 голосов
/ 14 марта 2012

Это может помочь вам:

При привязке раскрывающегося списка укажите свойства DataTextField и DataValueField. Причина получения выбранного индекса как 0 во время отправки заключается в том, что раскрывающийся список не содержит уникальных значений, связанных с каждым элементом в нем. И помните, что свойство, указанное в DataValueField, должно быть уникальным. каждый элемент в раскрывающемся списке должен быть однозначно идентифицируемым.

Например, предположим, что класс States указан следующим образом:

public class State
{
    public string Name { get; set; }
    public string Id { get; set; }
}

Теперь выпадающий список должен быть связан, как указано ниже. Здесь для каждого элемента States свойство 'Id' уникально.

ddlStateList.DataSource = States;
ddlStateList.DataTextField = "Name";
ddlStateList.DataValueField = "Id";
ddlStateList.DataBind();
0 голосов
/ 13 марта 2012

Как насчет этого:

protected void GetStatesForDdl(DropDownList ddlStateList)
{
    //remove event handler
    ddlStateList.SelectedIndexChanged -= new EventHandler(ddlState_SelectedIndexChanged);

    //business as usual
    AppInputFormProcessor getStates = new AppInputFormProcessor();
    ArrayList States = new ArrayList();
    States = getStates.GetStates();
    ddlStateList.DataSource = States;
    ddlStateList.DataBind();

    // then force it to select desired index
    ddlStateList.SelectedIndex = (int)Session["ddlState"];

   //ok, stick it back to control
   ddlStateList.SelectedIndexChanged += new EventHandler(ddlState_SelectedIndexChanged);
}

Я предлагаю использовать локальные переменные в ViewState вместо Session и SelectedValue вместо SelectedIndex.

0 голосов
/ 08 марта 2012

Сначала вам нужно будет заполнить список и ввести данные только в операторе * 1001. *мог сделать это в выбранном индексе, измененном, как вы заявили.это должно работать, если вы не вызываете DataBind () при обратной передаче.

...