Евгений Колесников преди 3 години
родител
ревизия
6a31cbcc68
променени са 1 файла, в които са добавени 56 реда и са изтрити 9 реда
  1. 56 9
      articles/cs_edit_product2.md

+ 56 - 9
articles/cs_edit_product2.md

@@ -68,7 +68,7 @@
 
 1. Создайте новое окно: **EditProductWindow** (в папке **Windows** - не забываем про логическую структуру проекта)
 
-2. В классе окна **EditProductWindow** добавьте свойство *CurrentProduct*, в котором будет храниться добавляемый/редактируемый экземпляр продукции:
+1. В классе окна **EditProductWindow** добавьте свойство *CurrentProduct*, в котором будет храниться добавляемый/редактируемый экземпляр продукции:
 
     ```cs
     public Product CurrentProduct { get; set; }
@@ -83,7 +83,7 @@
         }
     }
     ```
-3. В конструктор окна добавьте параметр типа **Product** и присвойте его ранее объявленному свойству:
+1. В конструктор окна добавьте параметр типа **Product** и присвойте его ранее объявленному свойству:
 
     ```cs
     public EditWindow(Product EditProduct)
@@ -94,7 +94,7 @@
     }
     ```
 
-4. В разметке окна вместо фиксированного названия вставьте привязку к свойству *WindowName*
+1. В разметке окна вместо фиксированного названия вставьте привязку к свойству *WindowName*
 
     ```xml
     <Window
@@ -102,7 +102,7 @@
         Title="{Binding WindowName}">
     ```
 
-5. В окне редактирования продукции создайте сетку из трёх колонок: в первой у нас будет изображение, во второй редактируемые поля продукта, а в третей список материалов
+1. В окне редактирования продукции создайте сетку из трёх колонок: в первой у нас будет изображение, во второй редактируемые поля продукта, а в третей список материалов
 
     ```xml
     <Grid.ColumnDefinitions>
@@ -112,7 +112,7 @@
     </Grid.ColumnDefinitions>
     ```
 
-6. Во вторую колонку добавьте **StackPanel** с границами (чтобы визуальные компоненты не прилипали к границам окна) и в этом списке разместите редактируемые элементы
+1. Во вторую колонку добавьте **StackPanel** с границами (чтобы визуальные компоненты не прилипали к границам окна) и в этом списке разместите редактируемые элементы
 
     >На форме должны быть предусмотрены следующие поля: артикул, наименование, тип продукта (выпадающий список), изображение, количество человек для производства, номер производственного цеха, минимальная стоимость для агента и подробное описание
 
@@ -223,7 +223,7 @@
             Text="{Binding CurrentProduct.Description}"/>
         ```
 
-7. Сохранение введенных данных
+1. Сохранение введенных данных
 
     В разметку добавьте кнопку **Сохранить** и напишите обработчик
 
@@ -263,13 +263,16 @@
             }
             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());
         ...
         ```
-9. Проверки перед сохранением продукта
+1. Проверки перед сохранением продукта
 
     Все проверки вставляем в обработчик кнопки "Сохранить" окна редактирования, т.к. это относится к бизнес-логике, до вызова метода сохранения продукта
 
@@ -314,6 +317,50 @@
 
         Тут по идее надо делать запрос к базе, но у нас есть метод получения списка продукции и мы можем искать в нём используя 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%;">
 <a href="../articles/cs_coloring2.md">Подсветка элементов по условию. Дополнительные выборки.Массовая смена цены продукции.
 </a></td><td style="width: 20%;">