Лабораторные работы / Методические указания к ЛР по ОАИП (09.02.07)
.pdf23 |
this.FormProfessorAccount.labelProfessorName.Text |
= |
||||
"Добро пожаловать, " + user.Professor.Name; |
|
|||||
24 |
this.FormProfessorAccount.Visible = true; |
|
||||
25 |
this.Visible = false; |
|
|
|
||
26 |
} |
|
|
|
|
|
|
else |
if |
(user.Login |
== |
textBoxLogin.Text |
&& |
27 |
user.Password == textBoxPassword.Text && user.Role == |
|||||
|
"Администратор") |
|
|
|
||
28 |
{ |
|
|
|
|
|
29 |
this.FormAdminPanel = new FormAdminPanel(this, user); |
|||||
30 |
this.FormAdminPanel.Visible = true; |
|
||||
31 |
this.Visible = false; |
|
|
|
||
32 |
} |
|
|
|
|
|
33 |
} |
|
|
|
|
|
34 |
} |
|
|
|
|
|
35 |
} |
|
|
|
|
|
В представленном методе идет последовательный перебор элементов коллекции UserSet, представляющий собой набор данных элементов из таблицы UserSet в базе данных. Если значение свойства Role элемента из коллекции равно «Студент», логин и пароль совпадают с теми, которые были введены в соответствующие текстовые поля (строка 11), то создается и открывается форма профиля студента FormStudentAccount. Если значение свойства Role элемента из коллекции равно «Преподаватель», логин и пароль совпадают с теми, которые были введены в соответствующие текстовые поля
(строка 19), то создается и открывается форма профиля преподавателя
FormProfessorAccount. Если значение свойства Role элемента из коллекции равно «Администратор», логин и пароль совпадают с теми, которые были введены в соответствующие текстовые поля (строка 27), то создается и открывается форма профиля администратора FormAdminPanel.
Обратите внимание, что при создании объекта одной из трех форм в конструктор передается дополнительно два параметра – ссылка на экземпляр текущего класса (формы авторизации) с помощью ключевого слова this и
ссылка на объект user, для которого осуществляется процесс авторизации,
чтобы использовать данные о пользователе при загрузке информации о нем в его профиле.
231
6.3. Просмотр списка преподавателей
Рассмотрим, как будет осуществляться просмотр списка преподавателей через профиль студента. Список выводится в listBoxLecturer при нажатии кнопки Просмотр списка преподавателей (buttonShowProfessors). После нажатия на эту кнопку она меняет свою надпись на Просмотр и свое назначение – после этого после выбора из списка преподавателя, если нажать на кнопку Просмотр откроется форма информации о преподавателе (форма
5).
Реализация метода обработчика события нажатия на кнопку Просмотр списка преподавателей/Просмотр представлена в листинге 14.5.
232
|
|
Листинг 14.5 – Просмотр списка преподавателей |
|
|
|
|
|
1 |
private void buttonShowProfessors_Click(object |
|
Метод обработчик события нажатия на |
sender, EventArgs e) |
|
кнопку buttonShowProfessors |
|
|
|
||
|
|
|
|
2 |
{ |
|
|
|
|
|
|
|
if (buttonShowProfessors.Text == "Просмотр списка |
|
Проверка на равенство надписи кнопки |
3 |
|
buttonShowProfessors значению |
|
преподавателей") |
|
||
|
|
"Просмотр списка преподавателей" |
|
|
|
|
|
|
|
|
|
4 |
{ |
|
Если условие в строке 3 истинно, то |
|
производим следующие действия |
||
|
|
|
|
|
|
|
|
5 |
using (EntityModelContainer db = new |
|
Создание объекта db контекста данных |
EntityModelContainer()) |
|
EntityModelContainer |
|
|
|
||
|
|
|
|
6 |
{ |
|
|
|
|
|
|
|
|
|
Цикл для обработки элементов коллекции |
7 |
foreach (Professor professor in db.ProfessorSet) |
|
db.ProfessorSet (коллекция сущностей |
|
|
|
ProfessorSet из базы данных) |
|
|
|
|
8 |
{ |
|
|
|
|
|
|
9 |
listBoxLecturer.Items.Add(professor.Name); |
|
Добавление в список listBoxLecturer |
|
значений свойства Name каждого |
||
|
|
|
|
|
|
|
|
233
|
|
преподавателя из коллекции |
|
|
|
db.ProfessorSet |
|
|
|
|
|
10 |
} |
|
|
|
|
|
|
11 |
} |
|
|
|
|
|
|
12 |
buttonShowProfessors.Text = "Просмотр"; |
Изменение надписи кнопки |
|
buttonShowProfessors на «Просмотр» |
|||
|
|
||
|
|
|
|
13 |
} |
|
|
|
|
|
|
|
|
Если условие в строке 3 ложно, то |
|
14 |
else if(buttonShowProfessors.Text == "Просмотр") |
производится проверка на равенство надписи |
|
кнопки buttonShowProfessors значению |
|||
|
|
||
|
|
"Просмотр" |
|
|
|
|
|
15 |
{ |
|
|
|
|
|
|
|
this.FormProfessorInfo = new |
Создание формы FormProfessorInfo и |
|
16 |
передача в конструктор формы ссылки на |
||
FormProfessorInfo(this); |
|||
|
экземпляр текущего класса (формы) |
||
|
|
||
|
|
|
|
17 |
using (EntityModelContainer db = new |
Создание объекта db контекста данных |
|
EntityModelContainer()) |
EntityModelContainer |
||
|
|||
|
|
|
|
18 |
{ |
|
|
|
|
|
234
|
|
Цикл для обработки элементов коллекции |
|
19 |
foreach (Professor professor in db.ProfessorSet) |
db.ProfessorSet (коллекция сущностей |
|
|
|
ProfessorSet из базы данных) |
|
|
|
|
|
20 |
{ |
|
|
|
|
|
|
|
|
Проверка на равенство значения свойства |
|
|
|
Name объекта professor из коллекции |
|
21 |
if (professor.Name == |
db.ProfessorSet элементу, выбранному в |
|
Convert.ToString(listBoxLecturer.SelectedItem)) |
списке listBoxLecturer (свойство |
||
|
|||
|
|
SelectedItem возвращает значение |
|
|
|
выбранного элемента в списке) |
|
|
|
|
|
|
|
Если условие в строке 21 истинно, то в |
|
22 |
{ |
таблице ProfessorSet базы данных был |
|
найден объект professor с именем, которое |
|||
|
|
||
|
|
выбрано в списке listBoxLecturer |
|
|
|
|
|
23 |
this.FormProfessorInfo.Show(); |
Открытие формы FormProfessorInfo |
|
|
|
|
|
24 |
this.FormProfessorInfo.richTextBoxName.Text = |
Изменение текста элемента |
|
professor.Name; |
richTextBoxName на значение свойства |
||
|
|||
|
|
|
235
|
|
Name объекта professor (ФИО |
|
|
|
преподавателя) |
|
|
|
|
|
|
|
Изменение текста элемента |
|
25 |
this.FormProfessorInfo.richTextBoxPosition.Text = |
richTextBoxPosition на значение |
|
professor.Position; |
свойства Position объекта professor |
||
|
|||
|
|
(Должность преподавателя) |
|
|
|
|
|
|
|
Изменение текста элемента |
|
26 |
this.FormProfessorInfo.richTextBoxPersonalData.Text |
richTextBoxPersonalData на значение |
|
= professor.PersonalData; |
свойства PersonalData объекта professor |
||
|
|||
|
|
(Информация «О себе» преподавателя) |
|
|
|
|
|
|
|
Изменение отображаемого изображения в |
|
|
this.FormProfessorInfo.pictureBoxPhoto.Image = |
pictureBoxPhoto путем последовательного |
|
27 |
(Image)((new |
преобразования массива байтов, хранящихся |
|
|
ImageConverter()).ConvertFrom(professor.Photo)); |
в свойстве Photo объекта professor в тип |
|
|
|
данных Image |
|
|
|
|
|
28 |
}}} |
|
|
|
|
|
|
29 |
this.Visible = false; |
Скрытие формы профиля студента |
|
|
|
|
|
30 |
}} |
|
|
|
|
|
236
6.4. Добавление темы дипломной работы
Добавление темы происходит по нажатию кнопки Добавить в форме профиля преподавателя. Тема дипломной работы записывается в текстовое поле richTextBoxNameThesis.
Предварительно рассмотрим реализацию конструкторы формы профиля преподавателя.
|
Листинг 14.6 – Конструктор формы профиля преподавателя |
|
|
|
|
1 |
Form1 Form1; |
|
2 |
User User; |
|
3 |
public FormProfessorAccount(Form1 form1, User user) |
|
4 |
{ |
|
5 |
InitializeComponent(); |
|
6 |
this.Form1 = form1; |
|
7 |
this.User = user; |
|
8 |
this.UpdateListBoxTheses(); |
|
9 |
} |
|
Конструктор принимает в качестве параметра ссылку на форму авторизации form1 для возможности перехода в нее обратно и ссылку на объект user, для которого будет происходить открытие профиля, и
информация о котором будет появляться в открываемой форме.
При реализации добавления используем запросы LINQ.
LINQ to Entities предлагает простой и интуитивно понятный подход для получения данных с помощью выражений, которые по форме близки выражениям языка SQL.
Хотя при работе с базой данных мы оперируем запросами LINQ, но база данных понимает только запросы на языке SQL. Поэтому между LINQ to
Entities и базой данных есть проводник, который позволяет им взаимодействовать. Этим проводником является провайдер EntityClient. Он создает интерфейс для взаимодействия с провайдером ADO.NET для SQL Serverа.
Для начала взаимодействия с базой данных создается объект
EntityConnection. Через объект EntityCommand он отправляет запросы, а с помощью объекта EntityDataReader считывает извлеченные из базы данных
237
данные. Однако разработчику не надо напрямую взаимодействовать с этими объектами, фреймворк все сделает за него. Задача же разработчика сводится в основном к написанию запросов к базе данных с помощью LINQ.
Рассмотрим реализацию метода обработчика события нажатия на кнопку Добавить, которая представлена в листинге 14.7.
Листинг 14.7 – Добавление темы
1 |
private User User; |
|
2 |
private void buttonAddThesis_Click(object sender, |
|
EventArgs e) |
||
|
||
3 |
{ |
|
4 |
using(EntityModelContainer db = new |
|
EntityModelContainer()) |
||
|
||
5 |
{ |
|
|
Professor ModifiableProfessor = |
|
6 |
(from p in db.ProfessorSet |
|
where p.Name == User.Professor.Name |
||
|
||
|
select p).FirstOrDefault(); |
|
|
Thesis thesis = new Thesis() { Name = |
|
7 |
richTextBoxNameThesis.Text, Annotation = |
|
richTextBoxNameThesis.Text, Professor = |
||
|
||
|
ModifiableProfessor }; |
|
8 |
db.ThesisSet.Add(thesis); |
|
9 |
ModifiableProfessor.Thesis.Add(thesis); |
|
10 |
db.SaveChanges(); |
|
11 |
} |
|
12 |
this.UpdateListBoxTheses(); |
|
13 |
} |
Встроке 6 создается объект ModifiableProfessor класса Professor,
вкоторый сохраняется результат запроса LINQ на выборку. В данном запросе мы отбираем элементы p из коллекции, у которых свойство Name равно значению аналогичного свойства у объекта User.Professor. User хранит данные об объекте-пользователе, для которого открыта форма профиля. Метод
FirstOrDefault() получает первый элемент полученной выборки (в данном случае – преподавателя, для которого выполнено условие выборки). Если выборка пуста, то он возвращает значение null.
238
При добавлении темы создается объект thesis класса Thesis и
инициализируются его свойства: Name, Annotation и Professor. |
Свойству |
Professor объекта thesis присваивается ссылка на |
объект |
ModifiableProfessor.
После создания темы происходит закрепление темы дипломного проекта за преподавателем. Для этого происходит обращение к свойству-коллекции
Thesis объекта ModifiableProfessor и добавление в нее ранее созданной темы thesis.
Метод UpdateListBoxTheses обновляет содержимое списка тем дипломных проектов. Его реализация представлена в листинге 14.8.
Листинг 14.8 – Обновление списка
1 |
private void UpdateListBoxTheses() |
|
|
|
|
2 |
{ |
|
|
|
|
3 |
this.listBoxTheses.Items.Clear(); |
|
|
|
|
4 |
using |
(EntityModelContainer |
db |
= |
new |
EntityModelContainer()) |
|
|
|
||
|
|
|
|
||
5 |
{ |
|
|
|
|
|
var ThesesList = |
|
|
|
|
|
from t in db.ThesisSet |
|
|
|
|
6 |
where t.Professor.Name == (from p in db.ProfessorSet |
||||
|
where p.Name == User.Professor.Name |
||||
|
|
||||
|
|
select p).FirstOrDefault().Name |
|||
|
select t; |
|
|
|
|
7 |
foreach (Thesis thesis in ThesesList) |
|
|
||
8 |
{ |
|
|
|
|
9 |
this.listBoxTheses.Items.Add(thesis.Name); |
|
|
||
10 |
} |
|
|
|
|
11}
12}
Встроке 6 реализован запрос LINQ – здесь идет выборка тем
дипломных проектов у преподавателя.
239
6.5. Редактирование темы дипломной работы
Редактирование темы происходит по нажатию кнопки Изменить в
форме профиля преподавателя. Измененная тема дипломной работы записывается в текстовое поле richTextBoxNewName.
Рассмотрим реализацию метода обработчика события нажатия на кнопку Изменить, которая представлена в листинге 14.9.
Листинг 14.9 – Редактирование темы
1 |
private void buttonChangeThesis_Click(object |
sender, |
||
EventArgs e) |
|
|
|
|
|
|
|
|
|
2 |
{ |
|
|
|
3 |
using(EntityModelContainer |
db |
= |
new |
EntityModelContainer()) |
|
|
|
|
|
|
|
|
|
4 |
{ |
|
|
|
5 |
string |
str |
|
= |
Convert.ToString(listBoxTheses.SelectedItem); |
|
|||
|
|
|||
|
Thesis ModifiableThesis = |
|
|
|
6 |
|
(from t in db.ThesisSet |
||
|
where t.Name == str |
|||
|
|
|||
|
|
select t).FirstOrDefault(); |
||
7 |
ModifiableThesis.Name = richTextBoxNewName.Text; |
|||
8 |
db.SaveChanges(); |
|
|
|
9 |
} |
|
|
|
10 |
this.UpdateListBoxTheses(); |
|
|
|
11 |
} |
|
|
|
В строковую переменную str сохраняется наименование темы,
выбранной в списке listBoxTheses. В строке 6 происходит создание объекта
ModifiableThesis класса Thesis, которому присваивается результат выполнения запроса на выборку, где ищется совпадение наименования темы каждой дипломной работы t.Name, хранящейся в таблице ThesisSet базы данных со строкой str. В строке 7 происходит обращение к свойству Name
объекта ModifiableThesis и присваивание ему нового значение, которое будет задано в текстовом поле richTextBoxNewName, то есть происходит изменение наименования темы дипломной работы, найденной в базе данных.
240