Программа "Общежитие"
Учета жильцов студенческого общежития. Требования к программному средству. Спецификация качества программного обеспечения. Проектирование архитектуры приложения и структуры данных, пользовательского интерфейса. Спецификация классов и типы данных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.08.2012 |
Размер файла | 664,4 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ
1. ВНЕШНЕЕ ОПИСАНИЕ
2. ПРОЕКТИРОВАНИЕ
3. ОПИСАНИЕ ПРОГРАММЫ
4. АТТЕСТАЦИЯ ПРОГРАММНОГО СРЕДСТВА
ЗАКЛЮЧЕНИЕ
СПИСОК ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЕ
Введение
В пояснительной записке рассматривается описание программы «Общежитие».
Данная программа предназначена для учёта жильцов студенческого общежития, в программе должны храниться следующие данные: имя, фамилия, отчество, номер телефона, возраст, курс и группа студента, а также, список комнат с проживающими там студентами. Программа должна иметь возможность поиска в базе данных по заданному критерию.
Пользователь может создавать, изменять и удалять записи в базе данных. Со стороны пользователя программа проста в использовании и имеет простой и интуитивно - понятный интерфейс.
В качестве основного инструмента разработки применяется MicrosoftVisualStudio 2010 и платформа .NET. Язык программирования C#.
1 ВНЕШНЕЕ ОПИСАНИЕ
1.1 Определение требований к программному средству
Программа должна поддерживать базу данных по общежитию, состоящую из двух таблиц. Первая включает следующие поля в одной записи: имя, фамилия, отчество, возраст, телефон, курс, группа и индекс комнаты. Вторая включает: число мест в комнате и список проживающих в ней студентов.Так же программа должна иметь возможность добавления, изменения, удаления записей.
Программа должна сохранять базу данных на жесткий диск с использованием стандартов представления информации.
1.2 Спецификация качества программного обеспечения
Функциональность: программа должна являться полностью завершенным программным продуктом, не требующим каких-либо дополнительных специальных компонентов.
Надёжность: программа должна быть автономной.
Эффективность: программа должна функционировать в операционной системе, и, в соответствии с назначением и сутью программы, предъявлять незначительные требования к аппаратным ресурсам Программа должна иметь интуитивно понятный пользовательский графический интерфейс.
1.3 Функциональная спецификация
Минимальные технические характеристики компьютера, на котором гарантируется стабильная работа программы:
- компьютер/процессор: компьютер с процессором класса Pentium 4;
- память: 512МБОЗУ;
- монитор: монитор с разрешением 640x480 точек или более;
- операционная система: операционная система 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<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
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
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
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 <rooms.Count; 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 <wAddRooms.Number; i++) rooms.Add(new Room(wAddRooms.Max));
}
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(r);
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 <r.Students.Length; 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 <students.Count; 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<Student>
{
}
public class Room
{
public Room(int max)
{
Max = max;
Students = new List<int>();
}
public Room()
{
}
publicint Max { get; set; }
public List<int> Students { get; set; }
}
public class Rooms : System.Collections.ObjectModel.ObservableCollection<Room>
{
}
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<RTS>
{
}
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<DGRoom>
{
}
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<DGStudent>
{
}
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
{
/// <summary>
/// Interaction logic for StudentWindow.xaml
/// </summary>
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(r);
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(r);
}
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
{
/// <summary>
/// Interaction logic for RoomWindow.xaml
/// </summary>
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(r);
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 <students.Count; 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 <dataGrid.Items.Count)
{
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);
}
}
}
Размещено на Allbest.ru
Подобные документы
Требования к программному средству. Спецификация качества программного обеспечения. Требования к эргономике и технической эстетики. Стадии и этапы разработки, порядок контроля и приемки. Проектирование архитектуры приложения, руководство пользователя.
курсовая работа [381,6 K], добавлен 20.06.2012Формирование входных и выходных данных, SQL–скрипт генерации таблиц базы данных. Создание интерфейса программного приложения и проектирование форм базы данных. Требования к аппаратно–программному обеспечению. Инструкции по установке и эксплуатации.
курсовая работа [1,6 M], добавлен 08.02.2013Этапы разработки технического задания. Спецификация программного обеспечения при структурном подходе. Дерево диаграмм, базовые понятия сетевой модели данных. Разработка пользовательского интерфейса. Разработка сценария диалога на основе экранных форм.
курсовая работа [2,0 M], добавлен 24.06.2012Требования к программному обеспечению, выбор методологии проектирования информационной системы учета и анализа деятельности руководящего аппарата. Проектирование пользовательского программного интерфейса, взаимодействие приложения с источниками данных.
дипломная работа [2,4 M], добавлен 12.01.2011Эксплуатация анализатора качества электроэнергии Satec PM175. Создание документов "Видение" и "Спецификация требований" для системы сбора данных с анализатора. Проектирование серверного и клиентского приложения в среде программного обеспечения LabVIEW.
курсовая работа [830,6 K], добавлен 25.09.2013Проектирование структуры и архитектуры программного продукта. Реализация программы конвертера файлов баз данных. Описание пользовательского интерфейса. Выбор порядка конвертации dbf файлов. Создание и исполнение шаблонов. Расчет себестоимости продукта.
дипломная работа [2,2 M], добавлен 21.06.2013Область применения и требования создаваемого Web-приложения. Требования к техническому и программному обеспечению. Разработка структуры Web-приложения и выбор средств программной реализации. Программная реализация Web-приложения. Структура базы данных.
дипломная работа [1,4 M], добавлен 03.06.2014Разработка базы данных с применением выбранной модели представления знаний и системы пользовательского интерфейса. Определение системы логического вывода. Спецификация составных частей программы. Обзор основных используемых приёмов и методов обработки.
курсовая работа [765,6 K], добавлен 12.05.2013Основание для разработки автоматизированной информационной системы "Будущий абитуриент". Технические требования к программному изделию. Порядок контроля и приемки продукта. Рассмотрение исходной базы данных. Описание интерфейса программного обеспечения.
дипломная работа [3,3 M], добавлен 08.02.2013Требования к функциональности сайта, информационному и программному обеспечению. Концептуальная модель данных. Затраты на разработку программного изделия. Описание пользовательского интерфейса главной страницы и разделов. Создание контрольного примера.
отчет по практике [1,2 M], добавлен 03.06.2015