Опубликован: 25.09.2008 | Доступ: свободный | Студентов: 3223 / 516 | Оценка: 4.32 / 3.98 | Длительность: 18:50:00
ISBN: 978-5-94774-991-5
Лекция 10:

Использование баз данных в приложениях ASP.NET

< Лекция 9 || Лекция 10: 12345678910

Привязка с множественным значением

Для отображения набора значений необходимо использовать привязку с множественным значением. Привязываемый набор значений должен содержаться в объекте, способном хранить коллекции значений (например, объекты ArrayList, Hashtable и др.).

Каждый элемент, поддерживающий возможность множественной привязки, содержит следующий набор свойств:

DataSource Объект, содержащий привязываемые данные.
DataSourceID Свойство, которое содержит идентификатор объекта, использующегося для подключения к источнику данных. В отличие от DataSource, значение DataSourceID можно установить в режиме дизайна на этапе разработки приложения.
DataTextField Содержит наименование столбца (для строки) таблицы или свойство (для объекта) элемента данных, включающего в себя отображаемое на экране значение.
DataTextFormatString Содержит необязательную строку форматирования, применяемую для отображения данных.
DataValueField Содержит уникальный идентификатор или поле первичного ключа, которое используется для извлечения данных, связанных с выбираемым пользователем элементом.

Принципы использования всех списковых элементов, способных отображать связанные данные, одинаков. Для привязки такого элемента к источнику данных необходимо установить значения свойств DataSource и DataTextField.

В следующем примере на странице размещены два элемента - DropDownList1 и ListBox1, которые связаны с одним и тем же источником данных - в качестве такового выступает таблица "Товары":

protected void Page_Load(object sender, EventArgs e)
{
  string strCon = WebConfigurationManager.ConnectionStrings
   ["Test_Db"].ConnectionString;
  string sqlString = "SELECT КодТовара,НаименованиеТовара,Цена
   FROM Товары";
  SqlConnection sqlCon = new SqlConnection(strCon);

  SqlDataAdapter da = new SqlDataAdapter(sqlString,sqlCon);
  DataSet ds = new DataSet();
  da.Fill(ds, "Goods");
  DropDownList1.DataSource = ds.Tables["Goods"];
  DropDownList1.DataTextField = "НаименованиеТовара";
  DropDownList1.DataValueField = "КодТовара";

  ListBox1.DataSource = ds.Tables["Goods"];
  ListBox1.DataTextField = "НаименованиеТовара";
  ListBox1.DataValueField = "КодТовара";

  this.DataBind();
}

Так как объект DataSet может содержать много таблиц, в свойстве DataSource необходимо указать имя таблицы, к которой необходимо осуществить привязку. Свойство DataTextField содержит наименование столбца таблицы, значения которого будут отображаться элементом управления. Свойство DataValueField является необязательным и в данном случае обозначает то, что при выборе значения в элементе управления значение свойства SelectedItem этого элемента будет установлено равным значению поля "КодТовара", соответствующего выбранной записи. Считать выбранные значения элементов можно следующим образом:

protected void Button1_Click(object sender, EventArgs e)
{
  StringBuilder str = new StringBuilder();
  str.Append("В Выпадающем списке выбран элемент - ");
  str.Append(DropDownList1.SelectedItem.Text);
  str.Append(" ему соответствует значение ");
  str.Append(DropDownList1.SelectedValue);
  str.Append("</br>");
  str.Append("В Списке выбраны элементы:</br>");
  foreach (ListItem li in ListBox1.Items)
  {
    if (li.Selected)
    {
      str.Append(li.Text);
      str.Append(" значение - ");
      str.Append(li.Value);
      str.Append("</br>");
    }
  }
  Label2.Text = str.ToString();
}

Результат работы программы изображен на рис. 10.14.

Результат использования элементов множественной привязки данных и вывода значений выбранных элементов списка

Рис. 10.14. Результат использования элементов множественной привязки данных и вывода значений выбранных элементов списка

В данном примере элемент ListBox1 поддерживает возможность выбора сразу нескольких элементов (для этого необходимо установить значение свойства SelectionMode данного элемента равным Multiple ). Чтение значения выделенного элемента в списке осуществляется посредством свойства SelectedItem. Однако в случае с ListBox1 данное свойство использовать нельзя, т. к. возможно множественное выделение. Для определения каждого элемента, выделенного в ListBox1, необходимо применить цикл, где происходит обращение к коллекции элементов Items, для каждого из которых имеется свойство Selected. Если значение данного свойства установлено равным true, данный элемент выделен и его необходимо отобразить.

Аналогичный принцип можно применить с любым другим элементом управления, поддерживающим множественное выделение элементов.

Кроме использованных списковых элементов, ASP.NET содержит также и более сложные элементы, способные привязываться к данным и отображать их. К таким элементам относятся GridView, DetailsView, FormView.

GridView представляет собой таблицу, способную привязываться к данным и отображать содержимое таблиц. Поддерживает выбор, редактирование, сортировку и перемещение по страницам данных. DetailsView предназначен для показа одной записи из таблицы за раз. Поддерживает редактирование и перемещение по страницам. FormView практически аналогичен DetailsView, с той лишь разницей, что FormView основан на шаблонах, и это делает его более гибким при отображении информации.

Самым мощным элементом по количеству возможностей является GridView. Очень часто его приходится использовать для отображения информации в виде таблицы. Для привязки GridView к источнику данных необходимо установить значение свойства DataSource. В следующем примере на странице размещен объект GridView, который привязывается к таблице "Товары" и отображает ее содержимое:

protected void Page_Load(object sender, EventArgs e)
{
  string strCon = WebConfigurationManager.ConnectionStrings
   ["Test_Db"].ConnectionString;
  string strQuery = "SELECT * FROM Товары";
  SqlConnection sqlCon = new SqlConnection(strCon);
  DataSet ds = new DataSet();
  SqlDataAdapter da = new SqlDataAdapter();
  da.SelectCommand = new SqlCommand(strQuery, sqlCon);
  da.Fill(ds, "Goods");
  GridView1.DataSource = ds.Tables["Goods"];
  this.DataBind();
}

Результат работы программы представлен на рис. 10.15.

Результат использования GridView на странице Web-приложения

Рис. 10.15. Результат использования GridView на странице Web-приложения

Показанные примеры демонстрируют способы привязки к источникам данных с использованием программного кода, однако это не единственная возможность осуществить привязку элемента управления к источнику данных. Visual Studio 2005 позволяет осуществить привязку с использованием визуальных средств. Для этих целей .NET Framework содержит несколько элементов управления источниками данных. Они расположены на вкладке Data панели Toolbox. Среди них такие как:

SqlDataSource - позволяет подключаться к любому источнику данных, который имеет поставщика данных ADO.NET. К таким источникам данных относятся SQL Server, OLE DB, Oracle и другие.

ObjectDataSource - позволяет подключаться к пользовательскому классу доступа к данным. Этот подход целесообразно применять при построении крупномасштабных и сложных приложений. Подробнее об использовании пользовательских классов доступа к данным и элементе ObjectDataSource будет рассказано в разделе, посвященном реализации трехуровневой архитектуры доступа к данным в ASP.NET

AccessDataSource - позволяет подключаться к базам данных Microsoft Access.

XmlDataSource - позволяет подключаться к XML-файлу.

SiteMapDataSource - позволяет подключаться к файлу Web.Sitemap, содержащему описание навигационной структуры Web-приложения.

Для использования элемента управления источниками данных достаточно перетащить его с панели Toolbox в область Web-страницы. При этом он отображается в виде серого прямоугольника, содержащего внутри наименование элемента управления источником данных.

Использование элемента управления источником данных

Рис. 10.16. Использование элемента управления источником данных

Для конфигурирования элемента SqlDataSource можно воспользоваться мастером, запускаемым при нажатии на ссылку Configure Data Source.

На первом шаге конфигурирования элемента SqlDataSource необходимо определить подключение к базе данных. Если существует уже настроенное подключение к источнику данных, его просто можно выбрать из списка; в противном случае, можно создать и настроить новое подключение к БД, нажав на кнопку New Connection.

Первый шаг настройки элемента SqlDataSource на подключение к базе данных

Рис. 10.17. Первый шаг настройки элемента SqlDataSource на подключение к базе данных

На втором шаге мастер предлагает сохранить сгенерированную строку подключения к БД в файле web.config. При необходимости можно отказаться, а также изменить наименование переменной, содержащей строку подключения.

Третий шаг мастера позволяет определить запросы к БД, используемые SqlDataSource для выполнения операций над данными. В частности, предлагается выбрать таблицу и сгенерировать запрос на выборку данных из нее. Здесь же можно определить свои собственные запросы на выборку, добавление, удаление и обновление данных или указать используемую хранимую процедуру.

Мастер может также сгенерировать стандартные запросы, используемые для добавления, удаления и обновления значений в связанном источнике данных. Для построения этих запросов можно воспользоваться кнопкой Advanced. При этом будет открыто окно, в котором можно установить два свойства. Свойство Generate INSERT, UPDATE, and DELETE statements задает режим создания соответствующих запросов. Свойство Use optimistic concurrency задает режим определения тех строк, которые были изменены с момента последней загрузки данных в объект DataSet.

Второй шаг мастера настройки SqlDataSource на подключение к БД

Рис. 10.18. Второй шаг мастера настройки SqlDataSource на подключение к БД
Третий шаг мастера настройки SqlDataSource на подключение к БД

Рис. 10.19. Третий шаг мастера настройки SqlDataSource на подключение к БД
Окно генерации запросов на вставку, обновление и удаление данных из БД

Рис. 10.20. Окно генерации запросов на вставку, обновление и удаление данных из БД

Четвертый шаг мастера позволяет протестировать созданный запрос и, после нажатия на кнопку Finish, завершить настройку элемента управления источником данных.

В результате настройки параметров объекта SqlDataSource устанавливается целый ряд значений свойств элементов. Основными из них являются следующие ( рис. 10.21).

Окно свойств элемента SqlDataSource, установленных с помощью мастера

Рис. 10.21. Окно свойств элемента SqlDataSource, установленных с помощью мастера

DataSourceMode — задает режим, используемый для извлечения строк. Возможные значения — DataSet и DataReader.

ConnectionString — задает строку подключения к источнику данных.

DeleteCommandType — задает тип запроса Delete. Возможные значения - Text и StoredProcedure.

DeleteQuery — задает запрос, используемый для удаления данных из связанного источника.

Последние два параметра применяются также и для других запросов - на изменение, добавление и выборку данных.

При необходимости можно изменить любой запрос. Для этого нужно щелкнуть на кнопку, расположенную в строке редактируемого запроса. В результате будет открыто окно редактирования запроса. Пример такого окна для редактирования запроса на изменение данных изображен на рис. 10.22.

Пример окна редактирования запроса на изменение данных

Рис. 10.22. Пример окна редактирования запроса на изменение данных

После того как настройки элемента управления источником данных завершены, необходимо связать с ним элемент отображения данных на экране. Для этого нужно указать имя объекта SqlDataSource в свойстве DataSourceID элемента отображения данных. На рис. 10.23 показана возможность привязки GridView к SqlDataSource и установка несколько специфических режимов отображения данных (удаление, редактирование, выбор строк, сортировка данных в столбцах).

Привязка GridView к элементу управления источником данных и задание специфических режимов их отображения

Рис. 10.23. Привязка GridView к элементу управления источником данных и задание специфических режимов их отображения

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

При использовании данного подхода к привязке данных вызов метода DataBind() в коде приложения становится необязательным.

< Лекция 9 || Лекция 10: 12345678910