Программа 'Общежитие'
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
. ВНЕШНЕЕ ОПИСАНИЕ
. ПРОЕКТИРОВАНИЕ
. ОПИСАНИЕ ПРОГРАММЫ
. АТТЕСТАЦИЯ ПРОГРАММНОГО СРЕДСТВА
ЗАКЛЮЧЕНИЕ
СПИСОК ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЕ
Введение
В пояснительной записке рассматривается описание
программы «Общежитие».
Данная программа предназначена для учёта жильцов
студенческого общежития, в программе должны храниться следующие данные: имя,
фамилия, отчество, номер телефона, возраст, курс и группа студента, а также,
список комнат с проживающими там студентами. Программа должна иметь возможность
поиска в базе данных по заданному критерию.
Пользователь может создавать, изменять и удалять
записи в базе данных. Со стороны пользователя программа проста в использовании
и имеет простой и интуитивно - понятный интерфейс.
В качестве основного инструмента разработки
применяется MicrosoftVisualStudio
2010 и платформа .NET. Язык программирования C#.
ВНЕШНЕЕ ОПИСАНИЕ
.1 Определение
требований к программному средству
Программа должна поддерживать базу данных по
общежитию, состоящую из двух таблиц. Первая включает следующие поля в одной
записи: имя, фамилия, отчество, возраст, телефон, курс, группа и индекс
комнаты. Вторая включает: число мест в комнате и список проживающих в ней
студентов.Так же программа должна иметь возможность добавления, изменения,
удаления записей.
Программа должна сохранять базу данных на
жесткий диск с использованием стандартов представления информации.
.2 Спецификация
качества программного обеспечения
Функциональность: программа должна являться
полностью завершенным программным продуктом, не требующим каких-либо
дополнительных специальных компонентов.
Надёжность: программа должна быть автономной.
Эффективность: программа должна функционировать
в операционной системе, и, в соответствии с назначением и сутью программы,
предъявлять незначительные требования к аппаратным ресурсам Программа должна
иметь интуитивно понятный пользовательский графический интерфейс.
1.3 Функциональная
спецификация
Минимальные технические характеристики
компьютера, на котором гарантируется стабильная работа программы:
компьютер/процессор: компьютер с процессором
класса Pentium 4;
память: 512МБОЗУ;
монитор: монитор с разрешением 640x480 точек или
более;
операционная система: операционная система
WindowsXP, необходимо наличие Microsoft .NET FrameworkRuntime v4.0;
наличие свободного дискового пространства на
жёстком диске, которое определяется объёмомбазы данных.
Внешние функции:
добавление студентов в базу данных;
изменение данных о студенте;
удаление студентов;
перемещение студентов по комнатам;
очистка комнаты;
поиск в базе данных по различным критериям;
добавление комнат;
редактирование комнат;
просмотр студентов по комнатам;
программа должна выполнять все функции за
конечное количество времени;
Критические случаи:
отсутствие свободного места на жёстком диске при
сохранении базы данных журнала. Любая операция с файловой системой должна быть
отменена;
завершение работы Windows.
В этом случае программа должна завершить свою работу.
ПРОЕКТИРОВАНИЕ
2.1 Проектирование
архитектуры приложения
Данное программное средство можно разбить на
подсистемы, взаимодействующие друг с другом.
Рисунок 1 - Структура программы
Подсистема интерфейса реализует пользовательский
интерфейс программы. Отображение базы данных реализовано в табличном виде с
колонками №, Мест, Свободно и жильцы с возможностью сортировки данных и поиска
по заданному критерию.
Подсистема работы с базой предоставляет доступ к
управлению базой:
создание, удаление, изменение записей базы
данных;
предоставление данных
для других подсистем
Подсистема поиска реализует поиск
непосредственно в базе данных по заданному значению.
Подсистема экспорта реализует методы сохранения
данных из базы в распространенные форматы визуального представления данных.
2.2 Проектирование структуры
данных
Структура базы данных общежития
База данных представляет собой две таблицы, в
которых хранятся записи по студентам и комнатам.Такая структура базы данных
была как наиболее полно описывающая предметную область и ввиду её оптимальности
и удобства с точки зрения реализации программного продукта.
Описание полей.
Таблица 1- Информация о студенте
Поле
|
Тип
поля
|
Описание
поля
|
Name
|
строка
|
имя
|
Surname
|
строка
|
фамилия
|
Patrname
|
строка
|
Age
|
неотрицательное
целое число
|
возраст
|
Phone
|
строка
|
номер
телефона
|
Cource
|
неотрицательное
целое число
|
курс
|
Group
|
строка
|
группа
|
Room
|
неотрицательное
целое число
|
индекс
комнаты
|
Таблица 2 - Информация о комнатах
ПолеТип
поляОписание поля
|
|
|
Max
|
неотрицательное
целое число
|
число
мест
|
Students
|
List<int>
|
список
проживающих студентов
|
Таблицы связаны отношением один ко многим по
полям Students
из таблицы 2 и Room
из таблицы 1 соответственно.
База данных для общежития хранится в едином
файле .xaml в каталоге
программы. Файл имеет структуру стандарта XAML.
Схема файла базы данных с информацией о
студентах:
<Studentsxmlns="clr-namespace:Dormitory;assembly=Dormitory"><StudentName="Имя"
Surname="Фамилия"
Patrname="Отчество"
Age="Возраст"
Phone="Телефон"
Course="Курс" Group="Группа"
Room="Номер
комнаты" /></Students>
Пример записей файла базы данныхс информацией о
студентах:
<Students
xmlns="clr-namespace:Dormitory;assembly=Dormitory"><Student
Name="Василий"
Surname="Пупкин"
Patrname="Васильевич"
Age="18" Phone="2324543" Course="1"
Group="2" Room="0" /><Student Name="Пётр"
Surname="Петров"
Patrname="Петрович"
Age="18" Phone="2132457" Course="1"
Group="2" Room="0" /><Student Name="Кирилла"
Surname="Троекуров"
Patrname="Петрович"
Age="18" Phone="2366231" Course="1"
Group="3" Room="1" /><Student Name="Владимир"
Surname="Малинов"
Patrname="Фёдорович"
Age="18" Phone="2341222" Course="1"
Group="3" Room="1" /><Student Name="Фёдор"
Surname="Фёдоров"
Patrname="Фёдорович"
Age="20" Phone="2143144" Course="2"
Group="4" Room="2" /></Students>
Схема файла базы данных с информацией о
комнатах:
<RsTSxmlns="clr-namespace:Dormitory;assembly=Dormitory"><RTSMax="Числомест"
Students="Проживающие
студенты" /></RsTS>
Пример записей файла базы данныхс информацией о
комнатах:
<RsTSxmlns="clr-namespace:Dormitory;assembly=Dormitory"><RTS
Max="8" Students="0;1;" /><RTS Max="4"
Students="2;3;" /><RTS Max="4"
Students="4;" /><RTS Max="4" Students=""
/><RTS Max="4" Students="" /><RTS
Max="4" Students="" /><RTS Max="4"
Students="" /><RTS Max="4" Students=""
/><RTS Max="4" Students="" /><RTS
Max="4" Students="" /></RsTS>
Загрузка и сохранение файла производятся
стандартными средствами библиотеки .NET
.3 Проектирование пользовательского интерфейса
Главное окно содержит основные элементы
интерфейса и даёт доступ ко всем внешним функциям программы.
Рисунок 2- Главное окно программы
Главное окно содержит следующие элементы
управления:
главное меню программы;
панель поиска;
таблицу общежития с данными;
Окно добавления студента содержит поля для ввода
данных о нём и даёт возможность добавления студентов в базу данных.
Рисунок 3- Окно добавления записи
Окно просмотра комнат даёт возможность
просмотреть и изменить комнату и студентов, проживающих в ней.
Рисунок 3- Окно просмотра комнаты
ОПИСАНИЕ ПРОГРАММЫ
.1 Спецификация
классов и типы данных
Таблица 3 - Спецификация классов и типы данных
Тип
данных
|
Назначение
|
класс
Student
|
представляет
собой набор сведений остуденте
|
класс
Students
|
представляет
собой набор данных для хранения информации о студентах
|
класс
Room
|
представляет
собой набор сведений о комнате
|
класс
Rooms
|
представляет
собой набор данных для хранения информации о комнатах
|
класс
MainWindow
|
производный
класс от класса Window
.NET, определяет главное окно приложения
|
класс
StudentWindow
|
производный
класс от класса Window
.NET, определяет окно добавления или редактирования студента
|
класс
RoomWindow
|
производный
класс от класса Window
.NET, определяет окно просмотра или редактирования комнаты
|
3.2 Введенные основные
переменные и их назначение
Таблица 4 - Основные переменные и их назначения
Переменная
|
Назначение
|
rooms
|
Rooms
|
таблица
данных по комнатам
|
students
|
Students
|
таблица
данных по студентам
|
.3 Основные функции и
их блок схемы
Функции класса MainWindow.
MainWindow() - создание экземпляра класса
MainWindow;
wndMain_Loaded(object
sender, RoutedEventArgs e) - загрузканастроекпрограммыибазданных;
wndMain_Closing(object
sender, System.ComponentModel.CancelEventArgs e) -
сохранениенастроекпрограммыибазданных;
RefreshDataGrid(stringfilter)
- обновлениезаписей, выводимых на экран с возможностью применения фильтра;
ViewRoom_Click (objectsender,
RoutedEventArgse) -вызов окна просмотра комнаты
и сохранение изменений, если нужно;
AddStudent_Click (objectsender,
RoutedEventArgse) - добавлениестудентавбазуданных;
Рисунок 4 - АлгоритмViewRoom_Click
3.4 Алгоритм
взаимодействия
После старта программы создается экземпляр
класса MainWindow основного окна. Классы окон редактирования и добавления
записей создаются и вызываются из основного окна.
Также в экземпляре класса основного окна
создаются экземпляры классов,иRoomsдляобеспеченияработы программы.
. АТТЕСТАЦИЯ ПРОГРАММНОГО СРЕДСТВА
4.1 Руководство по
инсталляции программного средства
Специальной установки не требуется, установка
производится копированием в отдельный каталог программы.
4.2 Руководство
использования программного средства
Данная программа предназначена для учёта жильцов
студенческого общежития, в программе должны храниться следующие реквизиты: имя,
фамилия, отчество, номер телефона, возраст, курс и группа студента, а также,
список комнат с проживающими там студентами.
При старте программы при отсутствии базы данных
программа создаст её автоматически, в случае ее наличия данные загружаются и
видны в таблице основного окна.
Для добавления студента в главном меню выберете
пункт «Общежитие», в появившемся меню выберете «Добавить студента», или
нажажмите кнопку «Добавить» в окне просмотра комнаты.
Для просмотра или изменения комнаты установите
курсор на требуемую запись и сделайте двойной щелчок или в меню «Общежитие»
выберете пункт «Просмотр и изменение комнаты
Поля «Имя», «Фамилия», «Отчество» и «Комната»
обязательны к заполнению.
Для очистки комнаты установите курсор на
требуемую запись и нажмите Del или в меню «Общежитие» выберете пункт «Очистить
комнату».
База данных сохраняется автоматически при выходе
из программы.
4.3 Методика испытаний
Для тестирования программы производились
различные манипуляции с данными, искусственно создавались всевозможные
критические ситуации.
Программа не предполагает каких - либо
вычислений, обработки данных, а также по причине небольшого размера программы
разработка программы автоматического тестирования не требует.
Для выявления дефектов в программе/подтверждения
ее корректной работоспособности необходимо провести следующие тесты:
добавление новой записи в базу и проверка ее
правильного добавления в таблице интерфейса пользователя;
изменение записи в базе и проверка ее
правильного изменения в таблице интерфейса пользователя;
удаление записи в базе и проверка ее правильного
удаления в таблице интерфейса пользователя;
изменение записи в базе и проверка ее
правильного изменения в таблице интерфейса пользователя;
проверка правильности сохранения базы на диск в
файл и ее загрузка при старте программы;
проверка правильности функционирования программы
при различных критических ситуациях: отсутствии файла базы данных, поврежденном
файле базы данных.
4.4 Результаты
тестирования
Ниже представлены результаты выполнения
некоторых тестов программы.
. Проверка правильности функционирования
программы при различных критических ситуациях: отсутствии файла базы данных,
поврежденном файле базы данных:
файл базы данных повреждён
Рисунок 5 - Файл БД повреждён
. Проверка загрузки базы при старте программы,
добавление новой записи в базу и проверка ее правильного добавления в таблице
интерфейса пользователя
Рисунок 6 - Первоначальная загрузка базы при
старте программы
Рисунок 7 - Новая запись добавлена
. Проверка удаления записи в базе и проверка ее
правильного удаления в таблице интерфейса пользователя:
Рисунок 8 - Запись удалена
Запись удалена, тест пройден.
Проведенное тестирование показало, что
программный продукт отвечает всем заявленным требованиям и корректно реализует
необходимый функционал, корректно реагирует на действия пользователя.
ЗАКЛЮЧЕНИЕ
программный учет данные
пользовательский
В рамках курсовой работы была разработана
программа Общежитие. В процессе проектирования использовались методологии
модульного и объектно-ориентированного программирования.
Для разработки данной программы, необходимо
правильно спроектировать внутреннюю архитектуру программы и реализацию
необходимых классов с использованием современных методик
объектно-ориентированного подхода к проектированию. При разработке данного
программного средства применялся язык программирования С# и библиотека .NET,
как один из наиболее современных инструментов.
ПРИЛОЖЕНИЕА
System;.Collections.Generic;.Linq;.Text;.Windows;.Windows.Controls;.Windows.Data;.Windows.Documents;.Windows.Input;.Windows.Media;.Windows.Media.Imaging;.Windows.Navigation;.Windows.Shapes;System.IO;Dormitory
{
/// <summary>
/// Interaction logic for
MainWindow.xaml
/// </summary>partial class
MainWindow : Window
{Rooms rooms = new Rooms();Students
students = new Students();Settings settings = new Settings();()
{();
}void RefreshDataGrid(string filter)
{stud = "";(int j = 0; j
< rooms[i].Students.Count; j++)
{+=
students[rooms[i].Students[j]].Surname+"
"+students[rooms[i].Students[j]].Name+"
"+students[rooms[i].Students[j]].Patrname;(j <
rooms[i].Students.Count-1) stud+= ", ";stud += " ";
}(stud == "") stud =
"<НЕТ>";(filter
== "") itemsource.Add(new DGRoom((i + 1).ToString(),
rooms[i].Max.ToString(), (rooms[i].Max - rooms[i].Students.Count).ToString(),
stud, i));
{full = (i + 1).ToString() + "
" + rooms[i].Max.ToString() + " " + (rooms[i].Max -
rooms[i].Students.Count).ToString() + " " +
stud;(full.ToUpper().IndexOf(filter.ToUpper()) > -1) itemsource.Add(new
DGRoom((i + 1).ToString(), rooms[i].Max.ToString(), (rooms[i].Max - rooms[i].Students.Count).ToString(),
stud, i));
}
}
}string ExtractFileDir(string
FileName)
{res = "";index = -1;(int
i = FileName.Length - 1; i >= 0; i--)
{(FileName[i] == '\\')
{= i;;
}
}(index == -1) return res;(int i =
0; i <= index; i++)
{+= FileName[i].ToString();
}res;
}void AddRoom_Click(object sender,
RoutedEventArgs e)
{
//Добавитькомнаты=
new AddRoomsWindow(this);.ShowDialog();(wAddRooms.DialogResult == true)
{(int i = 0; i <wAddRooms.Number;
i++) rooms.Add(new Room(wAddRooms.Max));
}(textFind.Text);
}void textFind_TextChanged(object
sender, TextChangedEventArgs e)
{(textFind.Text);
}void AddStudent_Click(object
sender, RoutedEventArgs e)
{= new StudentWindow(this, rooms,
-1);.ShowDialog();(wAddStud.DialogResult == true)
{.Add(new Student(wAddStud.student.Name,
wAddStud.student.Surname, wAddStud.student.Patrname, wAddStud.student.Age,
wAddStud.student.Phone, wAddStud.student.Course, wAddStud.student.Group,
wAddStud.student.Room));[wAddStud.student.Room].Students.Add(students.Count -
1);
}(textFind.Text);
}void ViewRoom_Click(object sender,
RoutedEventArgs e)
{(dataGrid.SelectedIndex< 0)
return;= new RoomWindow(this, rooms, students, (dataGrid.SelectedItem as
DGRoom).ID);.ShowDialog();(wViewRoom.DialogResult == true)
{.Clear();.Clear();(Student s in
wViewRoom.students) students.Add(s);(Room r in wViewRoom.rooms)
rooms.Add(r);(textFind.Text);
}
}void Window_Loaded(object sender,
RoutedEventArgs e)
{;path =
ExtractFileDir(Application.ResourceAssembly.Location) +
"Data\\";(!Directory.Exists(path)) Directory.CreateDirectory(path);=
false;(File.Exists(path + "Settings.xaml"))
{
{= new FileStream(path +
"Settings.xaml", FileMode.Open, FileAccess.Read);=
System.Windows.Markup.XamlReader.Load(fs) as Settings;.Top = settings.t;.Left =
settings.l;.Height = settings.h;.Width = settings.w;.Columns[0].Width =
settings.w0;.Columns[1].Width = settings.w1;.Columns[2].Width =
settings.w2;.Columns[3].Width = settings.w3;
fs.Close();
}
{.Show("Не удалось загрузить настройки
приложения." + Environment.NewLine + "Будут применены настройки по
умолчанию", "Ошибка", MessageBoxButton.OK,
MessageBoxImage.Error);
}
}(File.Exists(path +
"Rooms.xaml"))
{
{= new RsTS();= new FileStream(path
+ "Rooms.xaml", FileMode.Open, FileAccess.Read);=
System.Windows.Markup.XamlReader.Load(fs) as RsTS;.Close();(RTS r in rs)
{.Add(new Room(r.Max));temp =
"";(int i = 0; i <r.Students.Length; i++)
{(r.Students[i] == ';')
{[rooms.Count -
1].Students.Add(Convert.ToInt32(temp));= "";
}temp += r.Students[i].ToString();
}
}
}
{.Show("Неудалосьзагрузитьбазуданныхкомнат.",
"Ошибка",
MessageBoxButton.OK, MessageBoxImage.Error);= true;
}
}= true;(File.Exists(path +
"Students.xaml"))
{
{= new FileStream(path +
"Students.xaml", FileMode.Open, FileAccess.Read);=
System.Windows.Markup.XamlReader.Load(fs) as Students;.Close();
}
{.Show("Неудалосьзагрузитьбазуданныхстудентов.",
"Ошибка",
MessageBoxButton.OK, MessageBoxImage.Error);= true;
}
}= true;(nodata)
{.Clear();.Clear();
}(textFind.Text);
}
void Window_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{;= new RsTS();.t = this.Top;.l =
this.Left;.h = this.Height;.w = this.Width;.w0 = dataGrid.Columns[0].Width;.w1
= dataGrid.Columns[1].Width;.w2 = dataGrid.Columns[2].Width;.w3 = dataGrid.Columns[3].Width;path
= ExtractFileDir(Application.ResourceAssembly.Location) +
"Data\\";(!Directory.Exists(path)) Directory.CreateDirectory(path);
(System.IO.File.Exists(path +
"Settings.xaml")) System.IO.File.Delete(path +
"Settings.xaml");= new FileStream(path + "Settings.xaml",
FileMode.CreateNew, FileAccess.Write);.Windows.Markup.XamlWriter.Save(settings,
fs);.Close();.Clear();(Room r in rooms)
{= "";(int i in
r.Students) st += i.ToString() + ";";.Add(new RTS(r.Max, st));
}(System.IO.File.Exists(path +
"Rooms.xaml")) System.IO.File.Delete(path + "Rooms.xaml");=
new FileStream(path + "Rooms.xaml", FileMode.CreateNew,
FileAccess.Write);.Windows.Markup.XamlWriter.Save(rs,
fs);.Close();(System.IO.File.Exists(path + "Students.xaml"))
System.IO.File.Delete(path + "Students.xaml");= new FileStream(path +
"Students.xaml", FileMode.CreateNew,
FileAccess.Write);.Windows.Markup.XamlWriter.Save(students, fs);.Close();
}void
dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{_Click(null, null);
}void ClearRoom_Click(object sender,
RoutedEventArgs e)
{(dataGrid.SelectedIndex< 0)
return;(MessageBox.Show("Выдействительнохотитеудалитьвсехстудентовизкомнаты
№" + (dataGrid.SelectedItem as DGRoom).Number + "?",
"", MessageBoxButton.YesNo, MessageBoxImage.Question) ==
MessageBoxResult.Yes)
{= (dataGrid.SelectedItem as
DGRoom).ID;(int j = 0; j < rooms[selind].Students.Count; j++)
{.RemoveAt(rooms[selind].Students[j]);(int
i = rooms[selind].Students[j]; i <students.Count; i++)
}
}[selind].Students.Clear();(textFind.Text);
}
}void dataGrid_PreviewKeyUp(object
sender, KeyEventArgs e)
{(e.Key == Key.Delete)
ClearRoom_Click(null, null);
}void Exit_Click(object sender,
RoutedEventArgs e)
{.Close();
}void About_Click(object sender,
RoutedEventArgs e)
{= new
AboutWindow(this);.ShowDialog();
}
}class Student
{Student(string name, string
surname, string patrname, int age, string phone, intcource, string group, int
room)
{= name;= surname;= patrname;= age;=
phone;= cource;= group;= room;
}Student()
{
}string Name { get; set; }string
Surname { get; set; }string Patrname { get; set; }Age { get; set; }string Phone
{ get; set; }Course { get; set; }string Group { get; set; }Room { get; set; }
}class Students :
System.Collections.ObjectModel.ObservableCollection<Student>
{
}class Room
{Room(int max)
{= max;= new List<int>();
}Room()
{
}Max { get; set; }List<int>
Students { get; set; }
}class Rooms :
System.Collections.ObjectModel.ObservableCollection<Room>
{
}class RTS
{RTS()
{
}RTS(int max, string sts)
{= max;= sts;
}Max { get; set; }string Students {
get; set; }
}class RsTS :
System.Collections.ObjectModel.ObservableCollection<RTS>
{
}class DGRoom
{(string N, string M, string F,
string S, int id)
{= N;= M;= F;= S;= id;
}()
{
}string Number { get; set; }string
Max { get; set; }string Free { get; set; }string Students { get; set; }ID {
get; set; }
}class DGRItems :
System.Collections.ObjectModel.ObservableCollection<DGRoom>
{
}class DGStudent
{()
{
}(string Full_name, string
Student_information, int id)
{= Full_name;= Student_information;=
id;
}string FullName { get; set; }string
StudentInfo { get; set; }ID { get; set; }
}class DGSItems :
System.Collections.ObjectModel.ObservableCollection<DGStudent>
{
}class Settings
{Settings()
{
}double t { get; set; }double l {
get; set; }double h { get; set; }double w { get; set; }w0 { get; set; }w1 {
get; set; }w2 { get; set; }w3 { get; set; }
}
}System;.Collections.Generic;.Linq;.Text;.Windows;.Windows.Controls;.Windows.Data;.Windows.Documents;.Windows.Input;.Windows.Media;.Windows.Media.Imaging;.Windows.Shapes;Dormitory
{
/// <summary>
/// Interaction logic for
StudentWindow.xaml
/// </summary>partial class
StudentWindow : Window
{rs = new Rooms();= false;(Window
owner, Student Stud, Rooms rooms)
{
//Режимредактирования();.Owner =
owner;.Icon = owner.Icon;= new Student(Stud.Name, Stud.Surname, Stud.Patrname,
Stud.Age, Stud.Phone, Stud.Course, Stud.Group, Stud.Room);.Title
= "Редактирование записи";
buttonOK.Content
= "Сохранить";
foreach (Room r in rooms)
rs.Add(r);.Text = student.Name;.Text = student.Surname;.Text =
student.Patrname;(student.Course == -1) textCourse.Text = "";.Text =
student.Course.ToString();.Text = student.Group;(student.Age == -1)
textAge.Text = "";.Text = student.Age.ToString();.Text =
student.Phone;.Text = (student.Room + 1).ToString();
}(Window owner, Rooms rooms,
intdefroom)
{
//Режимдобавленияновойзаписи();.Owner
= owner;.Icon = owner.Icon;= new Student();.Title
= "Добавитьстудента в базуданных";
buttonOK.Content =
"Добавить";(defroom != -1) textRoom.Text = (defroom +
1).ToString();(Room r in rooms) rs.Add(r);
}Student student { get; set; }void
buttonOK_Click(object sender, RoutedEventArgs e)
{.Show("Введитеимястудента.",
"Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;
}.Name =
textName.Text;(textSurname.Text == "")
{.Show("Введитефамилиюстудента.",
"Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;
}.Surname = textSurname.Text;(textPatrname.Text
== "")
{.Show("Введитеотчествостудента.",
"Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;
}.Patrname =
textPatrname.Text;(textCourse.Text != "")
{{ student.Course =
int.Parse(textCourse.Text); }
{.Show("Значение в поле
\"Курс\" должнобытьцелымположительнымчислом.",
"Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;
}(student.Course< 1)
{.Show("Значение в поле
\"Курс\" должнобытьбольшеилиравноединице.", "Ошибка",
MessageBoxButton.OK, MessageBoxImage.Error);;
}
}
{.Course = -1;
}.Group =
textGroup.Text;(textAge.Text != "")
{{ student.Age =
int.Parse(textAge.Text); }
{.Show("Значение в поле
\"Возраст\" должнобытьцелымнеотрицательнымчислом.",
"Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;
}(student.Age< 0)
{.Show("Значение в поле
\"Возраст\" должнобытьбольшеилиравнонулю.", "Ошибка",
MessageBoxButton.OK, MessageBoxImage.Error);;
}
}
{.Age = -1;
}.Phone =
textPhone.Text;(textRoom.Text == "")
{.Show("Введитеномеркомнаты, в
которуюзаселяетсястудент.", "Ошибка", MessageBoxButton.OK,
MessageBoxImage.Error);;
}{ student.Room =
int.Parse(textRoom.Text); }
{.Show("Номеркомнатыдолженбытьцелымположительнымчислом.",
"Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;
}(student.Room< 1)
{.Show("Значение в поле
\"Возраст\" должнобытьбольшеилиравноединице.",
"Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);;
}.Room -= 1;(rs[student.Room].Max ==
rs[student.Room].Students.Count)
{.Show("В комнате №" +
(student.Room + 1).ToString() + " нетмест, выберетедругую.", "Ошибка",
MessageBoxButton.OK, MessageBoxImage.Error);;
}= true;.Close();
}void buttonCancel_Click(object
sender, RoutedEventArgs e)
{= false;.Close();
}void Window_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{.DialogResult = dialogresut;
}
}
}System;.Collections.Generic;.Linq;.Text;.Windows;.Windows.Controls;.Windows.Data;.Windows.Documents;.Windows.Input;.Windows.Media;.Windows.Media.Imaging;.Windows.Shapes;Dormitory
{
/// <summary>
/// Interaction logic for
RoomWindow.xaml
/// </summary>partial class
RoomWindow : Window
{Students students { get; set;
}Rooms rooms { get; set; }= -1;= false;void RefreshDataGrid()
{= dataGrid.ItemsSource as
DGSItems;.Clear();(int i = 0; i < rooms[roomindex].Students.Count; i++)
{info =
"";(students[rooms[roomindex].Students[i]].Course != -1) info +=
" Курс " + students[rooms[roomindex].Students[i]].Course.ToString() +
".";(students[rooms[roomindex].Students[i]].Group != "")
info += " Группа " + students[rooms[roomindex].Students[i]].Group +
".";(students[rooms[roomindex].Students[i]].Age != -1) info += "
Возраст " + students[rooms[roomindex].Students[i]].Age.ToString() +
".";(students[rooms[roomindex].Students[i]].Phone != "")
info += " Телефон " + students[rooms[roomindex].Students[i]].Phone +
".";(info == "") info = "<НЕТ>";.Add(new
DGStudent(students[rooms[roomindex].Students[i]].Surname + " " +
students[rooms[roomindex].Students[i]].Name + " " +
students[rooms[roomindex].Students[i]].Patrname, info, i));.Content = ",
изнихсвободно: " + (rooms[roomindex].Max -
dataGrid.Items.Count).ToString();
}
}(Window owner, Rooms rs, Students
ss, introom_index)
{();.Owner = owner;.Icon =
owner.Icon;= new Students();= new Rooms();(Student s in ss)
students.Add(s);(Room r in rs) rooms.Add(r);= room_index;.Content =
"Комната №" + (roomindex + 1).ToString();.Text =
rooms[roomindex].Max.ToString();.Content = ", изнихсвободно: " +
(rooms[roomindex].Max - rooms[roomindex].Students.Count).ToString();();
}void buttonAddStudent_Click(object
sender, RoutedEventArgs e)
{(rooms[roomindex].Max ==
dataGrid.Items.Count)
{(MessageBox.Show("В
этойкомнатебольшенетмест, добавить?", "",
MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
{.Text = (rooms[roomindex].Max +
1).ToString();_Click(null, null);
}
}= new StudentWindow(this, rooms,
roomindex);.ShowDialog();(wAddStud.DialogResult == true)
{.Add(new
Student(wAddStud.student.Name, wAddStud.student.Surname,
wAddStud.student.Patrname, wAddStud.student.Age, wAddStud.student.Phone,
wAddStud.student.Course, wAddStud.student.Group,
wAddStud.student.Room));[wAddStud.student.Room].Students.Add(students.Count -
1);
}();
}void
buttonRemoveStudent_Click(object sender, RoutedEventArgs e)
{(dataGrid.SelectedIndex< 0)
return;(MessageBox.Show("Выдействительнохотитеудалитьвыбранногостудента?",
"", MessageBoxButton.YesNo, MessageBoxImage.Question) ==
MessageBoxResult.Yes)
{= (dataGrid.SelectedItem as
DGStudent).ID;=
rooms[roomindex].Students[selind];[students[studind].Room].Students.RemoveAt(selind);.RemoveAt(studind);(int
i = studind; i <students.Count; i++)
{[students[i].Room].Students.Remove(i
+ 1);[students[i].Room].Students.Add(i);
}();
}
}void buttonSave_Click(object
sender, RoutedEventArgs e)
{= true;.Close();
}void buttonClose_Click(object
sender, RoutedEventArgs e)
{= false;.Close();
}void Window_Closing(object sender,
System.ComponentModel.CancelEventArgs e)
{.DialogResult = dialogresult;
}
void buttonEditStudent_Click(object
sender, RoutedEventArgs e)
{(dataGrid.SelectedIndex< 0)
return;= (dataGrid.SelectedItem as DGStudent).ID;=
rooms[roomindex].Students[selind];= new StudentWindow(this, students[studind],
rooms);.ShowDialog();(wEditStud.DialogResult == true)
{[students[studind].Room].Students.RemoveAt(selind);[studind]
= new Student(wEditStud.student.Name, wEditStud.student.Surname,
wEditStud.student.Patrname, wEditStud.student.Age, wEditStud.student.Phone,
wEditStud.student.Course, wEditStud.student.Group,
wEditStud.student.Room);[students[studind].Room].Students.Add(studind);
}students[studind] = new
Student(wEditStud.student.Name, wEditStud.student.Surname,
wEditStud.student.Patrname, wEditStud.student.Age, wEditStud.student.Phone,
wEditStud.student.Course, wEditStud.student.Group, wEditStud.student.Room);
}();
}void
dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{_Click(null, null);
}void buttonApply_Click(object
sender, RoutedEventArgs e)
{(textMax.Text == "")
{.Text =
dataGrid.Items.Count.ToString();[roomindex].Max = dataGrid.Items.Count;
}
{
{c = int.Parse(textMax.Text);(c
<dataGrid.Items.Count)
{.Text =
dataGrid.Items.Count.ToString();[roomindex].Max = dataGrid.Items.Count;
}rooms[roomindex].Max = c;
}
{.Text =
rooms[roomindex].Max.ToString();
}
}.Content = ", изнихсвободно:
" + (rooms[roomindex].Max - dataGrid.Items.Count).ToString();
}void dataGrid_PreviewKeyUp(object
sender, KeyEventArgs e)
{(e.Key == Key.Delete)
buttonRemoveStudent_Click(null, null);
}
}
}