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

 

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

3.4.Используя справочную систему, исследуйте свойство Filter компонентов OpenFileDialog и SaveFileDialog и установите это свойство таким образом, чтобы в диалоговых окнах открытия и сохранения файла отображались только текстовые файлы.

3.5.Дополните приложение следующей функцией. При закрытии формы, если были внесены изменения в телефонный справочник, появляется диалоговое окно с текстом “Сохранить изменения?” и двумя кнопками “Yes” и “No”. При нажатии на “Yes” данные сохраняются в файл, при нажатии на “No” приложение закрывается без сохранения изменений.

 

Упражнение 13.3. Дополним приложение “Телефонный справочник” возможностью поиска абонента.

Решение

1-й этап.Доработаем визуальный интерфейс приложения.

Добавьте компоненту MainMenuStrip пункт меню “Поиск” и подпункт “Поиск по ФИО”.

Добавьте в проект еще одну форму, назовите её SearchNameForm.cs. Разработайте визуальный интерфейс формы самостоятельно в соответствии с рис. 13.5.

 

 

Отметим, что для того, чтобы компонент TextBox стал многострочным, нужно установить галочку в строке MultiLine в окошке, выпадающем при нажатии на маленький треугольник в правой верхней части компонента(рис. 13.6).

 

 

Чтобы при запуске форма “Поиск абонента” располагалась в центре родительского окна, установите свойство StartPosition равным CenterParent.

Установите свойство Name трех первых компонентов TextBox такими же, как на первой форме (можете скопировать эти компоненты из основной формы); у кнопки – SearchButton; у четвертого TextBox – ResultsTextBox. Для ResultsTextBox установите свойства: ScrollBars = Both (линии прокрутки), ReadOnly = True (убираем возможность редактирования пользователем). Установите значение свойства TabIndex компонентов (определяет последовательность получения компонентами фокуса ввода, нумерация с 0).

2-й этап.Разработаем необходимый программный код.

В классе SearchNameForm третьей формы опишем список PhoneNote.

 

public partial class SearchNameForm : Form

{

List<Note> PhoneNote;

 

Изменим конструктор третьей формы следующим образом (добавляем параметр и один оператор присваивания).

 

public SearchNameForm(List<Note> _PhoneNote)

{

InitializeComponent();

PhoneNote = _PhoneNote;

}

 

Добавим обработчик выбора подпункта меню “Поиск по ФИО” на форме MainForm:

 

private void поискПоФИОToolStripMenuItem_Click(object sender, EventArgs e)

{

SearchNameForm _Search = new SearchNameForm(PhoneNote);

_Search.ShowDialog();

}

 

Таким образом, мы указали, чтобы при выборе подпункта меню “Поиск по ФИО” открывалась третья форма и передавался один параметр – список PhoneNote. Он принимается в конструкторе третьей формы.

Осталось написать обработчик нажатия на кнопку “Найти” для формы SearchNameForm:

 

private void SearchButton_Click(object sender, EventArgs e)

{

// очищаем окно для вывода результатов

ResultsTextBox.Text = "";

// количество найденных результатов

int i = 0;

// цикл for для каждого элемента списка - foreach

foreach (Note MyRecord in PhoneNote)

{

// если выполняются условия поиска

if (MyRecord.LastName.Contains(LastNameTextBox.Text) &&

MyRecord.Name.Contains(NameTextBox.Text) && MyRecord.Patronymic.Contains(PatronymicTextBox.Text))

{

// увеличиваем счетчик найденных записей

i++;

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

ResultsTextBox.Text = ResultsTextBox.Text + i.ToString() + ". " + MyRecord.LastName + " " + MyRecord.Name + " " + MyRecord.Patronymic + ", ул. " + MyRecord.Street + ", д." + MyRecord.House + ", кв. " + MyRecord.Flat + ", тел. " + MyRecord.Phone + "\r\n";

}

}

// если не найдено ни одной записи, выводим сообщение

if (i == 0) ResultsTextBox.Text = "Записей, удовлетворяющих

поставленным условиям, в списке абонентов нет! ";

}

 

Поясним код. Найденную информацию будем дописывать в компонент ResultsTextBox, поэтому сначала очищаем содержимое его свойства Text. Переменная i – счетчик числа найденных записей (изначально 0). В цикле foreach просматриваем все записи, хранящиеся в списке PhoneNote, и с помощью метода Contains() определяем, содержатся ли искомые подстроки в соответствующих полях текущей записи (должны совпадать поля“Фамилия” – LastName, “Имя” – Name и “Отчество” – Patronymic искомого абонента), и если нужная запись найдена, добавляем информацию об абоненте в ResultsTextBox. Если после прохождения по всем записям выяснилось, что список не содержит подходящих элементов, выдается соответствующее сообщение.

Положите на форму еще одну кнопку, которая будет отвечать за закрытие формы. Самостоятельно установите для нее значение необходимых свойств. В обработчике нажатия на эту кнопку вызовите метод Close().

Сохраните проект. Запустите и протестируйте приложение.