В этом примере привязка данных для спискового элемента управления выполняется лишь однажды, когда страница запрашивается первый раз. После этого используются значения в видимом состоянии. Код идентичен для SqlDataSource и для ObjectDataSource. Но это не так для остальной части примера.
Следующая сложность — как перехватить щелчок на любом из двух первых элементов списка. Это можно сделать, обработав событие источника данных Selecting, которое происходит непосредственно перед выполнением запроса. Затем вы можете проверить параметры, которые должны быть переданы, и при необходимости отменить операцию.
Вот полный код:
protected void sourceEmployees_Selecting(object sender,
SqlDataSourceSelectingEventArgs e)
{
if ((string)e.Command.Parameters["@City"].Value == "(Choose a City)")
{
// Ничего не делать.
e.Cancel = true;
}
else if ((string)e.Command.Parameters["@City"].Value == "(All Cities)")
{
// Вручную изменить команду.
e.Command.CommandText = "SELECT * FROM Employees";
}
}
Этот грубый принудительный подход с изменением команды за счет
применения жестко закодированного запроса выглядит безобразно. Другой подход
заключается в отмене операции, вызове другого метода, который возвращает
соответствующие данные, и привязке их. Однако это предполагает значительную долю
ручной работы, а смешивание автоматической привязки с ручной может привести
к путанице. К сожалению, идеального решения не существует.
ObjectDataSource справляется с проблемой лучше, поскольку дает возможность перенаправить команду на другой метод. Если вы обнаружите, что требуется полный список сотрудников, то можете вообще исключить параметр City и использовать метод без параметров для извлечения всех записей о сотрудниках.
предыдущая следующая страница оглавление
416