Решение этой проблемы предусматривает несколько обходных путей, хотя ни один из них не идеален. Можно переписать запрос так, чтобы он возвращал результирующий набор с дополнительным жестко закодированным элементом, например:
SELECT '(Choose a City)' AS City UNION SELECT DISTINCT City FROM Employees
Проблема такого подхода в том, что он заставляет добавлять детали представления на уровне данных. Если ваш запрос содержится в выделенной хранимой процедуре (что всегда хорошая идея), трудно будет повторно использовать такой запрос для других целей, и неудобно сопровождать такую страницу.
Более удачное решение заключается во вставке этих фиксированных строк в DropDownList программным способом. Однако вы не можете предпринять этот шаг до того, как произойдет привязка данных, поскольку сам процесс привязки данных удалит их из списка. Можно переопределить метод Page.OnPreRenderComplete() для выполнения этой задачи. Однако это порождает новую сложность. Во-первых, GridView уже будет заполнен данными на основе начального выбора в DropDownList. (Даже если вы решите эту проблему, останутся другие, связанные с тем, как изменения обнаруживаются при выборе в DropDownList.)
В конечном итоге вам придется обратиться к программной привязке данных. При нормальной операции элементы управления источниками данных вызываются автоматически, когда связанный элемент управления нуждается в данных или готов к подтверждению обновлений. Однако менее известный факт состоит в том, что вы также можете управлять элементами управления источниками данных программно, вызывая такие методы, как Select(), Update(), Insert() и Delete(). Конечно, в этом случае на вас ложится ответственность за привязку данных, извлеченных из Select(), и обновление измененных данных в базе при подтверждении обновлений.
Чтобы применить это на практике, начните с исключения свойства DropDownList.DataSourceID. Вместо его использования вы привяжете элемент управления при первоначальной загрузке страницы. Это даст вам возможность вставить элементы немедленно, перед тем, как произойдет любая другая привязка данных:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
// Инициировать запрос sourceEmployeeCities и привязать результаты.
lstCities.DataSource =
sourceEmployeeCities.Select(DataSourceSelectArguments.Empty);
lstCities.DataBind();
// Добавить два новых элемента и выбрать первый.
lstCities.Items.Insert(0, "(Choose a City)");
lstCities.Items.Insert(1, "(All Cities)");
lstCities.SelectedIndex = 0;
}
}
предыдущая следующая страница оглавление
415