Выпадающий список сбрасывается до первого элемента и не возвращает значение 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 ответа:
Я предполагаю, что где-то в 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 и данные параметров! :Д Спасибо, что уделили мне время!