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