Опубликован: 09.09.2008 | Уровень: специалист | Доступ: платный
Самостоятельная работа 9:

Отображение данных на экранной форме

Цель работы: Изучить основные приемы и способы отображения и связывания данных объекта DataSet и элементов управления Windows - формы.

Основные сведения

Для отображения информации на элементах управления Windows Forms необходимо осуществить их заполнение из соответствующих столбцов и строк таблиц DataSet. Это можно сделать путем написания специального кода, который предназначен для заполнения соответствующих элементов управления или использовать механизм привязки данных к пользовательским интерфейсам .NET.

Windows Forms позволяют отображать данные путем привязки их элементов управления к источникам данных. Привязка данных обычно используется для отображения результатов поиска, детализации сводок, генерации отчетов и ввода данных. Существует два типа привязки данных: простая и сложная. В случае простой привязки данных элемент управления привязывается к отдельному элементу данных. Простая привязка, в основном, используется с такими элементами управления, как поле ввода ( TextBox ) и надпись ( Lable ). При сложной привязке данных элемент управления привязывается более чем к одному элементу данных - обычно к одному или нескольким столбцам в нескольких строках результирующего набора строк. К элементам управления, поддерживающим сложную привязку данных, относятся список ( ListBox ), выпадающий список ( ComboBox ), список данных ( DataList ) и табличный элемент ( DataGrid ).

В технологии привязки элементов управления Windows Forms используется абстрактный класс BindingManagerBase. Данный класс синхронизирует все элементы управления Windows Forms (т. е. объекты Binding ), привязанные к одному источнику данных, позволяя отображать информацию об объекте в источнике данных - например, о строке в локальной таблице.

Класс BindingContext используется для создания экземпляра объекта BindingManagerBase, и возвращается при этом объект CurrencyManager или PropertyManager в зависимости от типа источника данных:

Класс CurrencyManager является потомком класса BindingManagerBase и поддерживает указатель на текущий элемент в источнике данных, который реализует интерфейсы IList, IListSource или IBindingList. Источники данных не обязательно поддерживают указатель на текущий элемент. CurrencyManager уведомляет все привязанные элементы управления об изменении текущего элемента, чтобы они могли обновить свои данные. Класс CurrencyManager поддерживает текущее свойство объекта, а не сам объект в списке.

Свойство Position - это индекс с отсчетом от нуля, позволяющий узнать или задать текущую позицию в источнике данных. Свойство Count возвращает количество элементов данных в списке. Свойство Current возвращает текущий объект в списке, который необходимо привести к типу объекта в соответствующем источнике данных, прежде чем с ним можно будет работать.

При связывании элемента контроля ListBox устанавливается множественная связь с источником данных. Для связи используются свойства списка DataSource и DisplayMember. Свяжем элемент контроля listBoxEmployee, в котором должен отображаться список фамилий сотрудников, со столбцом EmployeeSurname таблицы Employee. Это можно сделать, добавив следующие строки кода в метод загрузки формы FormEmployee_Load.

this.listBoxEmployee.DataSource = this.dsEmployee;
this.listBoxEmployee.DisplayMember = 
            "Employee.EmployeeSurname";

Протестируйте добавленный в программу код.

В разрабатываемом приложении на Windows -форме FormEmployee имеются четыре текстовых поля: textBoxSurname, textBoxName, textBoxPatronymic и textBoxNetName. Эти текстовые поля предназначены для отображения информации из одной записи таблицы Employee набора данных dsEmployee. Для того чтобы содержимое текстовых полей автоматически обновлялось при смене записи, их необходимо связать с соответствующими колонками набора данных dsEmployee. Связывание можно осуществить, используя свойство DataBindings элемента управления TextBox. Например, для элемента управления textBoxSurname можно осуществить связь с источником данных, добавив следующую строку кода в метод загрузки формы FormEmployee_Load.

textBoxSurname.DataBindings.Add("Text", dsEmployee, 
"Employee.EmployeeSurname");

Протестируйте добавленный в программу код.

Аналогично свяжите текстовые поля textBoxName, textBoxPatronymic и textBoxNetName с источником данных.

Протестируйте добавленный в программу код.

В таблице Employee значения для атрибута Access (доступ) задается в виде символьной строки, значение которой выбирается из списка элемента управления comboBoxAccess. Коллекцию выпадающего списка элемента управления comboBoxAccess можно задать следующей строкой кода:

this.comboBoxAccess.Items.AddRange(new object[] {"не задан", "администратор", 
  "начальник смены", "старший оператор", "оператор", "аналитик"});

Для заданной записи источника данных (таблица Employee ) значение столбца Access необходимо отобразить в элементе контроля comboBoxAccess. Это можно сделать аналогично тому, как это делалось для элементов управления TextBox, задавая свойство DataBindings

Протестируйте добавленный в программу код.

Для элемента управления comboBoxStatus необходимо сформировать коллекцию выпадающего списка: не задан, активен, выходной, в отпуске, болеет, не работает, помечен как удаленный.

В таблице Employee значения для атрибута EmployeeStatus (статус) задается в виде целого числа ( 0, 1, 2, 3, 4, 6 ), однако статус сотрудника должен отображаться в элементе управления comboBoxStatus в виде строковых значений в соответствии со значениями его коллекции. В программе необходимо реализовать отображение целочисленных данных из DataSet в текстовые значения в элементе контроля comboBoxStatus. Для этого необходимо отслеживать изменение позиции в таблице источника данных dsEmployee и в соответствии со значением столбца EmployeeStatus активизировать требуемый элемент ( Item ) списка comboBoxStatus.

Объявим объект bmEmployee класса BindingManagerBase в форме FormEmployee:

BindingManagerBase  bmEmployee;

В конструкторе класса FormEmployee, создадим объект bmEmployee применяя индексатор контента BindingContext включив в него связывание с таблицей Employee и добавим делегат для события, которое формируется при изменении позиции в данной таблице:

public FormEmployee( )
{
	InitializeComponent();
	bmEmployee = this.BindingContext[dsEmployee, "Employee"];
// Добавляем делегата  PositionChanged для события - изменение 
//позиции в таблице Employee DataSet dsEmployee
	bmEmployee.PositionChanged += new EventHandler(BindingManagerBase_PositionChanged);
}

Кроме того, необходимо создать обработчик для сформированного события, который на основе выбранной строки ( pos ) таблицы Employee будет задавать свойству Text списка comboBoxStatus значение из коллекции Items по индексу ( sel ), полученному из столбца EmployeeStatus Employee.

private void BindingManagerBase_PositionChanged(object sender, EventArgs e)
{
	int pos = ((BindingManagerBase)sender).Position;
	int sel = (int)dsEmployee.Employee[pos].EmployeeStatus;
	this.comboBoxStatus.Text = this.comboBoxStatus.Items[sel].ToString();
}

Протестируйте добавленный в программу код.

Для задания в элементе контроля comboBoxJobRole должности сотрудника необходимо получить данные из родительской таблицы JobTitle, с которой таблица Employee связана внешним ключом JobRoleID. Фактически необходимо осуществить вывод данных из справочника (таблица JobTitle ) по данным в основной таблице Employee.

В Windows Forms элемент управления ComboBox имеет три свойства, управляющих привязкой к источникам данных. Эти свойства описаны в таблице 9.1.

Таблица 9.1. Свойства элемента управления ComboBox, управляющие привязкой к источникам данных
Свойство Описание
Data Source Позволяет узнать или задать источник данных для элемента управления. Это может быть объект Data Table, DataView или вообще любой объект, реализующий интерфейс IList
DisplayMember Позволяет узнать или задать свойство источника данных, которое отображается в элементе управления. В случае DataTable и DataView это имя столбца
ValueMember Позволяет узнать или задать свойство источника данных, которое предоставляет значения для элемента управления. В случае DataTable и DataView это имя столбца. По умолчанию задана пустая строка

Свойство DataBindings объекта ComboBox предоставляет доступ к коллекции ControlBindingsCollection. Метод Add этой коллекции добавляет в неё привязку. Перегруженный вариант метода Add принимает три аргумента:

  • PropertyName - имя свойства элемента управления, к которому осуществляется привязка;
  • DataSource - имя привязываемого источника данных;
  • DataMember - имя свойства привязываемого источника данных.

Вначале связываем элемент контроля comboBoxJobRole с набором данных JobTitle (родительская таблица - справочник), в соответствии с кодом, приведенным ниже.

comboBoxJobRole.DataSource = this.dsEmployee.JobTitle;
comboBoxJobRole.DisplayMember = "JobRoleName";
comboBoxJobRole.ValueMember = "JobRoleID";

После этого необходимо связать comboBoxJobRole с полем JobRoleID основной таблицы Employee (дочерняя таблица), в соответствии со следующим кодом

comboBoxJobRole.DataBindings.Add("SelectedValue", dsEmployee,"Employee.JobRoleID");

После компиляции и запуска приложения экранная форма будет иметь вид, приведенный на рисунке 9.1.

Экранная форма в режиме просмотра (только для чтения)

увеличить изображение
Рис. 9.1. Экранная форма в режиме просмотра (только для чтения)

Задание на лабораторную работу

  1. Изучите теоретический материал.
  2. Осуществите привязку источника данных к элементам управления экранной формы.
  3. Разработайте необходимые методы для вывода информации из базы данных на экранную форму.
  4. Протестируйте приложение
Анна Иваненко
Анна Иваненко

В самостоятельной работе 8 написано: "В пункте "Server name" задаем имя сервера, которое необходимо узнать у преподавателя". Где узнать это имя?

Вячеслав Шестивский
Вячеслав Шестивский

Вроде всё выставил верно, но при клике на "Сотрудники", меню из FormEmplyee не вставляется в меню главного окна а висит в дочернем окне снизу.  Как поправить?

Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974
Анастасия Балыбердина
Анастасия Балыбердина
Украина, Киев, НТУУ КПИ