// Получение значений через лист 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); } } }
// Добавление дочернего компонента 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);