- •Лабораторная работа: Разработка приложения на базе wpf Цель
- •Задание 1. Создать проект в соответствии с шаблоном "приложение wpf" и разработать интерфейс пользователя
- •Задание 2. Разработать бизнес-логику приложения – 2 часа.
- •Задание 3. Создать edm-модель данных – 1 час.
- •Задание 4. Произвести привязку данных к элементам контроля – 2 часа.
- •Привязка текстового поля
- •Привязка выпадающего списка
- •Привязка даты
- •Задание 6. Реализовать валидацию данных – 1 час.
- •Задание 7. Разработать методы поиска данных – 1 час.
- •Варианты заданий
- •Вариант 1. Информационная подсистема ведения счетов клиентов
- •Вариант 2. Информационная подсистема ведения адресов клиентов
- •Вариант 3. Информационная подсистема ведения договоров клиентов
- •Вариант 4. Информационная подсистема ведения клиентов – физических лиц
- •Вариант 5. Информационная подсистема ведения клиентов – юридических лиц
- •Вариант 6. Информационная подсистема учета сделок с ценными бумагами
- •Вариант 7. Информационная подсистема учета ценных бумаг
- •Вариант 8. Информационная подсистема поручений по сделкам с ценными бумагами
- •Вариант 9. Информационная подсистема учета клиентов компании
- •Вариант 10. Информационная подсистема учета операций с ценными бумагами
Задание 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();
}
Команда "Обновить" обычно используется после поиска данных или ввода данных по новому сотруднику.
