Программа для учета книг домашней библиотеки

Разработка программно-оформленного каталога книг, содержащего перечень книг домашней библиотеки с необходимой информацией о них. Программа написана на языке объектно-ориентированного программирования Visual C# с использованием технологии Windows Forms.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 17.05.2023
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

Кафедра «Вычислительная техника»

Дисциплина «Программирование на языках высокого уровня»

Курсовая работа

на тему: «Программа для учета книг домашней библиотеки»

Выполнил: М.А. Гусева

студент гр. ЭВМд-21

Руководитель: А.Б. Шамшев

к.т.н., старший преподаватель

кафедры «Вычислительная техника»

Ульяновск

2011

Содержание

  • Введение
  • 1. Техническое задание
  • 2. Описание программы
  • 3. Требования к техническим и программным средствам
  • 4. Входные данные
  • 5. Выходные данные
  • 6. Проблемы отладки
  • 7. Использование программы GIT в процессе написания и отладки приложения
  • Заключение
  • Список использованных сокращений
  • Приложение

Введение

Данный курсовой проект представляет собой программно-оформленный каталог Здесь и далее: под каталогом понимается список книг с информацией о них книг, содержащий перечень книг домашней библиотеки с необходимой информацией о них.

Целью курсовой работы является закрепление и углубление теоретических знаний по дисциплине «Программирование на языках высокого уровня» и приобретение практических навыков при разработке приложений на языке Visual C#.

Основными задачами курсового проекта являются:

· Выбор, изучение конкретной проблемы (или предметной области), анализ возможных подходов и методов решения этой проблемы и обоснование выбранного подхода;

· Углубленное изучение языка программирования Visual C# и применение этих навыков на практике;

· Разработка приложения в конкретной предметной области;

· Анализ результатов работы приложения.

1. Техническое задание

Данный курсовой проект представляет собой каталог, содержащий перечень книг с необходимой информацией о них. Программа может применяться как в домашних условиях, так и в библиотеках после соответствующей доработки (добавление необходимых полей в информацию о книге, списка выданных на руки книг). Программа позволяет быстро найти необходимую книгу и соответствующую ей информацию.

Программа была разработана в качестве курсовой работы по дисциплине «Программирование на языках высокого уровня».

Назначение разработки

Программа, которую предоставляет данный курсовой проект, называется «Каталог книг». Назначениями являются:

· Наглядное предоставления полного списка книг домашней библиотеки;

· Быстрый поиск необходимой книги;

· Предоставление необходимой информации о ней.

2. Описание программы

программа учет домашняя библиотека

Общие сведения

В рамках курсового проекта мной была разработана программа «Каталог книг». Программа была написана на языке объектно-ориентированного программирования Visual C# с использованием технологии Windows Forms.

Основным элементом, с которым работает программа, является книга. У неё есть следующие параметры:

· уникальный идентификатор

· автор

· название

· жанр

· год выпуска

· издательство

· дополнительная информация

С помощью программы пользователь может:

· создавать новый список книг

· открывать существующий список из файла

· сохранять список в файл

· добавлять новую книгу в список

· редактировать книгу из списка

· удалять книгу из списка

· сортировать книги в списке по:

· автору

· названию

· жанру

· году выпуска

· издательству

· делать выборку по какому-либо параметру в отсортированном списке

· искать книгу в списке по:

· автору

· названию

Более наглядно возможности пользователя представлены на рисунке 1.

Рис.1 Диаграмма Use Case

Описание структуры программы

Программа состоит из 10 основных файлов:

· 4 файла - конструкторы формы (описание форм и работы с ними смотри ниже);

· 4 файла - коды, обрабатывающие действия, происходящие на соответствующих формах;

· 2 файла - описание структур BookInfo и Books (будут описаны ниже).

Автоматически создаются дополнительные файлы: точка входа

приложения, дизайнеру форм.

В папке с приложением так же находятся 4 иконки для соответствующих 4х форм.

Описание форм и работы с ними

В данной работе была использована технология MDI, что позволило разделить работу с формами и работу с их содержимым. Программа состоит из четырех форм: одной родительской и трёх дочерних.

В родительской форме (рисунок 2) осуществляется работа с каталогом.

Рис. 2 Родительская форма

При нажатии на элемент меню «Каталог» появляется подменю, в котором можно выбрать одно из трех действий: создать новый каталог, открыть уже существующий из файла и сохранить открытый каталог в файл.

Нажатие на элемент меню «Выход» вызывает событие закрытия формы.

При нажатии на элемент меню «Каталог/Новый» открывается окно «Новый каталог» (рисунок 3).

Как видно из рисунка, у этого окна есть собственное меню. Оно состоит из двух элементов: «Книга» и «Поиск».

С помощью элемента «Книга» можно осуществлять следующие действия:

· Добавление новой книги;

· Редактирование уже существующей книги;

· Удаление книги.

Рис. 3 Окно «Новый каталог»

По клику на элемент меню «Книга/Добавить» появляется следующее окно, представленное на рисунке 4.

В этом окне заполняются поля, содержащие информацию о книге. Обязательными являются поля «Название» и «Год издания». В поле «Год издания» вводится четырехзначное число в диапазоне от 1900 до 2011. При необходимости диапазон можно расширить или сузить, изменив соответствующие значения в коде программы. Поля «Автор», «Издательство» и «Жанр» являются полями типа ComboBox. Это необходимо для проверки корректности ввода. Если вводимый элемент не входит в коллекцию, программа спросит пользователя, уверен ли он в правильности введенного значения. При положительном ответе пользователя элемент автоматически добавляется в коллекцию.

Рис. 4 Окно «Новая книга»

В окне так же есть три кнопки:

1. «Добавить в каталог». При нажатии на неё книга с введенными параметрами добавляется в каталог, а форма очищается. Если введенные данные некорректны, показывается соответствующее сообщение.

2. «Перейти к каталогу». Осуществляется переход к окну, представленному на рисунке 3, без сохранения текущих данных.

3. «Сброс». Осуществляется очистка всех форм (без сохранения текущих данных).

Продолжим рассмотрение возможностей окна, представленного на рисунке 3. При добавлении книг в каталог мы можем воспользоваться такими функциями как:

· Просмотр полной информации о книге. Для этого достаточно кликнуть на ячейку с номером строки, в которой содержится частичная информация о ней.

· Сортировка списка. Производится по клику на кнопку «Сортировать». При список сортируется по различным параметрам в зависимости от того, какой из них был выбран при помощи элементов управления RadioButton, находящихся над кнопкой

· Редактирование и удаление книги из списка. Доступно после выбора книги кликом по номеру строки с её краткой информацией. Осуществляются при помощи элементов меню «Книга/Редактировать» и «Книга/Удалить». Для редактирования открывается та же форма, что и для добавления, только с уже заполненными ячейками (рисунок 5).

· При клике по кнопке «Сортировать» становится доступным так же дерево выборки, с помощью которого можно сгруппировать книги по определенному признаку и увидеть соответствующий результат в таблице (рисунок 6).

Рис. 5 Окно «Новая книга», открытое после нажатия на элемент меню «Книга/Редактировать»

Рис. 6 Окно «Новый каталог» с отсортированным по автору списком

В таблице отражена книга, написанная автором, чья фамилия начинается с буквы «Д» (в соответствии с параметром, выбранным в дереве выборки).

Как можно увидеть на рисунке 6, после сохранения каталога в файл в заголовке окна появляется имя файла, в который он был сохранен.

Еще одна, не рассмотренная нами, функция - это поиск книги. Открытие окна поиска осуществляется по нажатию на элемент меню «Поиск» в окне «Новый каталог» (рисунок 7).

Выбор параметра поиска осуществляется при помощи элемента управления ComboBox. Этих параметров два:

1. Автор

2. Название

Введение остальных параметров (год издания, издательство, жанр) было посчитано нецелесообразным, так как поиск по ним может быть осуществлен с помощью дерева выборки.

Объект поиска вводится в форму под элементом управления ComboBox. Поиск не является регистро-чувствительным.

Рис. 7 Окно «Поиск книги»

Управление поискам осуществляется с помощью двух кнопок:

1. «Искать». Осуществляется поиск в списке по введенному параметру. При этом если форма с объектом поиска не заполнена, пользователю покажется соответствующее сообщение.

2. «Перейти к каталогу». Осуществляется переход к окну, представленному на рисунке 6.

После нахождения книг по заданному параметру их список отобразится в таблице. Пользователь может посмотреть полную информацию о книге, выделив соответствующую ей строку, кликнув по ячейке с её номером. При этом полная информация отобразится снизу таблицы, а соответствующая книга будет выделена так же и в общем каталоге.

Описание некоторых функций, используемых в процессе работы программы

Основной единицей с которой работает программа является книга. Для её описания был создан класс BookInfo. Он нем реализованы три функции:

1. public BookInfo(int id_, string author_, string title_, int year_, string publisher_, string type_, string extraInfo_)

Конструктор. Принимает пять параметров типа string и два параметра типа int.

id_ - уникальный идентификатор книги

author_ - автор книги

title_ - название

year_ - год издания

publisher_ - издательство

type_ - жанр

extraInfo_ - дополнительная информация

2. public string getInfoString()

Возвращает строку, формирующуюся из всех данных о книге. Строка составляется следующим образом:

Название_параметра: его_значение

3. public string getStringForFile()

Возвращает строку, содержащую все данные о книге, сформированную для записи в файл следующим образом:

Значение_параметра + разделитель + Значение_следующего_параметра

При этом разделитель не должен содержатся ни в одном значении параметров, иначе возможно неверное прочтение из файла.

Для описания и работы со списком книг был написан класс Books. Он работает с массивом данных типа BookInfo. В данном случае для уменьшения объема кода используется стандартные класс List. Функции класса Books:

1. public Books()

Конструктор. Выделяет память по список List<BookInfo> books

2. private int findMaxId()

Возвращает максимальный из уникальных идентификаторов книг

3. public void addNewBook(string author, string title, int year, string

publisher, string type, string extraInfo)

Добавление в список новой книги с передаваемыми параметрами

author - автор книги

title - название

year - год издания

publisher - издательство

type - жанр

extraInfo - дополнительная информация

4. private int getIndex(itemBook item)

Получение индекса книги в списке. Принимает делегат itemBook

public delegate bool itemBook(BookInfo book);

5. public void removeBook(int id)

Удаление книги из списка по уникальному идентификатору, который передается в функцию в качестве параметра.

6. public void editBook(int id, string author, string title, int year, string

publisher, string type, string extraInfo)

Редактирование книги. Принимает семь параметров:

id - указывает по какому идентификатору следует изменять книгу

остальные 6 - передают новые параметры книги

7. public void clearCatal()

Очистка списка и присвоение ему значения null

8. public string getInfoString(int id)

Получение всех параметров книги в виде строки по передаваемому уникальному идентификатору

9. private string getStringForFile(int index)

Получение всех параметров книги по передаваемому индексу для записи в файл

10. public void getCatalFromString(string[] str)

Получение списка из массива строк. Указанный массив передается в качестве параметра

11. public string[] catalToStringArray()

Возвращает массив строк, сформированный из всех элементов списка для записи в файл

12. private void exchange(int index)

Перестановка местами двух соседних элементов списка.

index - индекс первого из переставляемых элементов

13. private void sort(compare delCompare)

Сортировка списка методом пузырька. В качестве параметра передается делегат типа bool

public delegate bool compare(BookInfo book1, BookInfo book2);

14. public void sortAuthor()

Сортировка списка по автору книги

15. public void sortTitle()

Сортировка списка по названию книги

16. public void sortType()

Сортировка списка по жанру книги

17. public void sortYear()

Сортировка списка по году выпуска книги

18. public void sortPublisher()

Сортировка списка по издательству

19. public List<BookInfo> getSearchList(itemBook book)

Поиск книги по определенному параметру. В качестве параметра передается делегат itemBook типа bool. Функция возвращает список найденных книг

20. public List<BookInfo> searchAuthor(string author)

Поиск книг по автору. Объект поиска передается в качестве параметра. Функция возвращает список книг, соответствующих переданному параметру

21. public List<BookInfo> searchTitle(string title)

Поиск книг по названию. Объект поиска передается в качестве параметра. Функция возвращает список книг, соответствующих переданному параметру

22. public List<BookInfo> sampleType(string type)

Возвращает список книг, жанр которых соответствует переданному в параметрах

23. public List<BookInfo> sampleYear(string year)

Возвращает список книг, год издания которых соответствует переданному в параметрах

24. public List<BookInfo> samplePublisher(string publisher)

Возвращает список книг, издательство которых соответствует переданному в параметрах

25. public List<BookInfo> sampleAuthor(string firstChar)

Возвращает список книг, у которых автор начинается с буквы, переданной в параметрах

26. public List<BookInfo> sampleTitle(string firstChar)

Возвращает список книг, у которых название начинается с буквы, переданной в параметрах

3. Требования к техническим и программным средствам

Для запуска данного программного продукта на компьютере необходим следующий минимальный набор технических средств:

· ОС: Microsoft Windows XP (Home, Professional) / Vista / 7

· Установленный фреймворк: .NET Framework 4

· Процессор: 1 ГГц

· ОЗУ: 512 МБ

· Место на диске (для .NET Framework 4):

§ 600-850 МБ (32х разрядный процессор)

§ 1,5-2 ГБ (64х разрядный процессор)

· Место на диске (для программы и файлов с каталогами): ~160 КБ

· манипулятор типа «мышь»

· клавиатура и монитор

4. Входные данные

Входные данные не являются обязательными.

Требования к входным данным, создаваемым вне этого приложения:

- тип файла: .txt

- содержание файла: набор строк типа

АвторРазделительНазваниеРазделительГод_ИзданияРазделитель

ИздательствоРазделительЖанрРазделитель

Дополнительная_Информация

Вместо Разделитель подставляется символ, используемый в качестве разделителя в данной версии программы (например, символ «|»)

5. Выходные данные

Выходные данные не являются обязательными.

Выходные данные представляют собой:

- тип файла: .txt

- содержание файла: набор строк типа

АвторРазделительНазваниеРазделительГод_ИзданияРазделитель

ИздательствоРазделительЖанрРазделитель

Дополнительная_Информация

Вместо Разделитель подставляется символ, используемый в качестве

разделителя в данной версии программы (например, символ «|»)

6. Проблемы отладки

В процессе отладки программы возникали следующие проблемы:

· Появление лишних строк в таблице после добавления нового элемента

· Открытие множественных окон

· Контроль открытия и закрытия окон

· Удаление книги при редактировании без сохранения

7. Использование программы GIT в процессе написания и отладки приложения

Git -- распределённая система управления версиями файлов. В данном проекте использована для сохранения внесенных в код программы изменений. Были сделаны следующие коммиты:

· Создание формы для добавления новой книги в каталог Создание класса Booklnfo

· Класс Books

· Действия в главной форме, частично действия в дочерних

· Привязка элементов списка к dataGridView

· Добавление событий форм CatalogView и AddNewBook

· Отладка процесса добавления в список

· Добавление событий в форме поиска

· Редактирование сортировки, введение treeView

· Корректировка 1

Заключение

Курсовой проект «Каталог книг» был написан на языке программирования Visual C# и платформе .Net Framework 4. Этот язык по сравнению с другими традиционными языками позволяет нам увидеть уже при создании программы, как будет выглядеть программа в действии. Visual C# включает в себя множество полезных инструментов, которые облегчают труд программиста. Это проекты, формы, объекты, шаблоны, управляющие элементы, настройки. Срок разработки готового приложения сокращается от многих месяцев до недель и даже дней - это значительный выигрыш по сравнению с другими языками программирования.

С помощью курсового проекта я закрепила теоретические знания по дисциплине «Программирование на языках высокого уровня» и приобрела практически навыки при разработки приложений на Visual C#.

В дальнейшем курсовой проект можно расширять и модифицировать. Например, можно добавить новые поля в информацию о книги для использования её не только дома, но и в библиотеках.

Данных курсовой проект помог мне в приобретении навыков при составлении программной и эксплуатационной документации программного продукта. В дальнейшем я могу использовать полученные знания для составления документации при разработке дальнейших проектов.

Список использованных сокращений

MDI - multiple document interface (тип графического интерфейса)

ОС - операционная система

ОЗУ - оперативное запоминающее устройство

Приложение 1

Исходный код программы:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace CourseProject {

public class BookInfo {

public int id { get; set; }

public string author { get; set; }

public string title { get; set; }

public int year { get; set; }

public string publisher { get; set; }

public string type { get; set; }

public string extraInfo { get; set; }

public BookInfo(int id_, string author_, string title_, int year_, string publisher_, string type_, string extraInfo_) {

id = id_;

author = author_;

title = title_;

year = year_;

publisher = publisher_;

type = type_;

extraInfo = extraInfo_;

}

/// <summary>

/// Получение информации о книге в виде строки

/// </summary>

public string getInfoString() {

return "Автор: " + author + "\nНазвание: " + title + "\nГод издания: " + year + "\nИздательство:" + publisher + "\nЖанр: " + type + "\nДополнительная информация: " + extraInfo;

}

public const string separator = "|";

/// <summary>

/// Получение информации о книги в виде стори с разделителями для записи в файл

/// </summary>

public string getStringForFile() {

return author + separator + title + separator + year + separator + publisher + separator + type + separator + extraInfo;

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace CourseProject {

public class Books {

public List<BookInfo> books;

public Books() {

books = new List<BookInfo>();

}

/// <summary>

/// Поиск максимального Id

/// </summary>

private int findMaxId() {

try {

return books.Max(p => p.id);

} catch {

return 0;

}

}

/// <summary>

/// Добавление новой книги

/// </summary>

public void addNewBook(string author, string title, int year, string publisher, string type, string extraInfo) {

int newId = findMaxId() + 1;

BookInfo newBook = new BookInfo(newId, author, title, year, publisher, type, extraInfo);

if (books == null) {

books = new List<BookInfo>();

}

books.Add(newBook);

}

/// <summary>

/// Получение индекса книги в списке по Id

/// </summary>

private int getIndex(itemBook item) {

for (int i = 0; i < books.Count; i++) {

if (item(books[i])) {

return i;

}

}

return -1;

}

/// <summary>

/// Удаление книги из списка по Id

/// </summary>

public void removeBook(int id) {

int index = getIndex(p => p.id == id);

books.RemoveAt(index);

}

/// <summary>

/// Редактирование книги

/// </summary>

public void editBook(int id, string author, string title, int year, string publisher, string type, string extraInfo) {

BookInfo editedBook = new BookInfo(id, author, title, year, publisher, type, extraInfo);

removeBook(id);

books.Add(editedBook);

}

/// <summary>

/// Очистка списка

/// </summary>

public void clearCatal() {

books.Clear();

books = null;

}

/// <summary>

/// Получение всех параметров книги в виде строки

/// </summary>

public string getInfoString(int id) {

int index = getIndex(p => p.id == id);

return books[index].getInfoString();

}

/// <summary>

/// Получение всех параметров книги в виде строки для записи в файл

/// </summary>

private string getStringForFile(int index) {

return books[index].getStringForFile();

}

/// <summary>

/// Получение списка из массива строк

/// </summary>

public void getCatalFromString(string[] str) {

clearCatal();

for (int i = 0; i < str.Length; i++) {

string[] tempStr = str[i].Split(BookInfo.separator[0]);

try {

addNewBook(tempStr[0], tempStr[1], Int32.Parse(tempStr[2]), tempStr[3], tempStr[4], tempStr[5]);

} catch {

MessageBox.Show("Cтрока с номером " + i + " в файле имеет неверный формат");

}

}

}

/// <summary>

/// Запись каталога в массив строк

/// </summary>

public string[] catalToStringArray() {

string[] str = new string[books.Count];

for (int i = 0; i < books.Count; i++) {

str[i] = books[i].getStringForFile();

}

return str;

}

/// <summary>

/// Перестановка двух соседних элементов списка

/// </summary>

private void exchange(int index) {

BookInfo temp = books[index];

books[index] = books[index + 1];

books[index + 1] = temp;

}

/// <summary>

/// Универсальная сортировка

/// </summary>

private void sort(compare delCompare) {

bool wasChanged = true;

while (wasChanged) {

wasChanged = false;

for (int i = 0; i < books.Count - 1; i++) {

if (delCompare(books[i], books[i + 1])) {

exchange(i);

wasChanged = true;

}

}

}

}

/// <summary>

/// Сортировка по автору

/// </summary>

public void sortAuthor() {

sort((book1, book2) => String.Compare(book1.author, book2.author) > 0);

}

/// <summary>

/// Сортировка по названию

/// </summary>

public void sortTitle() {

sort((book1, book2) => String.Compare(book1.title, book2.title) > 0);

}

/// <summary>

/// Сортировка по жанру

/// </summary>

public void sortType() {

sort((book1, book2) => String.Compare(book1.type, book2.type) > 0);

}

/// <summary>

/// Сортировка по году выпуска

/// </summary>

public void sortYear() {

sort((book1, book2) => book1.year > book2.year);

}

/// <summary>

/// Сортировка по издательству

/// </summary>

public void sortPublisher() {

sort((book1, book2) => String.Compare(book1.publisher, book2.publisher) > 0);

}

/// <summary>

/// Универсальный поиск

/// </summary>

public List<BookInfo> getSearchList(itemBook book) {

List<BookInfo> searchList = new List<BookInfo>();

for (int i = 0; i < books.Count; i++) {

if (book(books[i])) {

searchList.Add(books[i]);

}

}

return searchList;

}

/// <summary>

/// Поиск по автору

/// </summary>

public List<BookInfo> searchAuthor(string author) {

return getSearchList(book => book.author.ToLower().Contains(author.ToLower()));

}

/// <summary>

/// Поиск по названию

/// </summary>

public List<BookInfo> searchTitle(string title) {

return getSearchList(book => book.title.ToLower().Contains(title.ToLower()));

}

/// <summary>

/// Выборка по жанру

/// </summary>

public List<BookInfo> sampleType(string type) {

return getSearchList(book => book.type.ToLower() == type.ToLower());

}

/// <summary>

/// Выборка по году выпуска

/// </summary>

public List<BookInfo> sampleYear(string year) {

return getSearchList(book => book.year.ToString() == year);

}

/// <summary>

/// Выборка по издательству

/// </summary>

public List<BookInfo> samplePublisher(string publisher) {

return getSearchList(book => book.publisher.ToLower() == publisher.ToLower());

}

/// <summary>

/// Выборка авторов по первой букве

/// </summary>

public List<BookInfo> sampleAuthor(string firstChar) {

return getSearchList(book => book.author.First<char>().ToString().ToUpper() == firstChar.ToUpper());

}

/// <summary>

/// Выборка названий по первой букве

/// </summary>

public List<BookInfo> sampleTitle(string firstChar) {

return getSearchList(book => book.title.First<char>().ToString().ToUpper() == firstChar.ToUpper());

}

public delegate bool itemBook(BookInfo book);

public delegate bool compare(BookInfo book1, BookInfo book2);

}

}

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

namespace CourseProject {

public partial class BookCatalog : Form {

public BookCatalog() {

InitializeComponent();

}

public static Books catalog;

/// <summary>

/// Очистка старого и создание нового каталога

/// </summary>

private void clearCatal() {

if (catalog != null) {

catalogViewForm.Close();

catalogViewForm = null;

if (catalog.books == null) {

return;

}

catalog.clearCatal();

}

}

/// <summary>

/// Запрос на создание нового каталога при уже открытом старом

/// </summary>

private void openedCatalDialog(object sender, EventArgs e, string messagePart) {

var dialogResult = MessageBox.Show("У вас есть открытый каталог\nВы хотите сохранить его и " + messagePart + "?", "Новый каталог", MessageBoxButtons.YesNoCancel);

if (dialogResult == DialogResult.Yes) {

saveCatalToolStripMenuItem2_Click(sender, e);

clearCatal();

newCatalToolStripMenuItem_Click(sender, e);

}

if (dialogResult == DialogResult.No) {

clearCatal();

newCatalToolStripMenuItem_Click(sender, e);

}

if (dialogResult == DialogResult.Cancel) {

catalogViewForm.Activate();

}

}

/// <summary>

/// Создание новой формы отображения каталога

/// </summary>

private void newCatalForm() {

if (catalogViewForm == null) {

catalogViewForm = new CatalogView();

catalogViewForm.MdiParent = this;

catalogViewForm.Show();

catalogViewForm.Text = "Новый каталог";

} else {

catalogViewForm.Activate();

}

catalog = new Books();

}

public static CatalogView catalogViewForm;

/// <summary>

/// Вызов событий ко клику на элемент меню "Каталог/Добавить"

/// </summary>

private void newCatalToolStripMenuItem_Click(object sender, EventArgs e) {

if (catalog != null) {

if (catalog.books != null) {

openedCatalDialog(sender, e, "создать новый");

return;

}

}

newCatalForm();

catalogViewForm.updateTable(catalog, catalogViewForm.catalTable, catalogViewForm.bookInfoLabel);

}

/// <summary>

/// Открытие файла и запись его содержимого в каталог

/// </summary>

private void openCatal() {

if (openFileDialog1.ShowDialog() != DialogResult.OK) {

return;

}

newCatalForm();

catalogViewForm.Text = Path.GetFileNameWithoutExtension(openFileDialog1.FileName);

string[] str = File.ReadAllLines(openFileDialog1.FileName);

catalog.getCatalFromString(str);

catalogViewForm.updateTable(catalog, catalogViewForm.catalTable, catalogViewForm.bookInfoLabel);

}

public static AddNewBook addNewBookForm;

/// <summary>

/// Открытие формы для добавления новой книги

/// </summary>

public static void openAddBookForm() {

addNewBookForm = new AddNewBook();

addNewBookForm.MdiParent = catalogViewForm.MdiParent;

addNewBookForm.Show();

}

public static SearchBook searchBookForm;

/// <summary>

/// Открытие формы для поиска книги

/// </summary>

public static void openSearchBookForm() {

searchBookForm = new SearchBook();

searchBookForm.MdiParent = catalogViewForm.MdiParent;

searchBookForm.Show();

}

/// <summary>

/// Вызов событий ко клику на элемент меню "Каталог/Открыть"

/// </summary>

private void openCatalToolStripMenuItem_Click(object sender, EventArgs e) {

if (catalogViewForm != null) {

openedCatalDialog(sender, e, "открыть другой");

}

openCatal();

}

/// <summary>

/// Вызов событий ко клику на элемент меню "Каталог/Сохранить"

/// </summary>

private void saveCatalToolStripMenuItem2_Click(object sender, EventArgs e) {

if (catalog == null) {

MessageBox.Show("Нет данных для сохранения");

return;

}

if (saveFileDialog1.ShowDialog() != DialogResult.OK) {

return;

}

catalogViewForm.Text = Path.GetFileNameWithoutExtension(saveFileDialog1.FileName);

File.WriteAllLines(saveFileDialog1.FileName, catalog.catalToStringArray());

}

/// <summary>

/// Вызов событий ко клику на элемент меню "Выход"

/// </summary>

private void exitToolStripMenuItem_Click(object sender, EventArgs e) {

if (catalog != null) {

if (MessageBox.Show("Вы уверены, что хотите выйти?\nМогут быть утеряны несохраненные данные", "Выход из программы", MessageBoxButtons.YesNo) == DialogResult.No) {

return;

}

}

Close();

}

}

}

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace CourseProject {

public partial class CatalogView : Form {

public CatalogView() {

InitializeComponent();

}

/// <summary>

/// Запись в таблицу table записей из списка list

/// </summary>

public void updateTable(Books list, DataGridView table, Label info) {

if (list == null) {

return;

}

if (list.books == null) {

return;

}

for (int i = 0; i < list.books.Count; i++) {

if (i > table.RowCount - 1) {

table.RowCount++;

}

table.Rows[i].HeaderCell.Value = (i + 1).ToString();

table["idCol", i].Value = list.books[i].id;

table["authorCol", i].Value = list.books[i].author;

table["titleCol", i].Value = list.books[i].title;

table["yearCol", i].Value = list.books[i].year;

table["publisherCol", i].Value = list.books[i].publisher;

table["typeCol", i].Value = list.books[i].type;

table["infoCol", i].Value = list.books[i].extraInfo;

}

if (table.RowCount > list.books.Count) {

table.RowCount -= table.RowCount - list.books.Count;

}

info.Text = "";

}

/// <summary>

/// Событие по клику на элемент меню "Книга/Добавить"

/// </summary>

private void addBookToolStripMenuItem_Click(object sender, EventArgs e) {

if (BookCatalog.addNewBookForm == null) {

BookCatalog.openAddBookForm();

} else {

BookCatalog.addNewBookForm.Activate();

}

}

public static string author = "";

public static string title = "";

public static string year = "";

public static string publisher = "";

public static string type = "";

public static string extraInfo = "";

private int curId;

private int curIndex = -1;

/// <summary>

/// Событие по клику на заголовок строки таблицы

/// </summary>

private void catalTable_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {

try {

editBookToolStripMenuItem.Enabled = true;

removeBookToolStripMenuItem.Enabled = true;

curIndex = catalTable.CurrentRow.Index;

curId = Int32.Parse(catalTable["idCol", curIndex].Value.ToString());

bookInfoLabel.Text = BookCatalog.catalog.getInfoString(curId);

} catch {

return;

}

}

/// <summary>

/// Событие по клику на элемент меню "Книга/Редактировать"

/// </summary>

private void editBookToolStripMenuItem_Click(object sender, EventArgs e) {

if (curIndex > -1) {

author = catalTable["authorCol", curIndex].Value.ToString();

title = catalTable["titleCol", curIndex].Value.ToString();

year = catalTable["yearCol", curIndex].Value.ToString();

publisher = catalTable["publisherCol", curIndex].Value.ToString();

type = catalTable["typeCol", curIndex].Value.ToString();

extraInfo = catalTable["infoCol", curIndex].Value.ToString();

addBookToolStripMenuItem_Click(sender, e);

if (BookCatalog.addNewBookForm.isAdded) {

removeBookToolStripMenuItem_Click(sender, e);

}

}

}

/// <summary>

/// Событие по клику на элемент меню "Книга/Удалить"

/// </summary>

private void removeBookToolStripMenuItem_Click(object sender, EventArgs e) {

if (curIndex > -1) {

curId = Int32.Parse(catalTable["idCol", curIndex].Value.ToString());

BookCatalog.catalog.removeBook(curId);

updateTable(BookCatalog.catalog, catalTable, bookInfoLabel);

}

}

/// <summary>

/// Событие по клику на элемент меню "Поиск"

/// </summary>

private void searchToolStripMenuItem_Click(object sender, EventArgs e) {

if (BookCatalog.catalog == null) {

MessageBox.Show("Список пуст");

return;

}

if (BookCatalog.catalog.books == null) {

MessageBox.Show("Список пуст");

return;

}

if (BookCatalog.searchBookForm == null) {

BookCatalog.openSearchBookForm();

} else {

BookCatalog.searchBookForm.Activate();

}

}

/// <summary>

/// Установление видимости столбцов таблицы

/// </summary>

private void colVisibility(DataGridViewTextBoxColumn visCol, DataGridViewTextBoxColumn unvisCol1, DataGridViewTextBoxColumn unvisCol2) {

visCol.Visible = true;

unvisCol1.Visible = false;

unvisCol2.Visible = false;

}

/// <summary>

/// Добавление нового узла в дерево

/// </summary>

private void createTreeNode(string node) {

if (!sortTreeView.Nodes[0].Nodes.ContainsKey(node)) {

sortTreeView.Nodes[0].Nodes.Add(node, node);

}

}

private const string authorNodeName = "Авторы:";

private const string titleNodeName = "Названия:";

private const string typeNodeName = "Жанры:";

private const string publisherNodeName = "Издательства:";

private const string yearNodeName = "Года издания:";

/// <summary>

/// Событие по клику на кнопку "Сортировать"

/// </summary>

private void sortButton_Click(object sender, EventArgs e) {

if (authorRadioButton.Checked) {

univSort(book => book.sortTitle(), book => book.sortAuthor(), book => book.author.First<char>().ToString().ToUpper(), typeCol, yearCol, publisherCol, authorNodeName);

}

if (titleRadioButton.Checked) {

univSort(book => book.sortAuthor(), book => book.sortTitle(), book => book.title.First<char>().ToString().ToUpper(), typeCol, yearCol, publisherCol, titleNodeName);

}

if (typeRadioButton.Checked) {

univSort(book => book.sortAuthor(), book => book.sortType(), book => book.type.ToLower(), typeCol, yearCol, publisherCol, typeNodeName);

}

if (yearRadioButton.Checked) {

univSort(book => book.sortAuthor(), book => book.sortYear(), book => book.year.ToString(), yearCol, typeCol, publisherCol, yearNodeName);

}

if (publisherRadioButton.Checked) {

univSort(book => book.sortAuthor(), book => book.sortPublisher(), book => book.publisher.ToLower(), publisherCol, typeCol, yearCol, publisherNodeName);

}

}

private delegate void sort(Books list);

private delegate string treeNodeItem(BookInfo book);

/// <summary>

/// Сортировка и обновление дерева выборки

/// </summary>

private void univSort(sort del1, sort del2, treeNodeItem item, DataGridViewTextBoxColumn visCol, DataGridViewTextBoxColumn unvisCol1, DataGridViewTextBoxColumn unvisCol2, string treeNodeName) {

del1(BookCatalog.catalog);

del2(BookCatalog.catalog);

updateTable(BookCatalog.catalog, catalTable, bookInfoLabel);

colVisibility(visCol, unvisCol1, unvisCol2);

sortTreeView.Nodes.Clear();

sortTreeView.Nodes.Add(treeNodeName);

for (int i = 0; i < BookCatalog.catalog.books.Count; i++) {

createTreeNode(item(BookCatalog.catalog.books[i]));

}

}

/// <summary>

/// Событие по активации формы

/// </summary>

private void CatalogView_Enter(object sender, EventArgs e) {

if (curIndex < 0) {

editBookToolStripMenuItem.Enabled = false;

removeBookToolStripMenuItem.Enabled = false;

}

updateTable(BookCatalog.catalog, catalTable, bookInfoLabel);

}

/// <summary>

/// Выборка по клику на дочернем элементе дерева выборки

/// </summary>

private void childNodeSort(string parentNodeText) {

switch (parentNodeText) {

case authorNodeName:

sampleToTable(BookCatalog.catalog.sampleAuthor(sortTreeView.SelectedNode.Text));

break;

case titleNodeName:

sampleToTable(BookCatalog.catalog.sampleTitle(sortTreeView.SelectedNode.Text));

break;

case typeNodeName:

sampleToTable(BookCatalog.catalog.sampleType(sortTreeView.SelectedNode.Text));

break;

case yearNodeName:

sampleToTable(BookCatalog.catalog.sampleYear(sortTreeView.SelectedNode.Text));

break;

case publisherNodeName:

sampleToTable(BookCatalog.catalog.samplePublisher(sortTreeView.SelectedNode.Text));

break;

}

}

/// <summary>

/// Занесение в таблицу результатов выборки

/// </summary>

private void sampleToTable(List<BookInfo> sample) {

Books res = new Books();

res.books = sample;

updateTable(res, catalTable, bookInfoLabel);

}

/// <summary>

/// Событие по клику на узле дерева выборки

/// </summary>

private void sortTreeView_AfterSelect(object sender, TreeViewEventArgs e) {

if (sortTreeView.SelectedNode == null) {

return;

}

if (sortTreeView.SelectedNode.Parent == null) {

sortButton_Click(sender, e);

return;

}

childNodeSort(sortTreeView.SelectedNode.Parent.Text);

}

}

}

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace CourseProject {

public partial class AddNewBook : Form {

public AddNewBook() {

InitializeComponent();

}

/// <summary>

/// Добавление нового элемента в коллекцию ComboBox

/// </summary>

private void addItemToComboBox(ComboBox tempComboBox, string item) {

if (!tempComboBox.Items.Contains(item)) {

tempComboBox.Items.Add(item);

}

}

/// <summary>

/// Проверка на вхождение элемента в коллекцию ComboBox и возврат введенного в ComboBox текста

/// </summary>

private string comboItemChek(ComboBox tempComboBox, string messagePart) {

string str = tempComboBox.Text;

if (str == "") {

return "-";

}

if (!tempComboBox.Items.Contains(str)) {

if (!messageComboBox(messagePart, tempComboBox, str)) {

return "";

}

}

return str;

}

/// <summary>

/// Сообщение, выдаваемое, если элемент не содержится в ComboBox

/// </summary>

private bool messageComboBox(string messagePart, ComboBox tempComboBox, string item) {

var dialogResult = MessageBox.Show(messagePart + "\nВы уверены, что хотите добавить?", "Добавление книги", MessageBoxButtons.YesNo);

if (dialogResult == DialogResult.Yes) {

tempComboBox.Items.Add(item);

return true;

}

return false;

}

/// <summary>

/// Проверка на вхождение в веденный текст разделителя

/// </summary>

private bool isContainSeparator(string str) {

return str.Contains(BookInfo.separator[0]);

}

public bool isAdded = false;

/// <summary>

/// Событие по клику на кнопку "Добавить новую книгу"

/// </summary>

private void addBookButton_Click(object sender, EventArgs e) {

isAdded = false;

errorLabel.Text = "";

string title = titleTextBox.Text;

if ((title == "") || (yearTextBox.Text == "")) {

errorLabel.Text = "Заполнены не все обязательные поля (*)";

return;

}

int year = 0;

if (!Int32.TryParse(yearTextBox.Text, out year) || (year > 2011) || (year < 1900)) {

errorLabel.Text = "Год издания введен некорректно";

return;

}

string author = comboItemChek(authorComboBox, "Данного автора нет в списке");

string publisher = comboItemChek(publisherComboBox, "Данного издательства нет в списке");

string type = comboItemChek(typeComboBox, "Данного жанра нет в списке");

if ((author == "") || (publisher == "") || (type == "")) {

return;

}

string extraInfo = infoTextBox.Text;

if (extraInfo == "") {

extraInfo = "-";

}

if (isContainSeparator(title) || isContainSeparator(author) || isContainSeparator(publisher) || isContainSeparator(type) || isContainSeparator(extraInfo)) {

errorLabel.Text = "Одно из полей содержит недопустимый символ - \"" + BookInfo.separator + "\"";

return;

}

BookCatalog.catalog.addNewBook(author, title, year, publisher, type, extraInfo);

MessageBox.Show("Книга добавлена");

clearFieldButton_Click(sender, e);

isAdded = true;

}

/// <summary>

/// Событие по клику на кнопку "Перейти к каталогу"

/// </summary>

private void toCatalButton_Click(object sender, EventArgs e) {

BookCatalog.catalogViewForm.Activate();

clearFieldButton_Click(sender, e);

}

/// <summary>

/// Событие по клику на кнопку "Сброс"

/// </summary>

private void clearFieldButton_Click(object sender, EventArgs e) {

authorComboBox.Text = "";

titleTextBox.Text = "";

publisherComboBox.Text = "";

yearTextBox.Text = "";

typeComboBox.Text = "";

infoTextBox.Text = "";

}

/// <summary>

/// Событие по активации формы

/// </summary>

private void AddNewBook_Enter(object sender, EventArgs e) {

authorComboBox.Text = CatalogView.author;

titleTextBox.Text = CatalogView.title;

yearTextBox.Text = CatalogView.year;

publisherComboBox.Text = CatalogView.publisher;

typeComboBox.Text = CatalogView.type;

infoTextBox.Text = CatalogView.extraInfo;

var list = BookCatalog.catalog.books;

for (int i = 0; i < list.Count; i++) {

addItemToComboBox(authorComboBox, list[i].author);

addItemToComboBox(publisherComboBox, list[i].publisher);

addItemToComboBox(typeComboBox, list[i].type);

}

}

}

}

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace CourseProject {

public partial class SearchBook : Form {

public SearchBook() {

InitializeComponent();

searchComboBox.Text = searchComboBox.Items[0].ToString();

errorLabel.Visible = false;

}

/// <summary>

/// Вывод результата сортировки в таблицу

/// </summary>

private void resOutput(Books res) {

res.sortAuthor();

BookCatalog.catalogViewForm.updateTable(res, searchResultView, bookInfoLabel);

}

/// <summary>

/// Событие по клику на кнопку "Искать"

/// </summary>

private void searchButton_Click(object sender, EventArgs e) {

string subject = searchSubjectTextBox.Text;

if (subject == "") {

errorLabel.Visible = true;

return;

}

errorLabel.Visible = true;

Books resultOfSearch = new Books();

if (searchComboBox.Text == searchComboBox.Items[0].ToString()) {

resultOfSearch.books = BookCatalog.catalog.searchAuthor(subject);

resOutput(resultOfSearch);

}

if (searchComboBox.Text == searchComboBox.Items[1].ToString()) {

resultOfSearch.books = BookCatalog.catalog.searchTitle(subject);

resOutput(resultOfSearch);

}

}

/// <summary>

/// Событие по клику на заголовок строки таблицы

/// </summary>

private void searchResultView_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {

string selectedId = searchResultView["idCol", searchResultView.CurrentRow.Index].Value.ToString();

bookInfoLabel.Text = BookCatalog.catalog.getInfoString(Int32.Parse(selectedId));

for (int i = 0; i < BookCatalog.catalogViewForm.catalTable.RowCount; i++) {

BookCatalog.catalogViewForm.catalTable.Rows[i].Selected = false;

if (BookCatalog.catalogViewForm.catalTable["idCol", i].Value.ToString() == selectedId) {

BookCatalog.catalogViewForm.catalTable.Rows[i].Selected = true;

}

}

}

/// <summary>

/// Событие по клику на кнопку "Перейти к каталогу"

/// </summary>

private void toCatalButton_Click(object sender, EventArgs e) {

BookCatalog.catalogViewForm.Activate();

}

}

}

Размещено на Allbest.ru

...

Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.