Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WPF-практика 7.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

Задание 7. Разработать методы поиска данных – 1 час.

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

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

увеличить изображение Рис. 6.18. Дизайн страницы с элементами контроля для поиска

XAML-описание элементов контроля, поддерживающих поиск имеет следующий вид.

<TextBlock Name="TextBlockSurname" Text="Фамилия" />

<TextBlock Name="TextBlockTitle" Text="Должность" />

<TextBox Name="TextBoxSurname" TextChanged="TextBoxSurname_TextChanged"/>

<ComboBox Name="ComboBoxTitle

ItemsSource="{Binding Source={StaticResource listTitle}}"

DisplayMemberPath="Title1"

SelectionChanged="ComboBoxTitle_SelectionChanged"/>

<Button Name="ButtonFindSurname" ToolTip="Поиск по фамилии"

IsEnabled="False" Click="ButtonFindSurname_Click">

<Image Source="Images/Search.jpg"/>

</Button>

<Button Name="ButtonFindTitle" ToolTip="Поиск по должности"

IsEnabled="False" Click="ButtonFindTitle_Click">

<Image Source="Images/Search.jpg" />

</Button>

Элементы контроля размещаем в рамке BorderFind. В рамке располагаем сетку gridFind с тремя колонками и строками. Первая строка в объединенных колонках содержит текстовый блок find с текстом "Поиск". Во второй и третьей строках первой колонки размещены текстовые блоки TextBlockSurname и TextBlockTitle соответственно. Во второй колонке размещаются элементы контроля для ввода информации: текстовый блок TextBoxSurname (вторая строка) и выпадающий список ComboBoxTitle (третья строка). В третьей колонке размещаются кнопки: для поиска по фамилии ButtonFindSurname (вторая строка) и для поиска по должности ButtonFindTitle (третья строка).

При загрузке страницы PageEmployee рамка BorderFind невидима, так как свойству Visibility задано значение "Hidden". При активизации команды Find из меню или панели инструментов запускается обработчик FindCommandBinding_Executed, который делает рамку ButtonFindTitle видимой.

private void FindCommandBinding_Executed(object sender,

ExecutedRoutedEventArgs e)

{

BorderFind.Visibility = System.Windows.Visibility.Visible;

}

Если в текстовом блоке TextBoxSurname не введена информация или в выпадающем списке ComboBoxTitle не сделан выбор, то кнопки ButtonFindSurname и ButtonFindTitle будут недоступны.

При вводе информации в текстовый блок TextBoxSurname запускается обработчик TextBoxSurname_TextChanged, который делает доступной кнопку ButtonFindSurname.

private void TextBoxSurname_TextChanged(object sender, TextChangedEventArgs e)

{

ButtonFindSurname.IsEnabled = true;

ButtonFindTitle.IsEnabled = false;

ComboBoxTitle.SelectedIndex = -1;

}

При нажатии кнопки ButtonFindSurname запускается обработчик ButtonFindSurname_Click.

private void ButtonFindSurname_Click(object sender, RoutedEventArgs e)

{

string surname = TextBoxSurname.Text;

DataEntitiesEmployee = new TitlePresonalEntities();

ListEmployee.Clear();

ObjectQuery<Employee> employees = DataEntitiesEmployee.Employees;

var queryEmployee = from employee in employees

where employee.Surname == surname

select employee;

foreach (Employee emp in queryEmployee)

{

ListEmployee.Add(emp);

}

if (ListEmployee.Count > 0)

{

DataGridEmployee.ItemsSource = ListEmployee;

ButtonFindSurname.IsEnabled = true;

ButtonFindTitle.IsEnabled = false;

}

else

MessageBox.Show("Сотрудник с фамилией \n"+surname+"\n не найдан",

"Предупреждение", MessageBoxButton.OK, MessageBoxImage.Warning);

}

В данном обработчике события Click выполняется LINQ запрос на получение данных из базы TitlePersonal в соответствии с заданной фамилией сотрудника.

var queryEmployee = from employee in employees

where employee.Surname == surname

select employee;

При выполнении запроса по фамилии страница PageEmployee имеет вид, приведенный на рис. 6.19

увеличить изображение Рис. 6.19. Поиск по фамилии

Найденные данные по сотруднику можно редактировать и удалять.

Если поиск в базе данных не привел к нахождению информации, то выдается информационное сообщение ( рис. 6.20).

увеличить изображение Рис. 6.20. Неудачный поиск по фамилии

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

private void ComboBoxTitle_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

ButtonFindTitle.IsEnabled = true;

ButtonFindSurname.IsEnabled = false;

TextBoxSurname.Text = "";

}

При нажатии на кнопку ButtonFindTitle срабатывает обработчик ButtonFindTitle_Click.

private void ButtonFindTitle_Click(object sender, RoutedEventArgs e)

{

DataEntitiesEmployee = new TitlePresonalEntities();

ListEmployee.Clear();

Title title = ComboBoxTitle.SelectedItem as Title;

ObjectQuery<Employee> employees = DataEntitiesEmployee.Employees;

var queryEmployee = from employee in employees

where employee.TitleID == title.ID

orderby employee.Surname

select employee;

foreach (Employee emp in queryEmployee)

{

ListEmployee.Add(emp);

}

DataGridEmployee.ItemsSource = ListEmployee;

}

При запуске данного обработчика выполняется LINQ-запрос к базе данных TitlePersonal для выборки данных по сотрудникам, имеющим заданную должность.

Для обновления выводимого списка сотрудников в приложение добавлена функция обновления, которая реализуется командой Refresh. Данная команда добавлена в коллекцию команд страницы PageEmployee.

<Page.CommandBindings>

....

<CommandBinding Command="Refresh" Executed="RefreshCommandBinding_Executed" />

...

</Page.CommandBindings>

Вызов команды добавлен в меню

<MenuItem Header="Обновить" Command="Refresh"/>

и панель инструментов

<Button Name="Refresh" Margin="5,2,5,2" Command="Refresh"

ToolTip="обновить данные по сотрудникам">

<Image Source="Images/Refresh.jpg" ></Image>

</Button>

Основное назначение обработчика команды RefreshCommandBinding_Executed – обновление списка ListEmployee.

private void RefreshCommandBinding_Executed(object sender,

ExecutedRoutedEventArgs e)

{

RewriteEmployee();

DataGridEmployee.IsReadOnly = false;

isDirty = false;

SetUnvisibilityFind();

}

Команда "Обновить" обычно используется после поиска данных или ввода данных по новому сотруднику.