В самостоятельной работе 8 написано: "В пункте "Server name" задаем имя сервера, которое необходимо узнать у преподавателя". Где узнать это имя? |
Отображение данных на экранной форме
Цель работы: Изучить основные приемы и способы отображения и связывания данных объекта 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.
Свойство 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.
Задание на лабораторную работу
- Изучите теоретический материал.
- Осуществите привязку источника данных к элементам управления экранной формы.
- Разработайте необходимые методы для вывода информации из базы данных на экранную форму.
- Протестируйте приложение