|
@@ -68,7 +68,7 @@
|
|
|
|
|
|
|
|
1. Создайте новое окно: **EditProductWindow** (в папке **Windows** - не забываем про логическую структуру проекта)
|
|
1. Создайте новое окно: **EditProductWindow** (в папке **Windows** - не забываем про логическую структуру проекта)
|
|
|
|
|
|
|
|
-2. В классе окна **EditProductWindow** добавьте свойство *CurrentProduct*, в котором будет храниться добавляемый/редактируемый экземпляр продукции:
|
|
|
|
|
|
|
+1. В классе окна **EditProductWindow** добавьте свойство *CurrentProduct*, в котором будет храниться добавляемый/редактируемый экземпляр продукции:
|
|
|
|
|
|
|
|
```cs
|
|
```cs
|
|
|
public Product CurrentProduct { get; set; }
|
|
public Product CurrentProduct { get; set; }
|
|
@@ -83,7 +83,7 @@
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
-3. В конструктор окна добавьте параметр типа **Product** и присвойте его ранее объявленному свойству:
|
|
|
|
|
|
|
+1. В конструктор окна добавьте параметр типа **Product** и присвойте его ранее объявленному свойству:
|
|
|
|
|
|
|
|
```cs
|
|
```cs
|
|
|
public EditWindow(Product EditProduct)
|
|
public EditWindow(Product EditProduct)
|
|
@@ -94,7 +94,7 @@
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-4. В разметке окна вместо фиксированного названия вставьте привязку к свойству *WindowName*
|
|
|
|
|
|
|
+1. В разметке окна вместо фиксированного названия вставьте привязку к свойству *WindowName*
|
|
|
|
|
|
|
|
```xml
|
|
```xml
|
|
|
<Window
|
|
<Window
|
|
@@ -102,7 +102,7 @@
|
|
|
Title="{Binding WindowName}">
|
|
Title="{Binding WindowName}">
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-5. В окне редактирования продукции создайте сетку из трёх колонок: в первой у нас будет изображение, во второй редактируемые поля продукта, а в третей список материалов
|
|
|
|
|
|
|
+1. В окне редактирования продукции создайте сетку из трёх колонок: в первой у нас будет изображение, во второй редактируемые поля продукта, а в третей список материалов
|
|
|
|
|
|
|
|
```xml
|
|
```xml
|
|
|
<Grid.ColumnDefinitions>
|
|
<Grid.ColumnDefinitions>
|
|
@@ -112,7 +112,7 @@
|
|
|
</Grid.ColumnDefinitions>
|
|
</Grid.ColumnDefinitions>
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-6. Во вторую колонку добавьте **StackPanel** с границами (чтобы визуальные компоненты не прилипали к границам окна) и в этом списке разместите редактируемые элементы
|
|
|
|
|
|
|
+1. Во вторую колонку добавьте **StackPanel** с границами (чтобы визуальные компоненты не прилипали к границам окна) и в этом списке разместите редактируемые элементы
|
|
|
|
|
|
|
|
>На форме должны быть предусмотрены следующие поля: артикул, наименование, тип продукта (выпадающий список), изображение, количество человек для производства, номер производственного цеха, минимальная стоимость для агента и подробное описание
|
|
>На форме должны быть предусмотрены следующие поля: артикул, наименование, тип продукта (выпадающий список), изображение, количество человек для производства, номер производственного цеха, минимальная стоимость для агента и подробное описание
|
|
|
|
|
|
|
@@ -223,7 +223,7 @@
|
|
|
Text="{Binding CurrentProduct.Description}"/>
|
|
Text="{Binding CurrentProduct.Description}"/>
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-7. Сохранение введенных данных
|
|
|
|
|
|
|
+1. Сохранение введенных данных
|
|
|
|
|
|
|
|
В разметку добавьте кнопку **Сохранить** и напишите обработчик
|
|
В разметку добавьте кнопку **Сохранить** и напишите обработчик
|
|
|
|
|
|
|
@@ -263,13 +263,16 @@
|
|
|
}
|
|
}
|
|
|
catch (Exception ex)
|
|
catch (Exception ex)
|
|
|
{
|
|
{
|
|
|
- MessageBox.Show(ex.InnerException.Message);
|
|
|
|
|
|
|
+ if(ex.InnerException != null)
|
|
|
|
|
+ MessageBox.Show(ex.InnerException.Message);
|
|
|
|
|
+ else
|
|
|
|
|
+ MessageBox.Show(ex.Message);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-8. Открытие окна редактирования для существующей и новой продукции
|
|
|
|
|
|
|
+1. Открытие окна редактирования для существующей и новой продукции
|
|
|
|
|
|
|
|
* для редактирования существующей продукции в списке продукции реализуем обработчик двойного клика
|
|
* для редактирования существующей продукции в списке продукции реализуем обработчик двойного клика
|
|
|
|
|
|
|
@@ -297,7 +300,7 @@
|
|
|
var NewEditWindow = new EditWindow(new Product());
|
|
var NewEditWindow = new EditWindow(new Product());
|
|
|
...
|
|
...
|
|
|
```
|
|
```
|
|
|
-9. Проверки перед сохранением продукта
|
|
|
|
|
|
|
+1. Проверки перед сохранением продукта
|
|
|
|
|
|
|
|
Все проверки вставляем в обработчик кнопки "Сохранить" окна редактирования, т.к. это относится к бизнес-логике, до вызова метода сохранения продукта
|
|
Все проверки вставляем в обработчик кнопки "Сохранить" окна редактирования, т.к. это относится к бизнес-логике, до вызова метода сохранения продукта
|
|
|
|
|
|
|
@@ -314,6 +317,50 @@
|
|
|
|
|
|
|
|
Тут по идее надо делать запрос к базе, но у нас есть метод получения списка продукции и мы можем искать в нём используя LINQ-запросы
|
|
Тут по идее надо делать запрос к базе, но у нас есть метод получения списка продукции и мы можем искать в нём используя LINQ-запросы
|
|
|
|
|
|
|
|
|
|
+1. Удаление продукции
|
|
|
|
|
+
|
|
|
|
|
+ >В окне редактирования продукта должна присутствовать кнопка “Удалить”, которая удаляет продукт из базы данных. При этом должны соблюдаться следующие условия. Если у продукта есть информация о материалах, используемых при его производстве, или история изменения цен, то эта информация должна быть удалена вместе с продуктом. Но если у продукта есть информация о его продажах агентами, то удаление продукта из базы данных должно быть запрещено. После удаления продукта система должна сразу вернуть пользователя обратно к списку продукции.
|
|
|
|
|
+
|
|
|
|
|
+ Добавьте кнопку *удалить* в среднюю колоку (рядом с кнопкой *сохранить*). Атрибут **Visibility** привяжите к **Id** продукта (т.е. у нового продукта кнопки удалить быть не должно).
|
|
|
|
|
+
|
|
|
|
|
+ И реализуйте обработчик клика по этой кнопке
|
|
|
|
|
+
|
|
|
|
|
+ ```cs
|
|
|
|
|
+ private void DeleteProductButton_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
+ {
|
|
|
|
|
+ using (var context = new ksmirnovContext())
|
|
|
|
|
+ {
|
|
|
|
|
+ try
|
|
|
|
|
+ {
|
|
|
|
|
+ // тут вставить проверки, требуемые по ТЗ
|
|
|
|
|
+ // + исключение, если есть продажи
|
|
|
|
|
+ var saleCount = context.ProductSales
|
|
|
|
|
+ .Where(ps => ps.ProductId==CurrentProduct.Id).Count();
|
|
|
|
|
+
|
|
|
|
|
+ if (saleCount > 0)
|
|
|
|
|
+ throw new Exception("Нельзя удалять продукт с продажами");
|
|
|
|
|
+
|
|
|
|
|
+ // - удаление списа материалов продукта
|
|
|
|
|
+ // - удаление истории изменения цен
|
|
|
|
|
+
|
|
|
|
|
+ var product = context.Products.Find(CurrentProduct.Id);
|
|
|
|
|
+ context.Products.Remove(product);
|
|
|
|
|
+ if (context.SaveChanges() > 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ DialogResult = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (Exception ex)
|
|
|
|
|
+ {
|
|
|
|
|
+ if(ex.InnerException != null)
|
|
|
|
|
+ MessageBox.Show(ex.InnerException.Message);
|
|
|
|
|
+ else
|
|
|
|
|
+ MessageBox.Show(ex.Message);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
<table style="width: 100%;"><tr><td style="width: 40%;">
|
|
<table style="width: 100%;"><tr><td style="width: 40%;">
|
|
|
<a href="../articles/cs_coloring2.md">Подсветка элементов по условию. Дополнительные выборки.Массовая смена цены продукции.
|
|
<a href="../articles/cs_coloring2.md">Подсветка элементов по условию. Дополнительные выборки.Массовая смена цены продукции.
|
|
|
</a></td><td style="width: 20%;">
|
|
</a></td><td style="width: 20%;">
|