60.52K
AI

b45fd035a0973e566168fed967fa5ebb

1.

Разработка WPF-приложения
для работы с товарами
Подробный разбор кода из файла «Shpora.docx»
Подключение БД • Авторизация • Список товаров
Удаление • Переход к редактированию • Добавление
Учебная презентация
C# • WPF • Entity Framework • Учебный проект

2.

1. Что рассматривается в проекте
Структура приложения по материалам исходного файла
Подключение базы данных
Класс AppConnect хранит общий контекст Entity Framework, через который код обращается к таблицам.
Окна и навигация
WPF-интерфейс строится из окон, страниц, кнопок, текстовых полей и контейнеров.
Авторизация
Пользователь ищется в таблице User_; расширенный вариант учитывает роль Id_Role.
Работа с товарами
WindowTovar выводит список, удаляет выбранный товар и открывает сценарий редактирования.
Добавление
Форма Dobav считывает значения полей, создаёт объект товара и сохраняет его в базе.
C# • WPF • Entity Framework • Учебный проект
02

3.

2. Подключение базы данных
Что нужно настроить перед работой с данными
Папка и класс подключения
В исходной инструкции предлагается создать папку AppConnectDate и класс AppConnect.
Entity Framework
ORM-библиотека, которая позволяет работать с таблицами базы через C#-объекты.
Контекст базы данных
Пример ObuvEntities создаётся один раз и используется для запросов к сущностям User_, Tovar_ и другим.
Важно для проекта
Имена AppConnect / AppConect и AppConnectDate в документе отличаются. В своём проекте нужно использовать реальные имена
классов и пространств имён.
C# • WPF • Entity Framework • Учебный проект
03

4.

3. Инициализация контекста БД
03
Контекст создаётся при запуске окна авторизации
public MainWindow()
{
public MainWindow()
Конструктор окна MainWindow; выполняется при создании окна.
InitializeComponent();
AppConect.bd = new ObuvEntities();
}
InitializeComponent()
Создаёт визуальные элементы, описанные в XAML, и связывает их
с кодом.
new ObuvEntities()
Создаёт объект контекста Entity Framework для доступа к базе.
AppConect.bd
Общее поле/свойство, через которое другие окна обращаются к
контексту. Оно должно быть объявлено в классе подключения.
C# • WPF • Entity Framework • Учебный проект

5.

4. Простая авторизация
04
Поиск пользователя по логину и паролю
var user = AppConect.bd.User_.FirstOrDefault(
x => x.Login == txbLogin.Text
&& x.Pass == txbPass.Password);
FirstOrDefault(...)
Ищет первую запись User_, у которой логин и пароль совпадают с
введёнными.
if (user == null)
txbLogin.Text / txbPass.Password
{
Считывают значения из полей логина и пароля.
MessageBox.Show("Неверный логин или пароль!");
return;
}
user == null
MessageBox.Show($"Добро пожаловать, {user.Name}!");
Если запись не найдена, показывается ошибка; return
прекращает обработчик.
Window WindowTovar = new WindowTovar();
WindowTovar.Show();
this.Close();
C# • WPF • Entity Framework • Учебный проект
Show() и Close()
Открывают окно товаров и закрывают окно авторизации после
успешного входа.

6.

5. Авторизация с ролями
05
Вариант из документа: роль определяет приветствие и переход
var userObj = AppConnect.bd.User_.FirstOrDefault(
x => x.Login == txbLogin.Text
&& x.Pass == psbPass.Password);
try / catch
Оборачивает действия, чтобы перехватить исключение и
показать сообщение.
if (userObj == null)
switch (userObj.Id_Role)
{
Сравнивает ID роли с вариантами case: 1, 2 или 3.
MessageBox.Show("Такого пользователя нет!");
}
else
MessageBox.Show(...)
{
switch (userObj.Id_Role)
Показывает приветствие и информацию об ошибке.
{
case 1: /* Администратор */ break;
case 2: /* Менеджер */ break;
case 3: /* Клиент */ break;
default: /* Неизвестная роль */ break;
}
}
C# • WPF • Entity Framework • Учебный проект
Navigate(new PageTovar())
Переводит пользователя на страницу товаров. В исходнике для
разных ролей указан один и тот же переход.

7.

6. Окна, страницы и навигация
Два способа перехода, приведённые в шпаргалке
Открыть другое окно
WindowTovar window = new WindowTovar(); window.Show(); this.Close(); — создаёт новое окно, показывает его и закрывает текущее.
Перейти внутри Frame
MainFrameWindow.Navigate(new Page1()); — загружает страницу в элемент Frame.
Использовать NavigationService
NavigationService?.Navigate(new PageTovar()); — выполняет переход, если NavigationService существует.
Оформление интерфейса
В документе рекомендуются единый фон, шрифты и цвета, фиксированный размер окна и понятные имена элементов в стиле
CamelCase.
C# • WPF • Entity Framework • Учебный проект
06

8.

7. Разметка списка товаров в XAML
07
ListView + DataTemplate задают внешний вид каждой записи
<ListView x:Name="Tovar">
<ListView.ItemTemplate>
<DataTemplate>
ListView x:Name="Tovar"
Контейнер, в котором отображается коллекция товаров. Имя Tovar
используется в C#.
<Border Padding="10" Margin="5">
<Grid>
<!-- Фото -->
<Image Source="{Binding Image}"/>
ItemTemplate / DataTemplate
Описывают, как выглядит каждый отдельный элемент коллекции.
<!-- Информация -->
<TextBlock>
<Run Text="{Binding Kategoria_Tovara}"/>
<Run Text="{Binding Name_Tovar}"/>
</TextBlock>
Border / Grid
Border создаёт рамку и отступы, Grid размещает элементы по
строкам и столбцам.
</Grid>
</Border>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
{Binding ...}
Привязка данных: WPF берёт значение свойства из текущего
объекта товара.
Image и TextBlock
Показывают изображение и текстовые характеристики.
Остальные поля в документе аналогично привязаны к свойствам.
C# • WPF • Entity Framework • Учебный проект

9.

8. Вывод данных из БД
08
Заполнение ListView в конструкторе WindowTovar
public partial class WindowTovar : Window
WindowTovar : Window
{
Объявляет класс окна WPF.
public WindowTovar()
{
InitializeComponent();
Tovar.ItemsSource =
InitializeComponent()
Загружает разметку XAML, включая ListView с именем Tovar.
AppConnect.bd.Tovar_.ToList();
}
}
AppConnect.bd.Tovar_
Набор сущностей товаров, доступный через контекст БД.
ToList()
Выполняет запрос и получает список записей.
ItemsSource
Назначает полученный список источником данных для
отображения в ListView.
C# • WPF • Entity Framework • Учебный проект

10.

9. Удаление товара: выбор и проверка
Перед удалением проверяется связь товара с чеками
Tovar_ selectTovar =
(Tovar_)Tovar.SelectedItem;
bool hasRelatedChecks =
AppConnect.bd.Chek_.Any(
c => c.Tovar_.Id_Tovar == selectTovar.Id_Tovar);
if (hasRelatedChecks)
{
MessageBox.Show("Товар используется в чеках!");
SelectedItem
Возвращает выбранный элемент ListView; приведение типа
ожидает объект Tovar_.
Any(...)
Проверяет, существует ли хотя бы один чек, связанный с этим
товаром.
Id_Tovar
Идентификатор товара, по которому проверяется связь.
return;
}
return
Отменяет удаление, если товар используется в чеках.
Важная проверка
Перед обращением к selectTovar.Id_Tovar нужно проверить, что
товар выбран; иначе возможна ошибка NullReferenceException.
C# • WPF • Entity Framework • Учебный проект
09

11.

10. Удаление: запись в БД и обновление
После проверки выполняется удаление и повторная загрузка списка
try
Remove(selectTovar)
{
Помечает выбранную сущность для удаления из набора товаров.
AppConnect.bd.Tovar_.Remove(selectTovar);
AppConnect.bd.SaveChanges();
Tovar.ItemsSource =
SaveChanges()
Отправляет изменения из контекста в базу данных.
AppConnect.bd.Tovar_.ToList();
}
catch (Exception ex)
{
MessageBox.Show(
$"Ошибка: {ex.InnerException?.Message ??
ex.Message}");
}
Повторный ToList()
Заново загружает товары, чтобы удалённая запись исчезла из
интерфейса.
catch
Перехватывает ошибку базы данных и показывает текст
исключения.
InnerException?.Message ?? ex.Message
Пытается показать внутреннюю причину ошибки; если её нет,
показывает основное сообщение.
C# • WPF • Entity Framework • Учебный проект
10

12.

11. Переход к редактированию
11
Что должен делать обработчик Redact
private void Redact(object sender, RoutedEventArgs e)
sender / RoutedEventArgs e
{
Стандартные параметры обработчика события кнопки WPF.
Tovar selectedProduct =
Tovar.SelectedItem as Tovar;
if (selectedProduct == null)
SelectedItem as Tovar
Пытается получить выбранный элемент как объект типа Tovar.
{
MessageBox.Show("Выберите товар для
редактирования!");
return;
Проверка null
Не позволяет продолжить, если пользователь ничего не выбрал.
}
Window WindowRed = new WindowRed();
Создание WindowRed
WindowRed.Show();
Создаёт окно редактирования, затем показывает его и закрывает
список.
this.Close();
}
Недостающий шаг в исходнике
Выбранный товар не передаётся в WindowRed. Для реального
редактирования окно должно получить объект/ID и заполнить
поля его данными.
C# • WPF • Entity Framework • Учебный проект

13.

12. Добавление товара
12
Форма Dobav создаёт новую сущность и сохраняет её
new Tovar_ { ... }
try
{
AppConnectDate.Tovar_ Tovar =
Создаёт объект товара и заполняет его свойствами из полей
формы.
new AppConnectDate.Tovar_
{
Name_Tovar = TxtName.Text,
Opisanie_Tovara = TxtDescription.Text,
TxtName.Text / TxtDescription.Text
Читают название и описание товара.
Stoimost = float.Parse(TxtPrice.Text),
Kol_vo_na_sclade = float.Parse(TxtQuantity.Text)
};
float.Parse(...)
AppConnect.bd.Tovar_.Add(Tovar);
Преобразует текст цены и количества в числа; неверный ввод
вызовет исключение.
AppConnect.bd.SaveChanges();
MessageBox.Show("Данные успешно добавлены!");
}
Add(Tovar)
catch (Exception ex)
Добавляет новую сущность в набор товаров контекста.
{
MessageBox.Show($"Ошибка при добавлении: {ex.Message}");
}
SaveChanges()
Сохраняет новую запись в базе.
C# • WPF • Entity Framework • Учебный проект
catch

14.

13. Проверки и недочёты, которые важно знать
Эти замечания следуют из кода, приведённого в исходном документе
Проверка выбора перед удалением
DeletElem должен сначала проверить, что SelectedItem не равен null.
Передача товара в окно редактирования
Redact проверяет выбранный объект, но в показанном коде не передаёт его в WindowRed.
Типы сущностей
В документе встречаются Tovar_ и Tovar; нужно использовать тот тип, который реально сгенерирован моделью EF.
Единый контекст и имена
AppConect.bd, AppConnect.bd и AppConnectDate указаны по-разному — проверьте фактические имена в проекте.
Проверка числового ввода
Для цены и количества лучше применять TryParse, чтобы не падать при пустом или неправильном значении.
Безопасность пароля
C# • WPF • Entity Framework • Учебный проект
В примере пароль сравнивается напрямую с полем Pass. Для реального приложения следует хранить не открытый пароль, а его
13

15.

14. Итог
Как работает приложение в целом
WPF отвечает за интерфейс, C# — за логику, Entity Framework — за
взаимодействие с БД.
1.
Пользователь проходит авторизацию.
2.
Окно товаров загружает список из базы и отображает его через привязки данных.
3.
Обработчики кнопок удаляют товар, открывают редактирование или добавляют новую запись.
4.
SaveChanges() фиксирует изменения в базе данных.
5.
Проверки выбора и ввода помогают избежать ошибок.
Спасибо за внимание!
C# • WPF • Entity Framework • Учебный проект
14
English     Русский Rules