Фильтровать поле со списком на основе другого поля со списком

У меня нет проблем с тем, чтобы это работало в форме Windows, и я могу сделать это с помощью jquery. По какой-то причине это просто не будет работать с C# и asp.net.

Три поля со списком на веб-странице:

Specialty
Location
Department

У меня есть представление данных, содержащее данные из БД. У меня все три связаны с одним и тем же представлением данных, dv. DV содержит столбцы «специальность», «местоположение» и «отдел».

Когда я выбираю специальность, я хочу отфильтровать DataView, чтобы отображались только эти специальности. Каждое поле со списком должно отображать только эти строки.

protected void SpecialtyList_SelectedIndexChanged(object sender, EventArgs e)
{
    dv.RowFilter = string.Format("department_specialty = '{0}'", SpecialtyList.SelectedValue.ToString());
}

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


person ArnonRednon    schedule 20.05.2014    source источник
comment
Одна мысль состоит в том, что это, вероятно, можно было бы сделать в JavaScript на клиенте, чтобы сохранить обратную отправку на сервер каждый раз, когда вы меняете фильтр. Похоже, что изначально нефильтрованный набор данных все равно будет получен.   -  person James    schedule 21.05.2014
comment
Поле со списком, которое вы пытаетесь отфильтровать, привязано к dv (которое, как я полагаю, является DataView) или к DataTable?   -  person Mike Perrenoud    schedule 21.05.2014
comment
Я считаю, что вам нужно вернуть список к отфильтрованным результатам. это не повлияет сразу.   -  person Ahmed ilyas    schedule 21.05.2014


Ответы (1)


Вы разместили недостаточно кода — недостаточно данных для диагностики.

  1. Можете ли вы подключить отладчик и установить точку останова в SpecialtyList_SelectedIndexChanged(), чтобы убедиться, что он вызывается?

  2. Можете ли вы опубликовать полный код или, по крайней мере, части, относящиеся к привязке/заполнению данных?

Самая распространенная проблема (я видел) для этого: выполнение DataBind() при каждой загрузке. Когда вы выполняете повторную привязку данных, вы теряете контекст для событий IndexChanged и т. д. Вы сказали, что не выполняете повторную инициализацию данных в обратных передачах, но уверены ли вы, что не выполняете повторную привязку данных?

Попробуй это:

if (!IsPostBack)
{
  SpecialtyList.DataBind();
}

Вам также может понадобиться перепривязать DataView после изменения RowFilter:

protected void SpecialtyList_SelectedIndexChanged(object sender, EventArgs e)
{
    dv.RowFilter = string.Format("department_specialty = '{0}'", SpecialtyList.SelectedValue.ToString());
    dv.DataBind();
}
person nothingisnecessary    schedule 20.05.2014
comment
Спасибо за ваш ответ. Я понял. DataView был создан внутри if (!isPostBack) события загрузки страницы. Как только я переместил его за пределы этого, данные были там. Глупо думать, что я могу полагаться на ASP для поддержки данных, таких как сеанс. - person ArnonRednon; 21.05.2014