예제 #1
0
        // Получение значений через лист allChildrensID - id дочерних компонентов данного компонента
        private SortedDictionary <string, long> GetTotalAmountOfComponent(List <long> allChildrensID)
        {
            SortedDictionary <string, long> uniqueCompNamesWithTotalAmount = new SortedDictionary <string, long>();

            // Цикл для всех дочерних компонентов
            foreach (long allId in allChildrensID)
            {
                // уникальный компонент, находится по ID компонента из общей таблицы
                ComponentsUnique componentUnique = GetComponentUniquebyAllID(allId);

                // Словарь еще не содержит такого компонента
                if (!uniqueCompNamesWithTotalAmount.ContainsKey(componentUnique.Name))
                {
                    // Нахождение общего количества компонентов
                    long amount = GetComponentAmountByID(componentUnique.Id, allChildrensID);

                    // Условие, позволяющее не включать в конечный протокол промежуточные компоненты, например "Поршень в сборе"
                    if (IsHavingChildrens(allId) == false)
                    {
                        // Добавление в словарь
                        uniqueCompNamesWithTotalAmount.Add(componentUnique.Name, amount);
                    }
                }
            }

            return(uniqueCompNamesWithTotalAmount);
        }
        // Действие по нажатию кнопки ОК
        private void Button_OK_Click(object sender, RoutedEventArgs e)
        {
            // Создание нового компонента
            newComponent = new ComponentsUnique();

            // Создание нового уникального компонента через поле ввода
            if (comboBox.SelectedIndex == 0)
            {
                // Если поле ввода пустое
                if (textBox.Text == "")
                {
                    string messageBoxText = "Введите имя нового компонента";
                    string caption        = "Введите имя нового компонента!";
                    MessageBox.Show(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error);
                }
                // Если поле ввода не пустое
                else
                {
                    if (textBox.Text.Length > 50)
                    {
                        string messageBoxText = "Имя компонента слишком длинное.\nМаксимальная длина имени компонента - 50 символов";
                        string caption        = "Имя компонента слишком длинное";
                        MessageBox.Show(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error);
                        textBox.Text = "";
                    }
                    else
                    {
                        // Проверка имени на существующий компонент
                        bool alreadyInList = componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>().Select(x => x.Name).Any(u => u == textBox.Text);
                        if (alreadyInList)
                        {
                            // Вывод предуреждения
                            string           messageBoxText = "Компонент \"" + textBox.Text + "\" уже присутствует в базе данных. Использовать его?";
                            string           caption        = "Данный компонент уже присутствует в базе данных";
                            MessageBoxResult result         = MessageBox.Show(messageBoxText, caption, MessageBoxButton.OKCancel, MessageBoxImage.Question);

                            // Создание компонента из списка существующих по введенному имени
                            if (result == MessageBoxResult.OK)
                            {
                                newComponent = componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>()
                                               .Where(x => x.Name == textBox.Text).First();
                            }
                            if (result == MessageBoxResult.Cancel)
                            {
                            }
                        }
                        // Такой компонент еще не существует
                        else
                        {
                            // Индекс компонента должен быть больше, чем все предыдущие, во избежание перезаписи таблицы
                            long currentMaxID = componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>().Max(t => t.Id);
                            newComponent.Id = currentMaxID + 1;

                            // Присвоение имени нового компонента из textBox
                            newComponent.Name = textBox.Text;
                        }
                    }
                }
            }
            // Выбор уже существующего компонента
            else
            {
                // Создание компонента из списка существующих по введенному имени
                newComponent = componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>()
                               .Where(x => x.Name == comboBox.SelectedItem.ToString()).First();
            }

            // Если новый компонент существует
            if (newComponent.Name != null)
            {
                // Парсим количество новых компонентов
                try
                {
                    newComponentAmount = Convert.ToInt32(amountTextBox.Text);
                    Close();
                }
                catch (FormatException)
                {
                    string messageBoxText = "Введите корректное количество новых компонентов";
                    string caption        = "Введите корректное количество новых компонентов!";
                    MessageBox.Show(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }
예제 #3
0
        // Добавление дочернего компонента
        private void NewInsideComponent(object sender, RoutedEventArgs e)
        {
            // Получение выбранного узла дерева
            TreeViewItem selectedItem = (TreeViewItem)treeView.SelectedItem;

            // Получение компонента по тегу данного узла
            ComponentsAll currentComponent = componentsAllQuery.AsQueryable().Cast <ComponentsAll>().Where(x => x.Id == (long)selectedItem.Tag).First();

            // Получение списка ID родителей данного компонента - нужно для последующего обновления дерева
            List <long> parensIDListUnique = new List <long>();

            parensIDListUnique.Add(currentComponent.ComponentId);
            parensIDListUnique = GetComponentsParentsIds(currentComponent, ref parensIDListUnique, true);

            // Лист Id родительских компонентов данного компонента
            List <long> parensIDListAll = new List <long>();

            parensIDListAll.Add(currentComponent.Id);
            parensIDListAll = GetComponentsParentsIds(currentComponent, ref parensIDListAll, false).OrderBy(u => u).ToList();

            // Создание диалога с добавлением нового компонента
            // Индекс компонента должен быть больше, чем все предыдущие, во избежание перезаписи таблицы
            // Id нового компонента будет задано автоматически при db.ComponentsUniques.InsertOnSubmit(...)
            Dialog_NewComponent dialog_NewComponent = new Dialog_NewComponent(componentsUniqueQuery, parensIDListUnique);

            dialog_NewComponent.Owner = Window.GetWindow(this);
            dialog_NewComponent.ShowDialog();

            // Получение максимального id в обеих таблицах - Индекс компонента должен быть больше, чем все предыдущие, во избежание перезаписи таблицы
            long currentAllComponentsMaxID    = componentsAllQuery.AsQueryable().Cast <ComponentsAll>().Max(t => t.Id);
            long currentUniqueComponentsMaxID = componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>().Max(t => t.Id);

            // Объект из диалога существует (нажата кнопка ОК)
            if (dialog_NewComponent.newComponent != null && dialog_NewComponent.newComponent.Name != null)
            {
                // Уникальный компонент еще не существует
                if (dialog_NewComponent.newComponent.Id > currentUniqueComponentsMaxID)
                {
                    // Добавление нового уникального компонента
                    ComponentsUnique newComponentUnique = new ComponentsUnique()
                    {
                        // Индекс компонента должен быть больше, чем все предыдущие, во избежание перезаписи таблицы
                        Id   = dialog_NewComponent.newComponent.Id,
                        Name = dialog_NewComponent.newComponent.Name,
                    };

                    // Сохранение изменений в БД
                    db.ComponentsUniques.InsertOnSubmit(newComponentUnique);
                    db.SubmitChanges();

                    // Создание нового компонента таблицы ComponentsAll
                    ComponentsAll newComponentAll = new ComponentsAll()
                    {
                        // Индекс компонента должен быть больше, чем все предыдущие, во избежание перезаписи таблицы
                        Id       = currentAllComponentsMaxID + 1,
                        ParentId = (long)selectedItem.Tag,
                        // Нахождение Id уникального компонента по имени
                        ComponentId = componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>()
                                      .Where(x => x.Name == newComponentUnique.Name).First().Id,
                        Name   = "",
                        Amount = dialog_NewComponent.newComponentAmount
                    };

                    // Сохранение изменений в БД
                    db.ComponentsAlls.InsertOnSubmit(newComponentAll);
                    db.SubmitChanges();

                    // Добавление нового элемента TreeViewItem по новому компоненту
                    TreeViewItem newitem = CreateNewItemFromComponent(newComponentAll);

                    // Добавление нового элемента TreeViewItem в treeView под выбранным узлом selectedItem
                    selectedItem.Items.Add(newitem);
                }

                // Уникальный компонент уже существует
                else
                {
                    // Список Id внутренних уникальных компонентов данного компонета
                    List <long> childIDList = GetComponentsUniqueChildrensId(currentComponent);

                    // Изменение количества уже добавленного компонента
                    // Если Id любого внутреннего уникальных компонента равен id добавляемого уникального компонента
                    if (childIDList.Any(x => x == dialog_NewComponent.newComponent.Id))
                    {
                        // Выбор компонента, в котором нужно изменить значение
                        // Добавление нового значения  dialog_NewComponent.newComponentAmount к существующему Amount
                        componentsAllQuery.AsQueryable().Cast <ComponentsAll>()
                        .Where(x => x.ComponentId == dialog_NewComponent.newComponent.Id)
                        .Where(x => x.ParentId == (long)selectedItem.Tag)
                        .First().Amount += dialog_NewComponent.newComponentAmount;
                    }

                    // Данный уникальный компонент отсутствует в ветке
                    // Добавление существующего уникального компонента в текущую ветку
                    else
                    {
                        List <string> parentNames = GetComponentsParentsNames(parensIDListAll);

                        if (parentNames.Contains(dialog_NewComponent.newComponent.Name))
                        {
                            // Вывод предуреждения о переименовании
                            string           messageBoxText = "Компонент \"" + dialog_NewComponent.newComponent.Name + " \" уже присутствует в данной ветке.\nДобавление невозможно.";
                            string           caption        = "Добавление компонента невозможно";
                            MessageBoxResult result         = MessageBox.Show(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Question);
                        }
                        else
                        {
                            ComponentsAll newComponentAll = new ComponentsAll()
                            {
                                Id          = currentAllComponentsMaxID + 1,
                                ParentId    = (long)selectedItem.Tag,
                                ComponentId = dialog_NewComponent.newComponent.Id,
                                Name        = "",
                                Amount      = dialog_NewComponent.newComponentAmount
                            };

                            // Сохранение изменений в БД
                            db.ComponentsAlls.InsertOnSubmit(newComponentAll);
                            db.SubmitChanges();

                            // Создание нового элемента TreeViewItem по текущему компоненту
                            TreeViewItem newitem = CreateNewItemFromComponent(newComponentAll);

                            // Добавление нового элемента TreeViewItem в treeView под выбранным узлом selectedItem
                            selectedItem.Items.Add(newitem);
                        }
                    }
                }

                // Сохранение изменений в БД. Мало ли.
                db.SubmitChanges();

                // Сворачивание TreeView
                TreeViewCollapseAll();

                // Обновление treeView - разворачивание узлов из списка parensIDListAll
                RefreshTreeView(parensIDListAll);
            }
        }
 partial void DeleteComponentsUnique(ComponentsUnique instance);
 partial void UpdateComponentsUnique(ComponentsUnique instance);
 partial void InsertComponentsUnique(ComponentsUnique instance);