Выпадающий список сбрасывается до первого элемента и не возвращает значение selectedvalue


Итак, у меня есть раскрывающийся список страны и раскрывающийся список штата, который заполняется динамически на основе выбранной страны. Когда я нажимаю на страну, выпадающий список state заполняется просто отлично, но проблема возникает, когда я нажимаю значение (state) из другого выпадающего списка, список вместо сохранения выбранного элемента вернется к первому элементу списка, и никакие selectedvalue не отображаются.

<td><asp:DropDownList ID="ddlState" runat="server"
    DataSourceId="dsStateList"
    DataTextField="state_nm"
    DataValueField="state_cd"
    OnSelectedIndexChanged="ddlState_SelectedIndexChanged"
    AutoPostBack="true"
    AppendDataBoundItems="true" 
    Width="160px" OnDataBound="ddlState_OnDataBound">
    </asp:DropDownList>
</td>

    <asp:DropDownList ID="ddlCountry" runat="server"
    DataSourceId="dsCountryList"
    DataTextField="COUNTRY_NAME"
    DataValueField="COUNTRY_CIA_ID"
    OnSelectedIndexChanged="ddlCountry_SelectedIndexChanged"
    OnDataBound="ddlCountry_OnDataBound"
    AutoPostBack="true"
    AppendDataBoundItems="true" 
    Width="160px">
    </asp:DropDownList>


protected void ddlState_SelectedIndexChanged(object sender, EventArgs e)
{
    string comboStateCODE = ddlState.SelectedValue;
    dsCompanyListParam.Text = comboStateCODE;
    ddlCountry.DataBind();
    ddlState.DataBind();
}

protected void ddlState_OnDataBound(object sender, EventArgs e)
{
    ddlState.Items.Insert(0, "Please Select a State");
}
protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e)
{
    ddlState.Items.Clear();
    dsStateList.SelectParameters["iCountryID"].DefaultValue = ddlCountry.SelectedValue;

    dsCompanyListParam.Text = ddlCountry.SelectedValue;
    Trace.Warn("ddlCountry_SelectedIndexChanged");

    ddlCountry.DataBind();
    ddlState.DataBind();

}
protected void ddlCountry_OnDataBound(object sender, EventArgs e)
{
    ddlCountry.Items.Insert(0, "Please Select a Country");
}
4 2

4 ответа:

Я предполагаю, что где-то в Page_Load() вы вызываете метод, который заполняет выпадающий список... вам нужно инкапсулировать это в "если"!Блок обратной связи:

// somewhere in PageLoad()...
If(!IsPostBack)
{
    PopulateDropdown();
}

Используя соглашение выше, выпадающий список будет заполнен только при первой загрузке страницы. Я подозреваю, что когда вы делаете выбор из другого выпадающего списка, AutoPostBack выполняет метод Page_Load () (как и должно) и снова заполняет выпадающие списки.

Используя вышеприведенная конвенция должна помочь избежать этого.

Ваш выпадающий список state установлен в Autopostback - возможно ли, что ваш код для заполнения выпадающего списка country снова выполняет при обратной передаче, таким образом делая выбранное состояние недействительным, потому что выпадающий список country был повторно заполнен

Я бы удалил DDL-страну.DataBind (); из события ddlState_SelectedIndexChanged. Я не понимаю, зачем вам понадобилась еще одна привязка данных.

Решил ее! Ладно, просто для тех, кто застрял с подобной проблемой и не может найти другие области, чтобы посмотреть, вот как я исправил эту глупую проблему. Во-первых, я использовал хранимую процедуру, и хранимая процедура объединяет значения из двух полей. Я задал параметры целым числом (4), которое я не заметил, есть пара стран с кодами более 4. Таким образом, в основном, он возвращает NULL selectedvalue, который, в свою очередь, не будет генерировать никакого значения, так как мой onselectedindexchanged метод основан на selectedvalue и по какой-то причине NULL не обрабатывается. Так что да, проверьте ваши сохраненные procs и данные параметров! :Д Спасибо, что уделили мне время!