// Создание отчета о сводном составе для компонента private void ReportComponent(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> childIDList = new List <long>(); GetComponentsAllChildrensId(currentComponent, ref childIDList); // Если у выбранного компонента нет дочерних компонентов if (childIDList.Count == 0) { string messageBoxText = "Данный компонент не содержит дочерних компонентов.\nСоздание отчета о сводном составе невозможно."; string caption = "Данный компонент не содержит дочерних компонентов"; MessageBox.Show(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error); } // Вызов конструктора класса с экспортом в Word вложенных компонентов текущего компонента else { ExportToWord export = new ExportToWord(currentComponent, componentsAllQuery, componentsUniqueQuery, childIDList); } }
// Создание нового объекта TreeViewItem на основе компонента private TreeViewItem CreateNewItemFromComponent(ComponentsAll component) { // Создание нового объекта TreeViewItem TreeViewItem newitem = new TreeViewItem(); // Создание вложенного компонента if (component.ParentId != 0) { // Тег элемента назначается по Id текущего компонента newitem.Tag = componentsAllQuery.AsQueryable().Cast <ComponentsAll>() .Where(x => x.ParentId == component.ParentId) .Where(x => x.ComponentId == component.ComponentId).First().Id; // Наименование нового компонента по ComponentId из списка componentsList string componentName = componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>() .Where(x => x.Id == component.ComponentId).First().Name; // Количество компонентов long componentAmount = component.Amount; newitem.Header = componentName + " (" + componentAmount.ToString("0") + " шт.)"; } // Создание нового коренного компонента else { // Тег элемента назначается по Id текущего компонента newitem.Tag = componentsAllQuery.AsQueryable().Cast <ComponentsAll>() .Where(x => x.Name == component.Name).First().Id; newitem.Header = component.Name; } return(newitem); }
// Получение общего количества включений данного уникального компонента private long GetComponentAmountByID(ComponentsAll component, long amount) { try { // Получение родительского компонента из таблицы всех компонентов по его ID из таблицы всех компонентов ComponentsAll parentComponent = GetComponentAllByID(component.ParentId); // Выход из рекурсии, если достигнут целевой родитель if (parentComponent.Id == currentComponent.Id) { return(1); } else { // Перемножение количества дочерних компонентов на количество родительских компонентов amount *= parentComponent.Amount; // Рекурсивный вызов перегруженной функции для просмотра вложенных компонентов amount *= GetComponentAmountByID(parentComponent, amount); } } // Выход из рекурсии catch (Exception) { } return(amount); }
// Получение всех id родительских элементов данного компонента из таблицы всех/уникальных компонентов private List <long> GetComponentsParentsIds(ComponentsAll component, ref List <long> parentIdList, bool isSearchingForUniquesComponents) { // Компонент - дочерний if (component.ParentId > 0) { // Получение родительского компонента по component.ParentId, т.к. родитель может быть только один, вызываем .First() ComponentsAll parentComponent = componentsAllQuery.AsQueryable().Cast <ComponentsAll>().Where(x => x.Id == component.ParentId).First(); // Если выпоняется поиск в таблице уникальных компонентов if (isSearchingForUniquesComponents == true) { parentIdList.Add(parentComponent.ComponentId); } // Если выпоняется поиск в таблице всех компонентов else { parentIdList.Add(parentComponent.Id); } // Рекурсивный вызов данной функции для каждого родительского компонента return(GetComponentsParentsIds(parentComponent, ref parentIdList, isSearchingForUniquesComponents)); } return(parentIdList); }
// Получение общего количества включений данного уникального компонента по его id private long GetComponentAmountByID(long uniqueComponentID, List <long> allChildrensID) { long amount = 0; // Цикл для всех дочерних компонентов foreach (long id in allChildrensID) { // Получение компонента из таблицы всех компонентов по его ID из таблицы всех компонентов ComponentsAll component = GetComponentAllByID(id); // Если этот компонент является искомым уникальным компонентом if (component.ComponentId == uniqueComponentID) { // Если родитель данного уникального компонента является компонентом, для которого формируется отчет if (GetComponentAllByID(component.ParentId).Id == currentComponent.Id) { // Добавление количества данного компонента к общей сумме amount += component.Amount; } // Случай, если у данного компонента родитель не является компонентом, для которого формируется отчет else { // Добавление количества данного компонента к общей сумме amount += component.Amount; // Рекурсивный вызов перегруженной функции для просмотра вложенных компонентов amount = GetComponentAmountByID(component, amount); } } } return(amount); }
// Конструктор класса для переименования вложенных компонентов public Dialog_RenameComponent(IQueryable compUniqueQuery, ComponentsAll currComponent) { InitializeComponent(); this.Title = "Переименование компонента"; isNewRootComponent = false; componentsUniqueQuery = compUniqueQuery; currentComponent = currComponent; }
// Добавление коренного компонента private void NewRootComponent(object sender, RoutedEventArgs e) { // Использование диалога при переименовании файла для создание нового корневого компонента - используя другой конструктор класса Dialog_RenameComponent dialog_NewRootComponent = new Dialog_RenameComponent(componentsAllQuery); dialog_NewRootComponent.Owner = Window.GetWindow(this); dialog_NewRootComponent.ShowDialog(); if (dialog_NewRootComponent.componentNewName != null) { // Получение максимального id в таблице // Индекс компонента должен быть больше, чем все предыдущие, во избежание перезаписи таблицы // Id нового компонента будет задано автоматически при db.ComponentsUniques.InsertOnSubmit(...) long currentAllComponentsMaxID = componentsAllQuery.AsQueryable().Cast <ComponentsAll>().Max(t => t.Id); // Создание нового компонента таблицы ComponentsAll ComponentsAll newComponentAll = new ComponentsAll() { // Индекс компонента должен быть больше, чем все предыдущие, во избежание перезаписи таблицы Id = currentAllComponentsMaxID + 1, ParentId = 0, ComponentId = 0, Name = dialog_NewRootComponent.componentNewName, Amount = 1 }; // Сохранение изменений в БД db.ComponentsAlls.InsertOnSubmit(newComponentAll); db.SubmitChanges(); // Добавление нового элемента TreeViewItem по новому компоненту TreeViewItem newitem = CreateNewItemFromComponent(newComponentAll); // Добавление нового элемента TreeViewItem в корень treeView treeView.Items.Add(newitem); } // Сохранение изменений в БД db.SubmitChanges(); // Сворачивание TreeView TreeViewCollapseAll(); // Разворачивание компонентов первого уровня foreach (TreeViewItem item in treeView.Items) { item.IsExpanded = true; } }
// Переименование компонента private void RenameComponent(object sender, RoutedEventArgs e) { // Получение выбранного узла дерева TreeViewItem selectedItem = (TreeViewItem)treeView.SelectedItem; // Получение компонента по тегу данного узла ComponentsAll currentComponent = componentsAllQuery.AsQueryable().Cast <ComponentsAll>().Where(x => x.Id == (long)selectedItem.Tag).First(); // Создание диалога с изменением компонента Dialog_RenameComponent dialog_RenameComponent = new Dialog_RenameComponent(componentsUniqueQuery, currentComponent); dialog_RenameComponent.Owner = Window.GetWindow(this); dialog_RenameComponent.ShowDialog(); // Объект из диалога существует if (dialog_RenameComponent.componentNewName != null) { // Дочерний элемент treeView if (currentComponent.ParentId != 0) { // Нахождение уникального компонента по ComponentId текущего компонента и замена в нем имени componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>() .Where(x => x.Id == currentComponent.ComponentId).First().Name = dialog_RenameComponent.componentNewName; } // Корневой элемент treeView else { // Нахождение компонента по старому имени и замена в нем имени componentsAllQuery.AsQueryable().Cast <ComponentsAll>() .Where(x => x.Name == dialog_RenameComponent.componentOldName).First().Name = dialog_RenameComponent.componentNewName; } } // Сохранение изменений в БД db.SubmitChanges(); // Сворачивание TreeView TreeViewCollapseAll(); // Лист Id родительских компонентов данного компонента List <long> parensIDList = new List <long>(); parensIDList = GetComponentsParentsIds(currentComponent, ref parensIDList, false).OrderBy(u => u).ToList(); // Обновление treeView с раскрытием до текущего компонента RefreshTreeView(parensIDList); }
// Получение всех id уникальных дочерних элементов данного компонента из таблицы всех компонентов private void GetComponentsAllChildrensId(ComponentsAll currentComponent, ref List <long> allChildrensID) { // Если у данного компонента имеются дочерние (число дочерних компонентов != 0) if (componentsAllQuery.AsQueryable().Cast <ComponentsAll>() .Where(x => x.ParentId == currentComponent.Id).ToList().Count != 0) { // Цикл для всех дочерних элементов foreach (ComponentsAll component in componentsAllQuery.AsQueryable().Cast <ComponentsAll>() .Where(x => x.ParentId == currentComponent.Id)) { // Добавление данного дочернего компонента в лист allChildrensID.Add(component.Id); // Рекурсивный вызов данной функции для каждого дочернего компонента GetComponentsAllChildrensId(component, ref allChildrensID); } } }
// Получение всех id родительских элементов данного компонента из таблицы всех/уникальных компонентов private List <string> GetComponentsParentsNames(List <long> parentIdList) { List <string> parentNames = new List <string>(); foreach (long id in parentIdList) { // Получение родительского компонента по component.ParentId, т.к. родитель может быть только один, вызываем .First() ComponentsAll parentComponent = componentsAllQuery.AsQueryable().Cast <ComponentsAll>().Where(x => x.Id == id).First(); // Компонент - дочерний if (parentComponent.ParentId > 0) { parentNames.Add(GetComponentUniquebyAllID(id).Name); } else { parentNames.Add(parentComponent.Name); } } return(parentNames); }
internal ExportToWord(ComponentsAll curComponent, IQueryable compsAllQuery, IQueryable compsUniqueQuery, List <long> allChildrensID) { componentsAllQuery = compsAllQuery; componentsUniqueQuery = compsUniqueQuery; currentComponent = curComponent; // Нахождение имени компонента из БД string componentName; // Для корневых компонентов if (currentComponent.ComponentId == 0) { componentName = currentComponent.Name; } // Для дочерних компонентов else { componentName = componentsUniqueQuery.AsQueryable().Cast <ComponentsUnique>() .Where(x => x.Id == currentComponent.ComponentId) .First().Name; } // Инициализация сортированного словаря, где ключом является имя компонента, а значением - суммарное количество включений в данный компонент SortedDictionary <string, long> uniqueCompNamesWithTotalAmount = new SortedDictionary <string, long>(); // Получение значений через лист allChildrensID - id дочерних компонентов данного компонента uniqueCompNamesWithTotalAmount = GetTotalAmountOfComponent(allChildrensID); // Количество строк таблицы int rowNumber = uniqueCompNamesWithTotalAmount.Count; //-------------------------------------- // Создание экземпляра приложения MS Word wordapp = new Word.Application(); // Установление видимости wordapp.Visible = true; // Свойства нового документа Object template = Type.Missing; Object newTemplate = false; Object documentType = Word.WdNewDocumentType.wdNewBlankDocument; Object visible = true; fileName = Directory.GetCurrentDirectory() + @"\Отчет о сводном составе - " + componentName + ".docx"; //Создание нового документа worddocument = wordapp.Documents.Add(ref template, ref newTemplate, ref documentType, ref visible); //-------------------------------------- // Свойства новых параграфов object oMissing = System.Reflection.Missing.Value; // Создание двух параграфов worddocument.Paragraphs.Add(ref oMissing); worddocument.Paragraphs.Add(ref oMissing); // Индекс текущей строки int currentRow = 1; // Получение параграфов текущей строки wordparagraph = worddocument.Paragraphs[currentRow]; //Ввод текста в первый параграф wordparagraph.Range.Text = "Отчет о сводном составе для компонента \"" + componentName + "\":"; // Переход на следующую строку currentRow++; //-------------------------------------- // Получение параграфов текущей строки wordparagraph = worddocument.Paragraphs[currentRow]; //Добавление таблицы в документ Word.Range wordrange = wordparagraph.Range; object defaultTableBehavior = Word.WdDefaultTableBehavior.wdWord9TableBehavior; object autoFitBehavior = Word.WdAutoFitBehavior.wdAutoFitWindow; //Добавляем таблицу и получаем объект wordtable Word.Table wordtable = worddocument.Tables.Add(wordrange, rowNumber, 2, ref defaultTableBehavior, ref autoFitBehavior); // Заполнение таблицы for (int i = 1; i <= rowNumber; i++) { // Добавление значений в выбранную ячейку первого столбца Word.Range wordcellrange1Column = wordtable.Cell(i, 1).Range; wordcellrange1Column.Text = uniqueCompNamesWithTotalAmount.ElementAt(i - 1).Key; // Добавление значений в выбранную ячейку второго столбца Word.Range wordcellrange2Column = wordtable.Cell(i, 2).Range; wordcellrange2Column.Text = uniqueCompNamesWithTotalAmount.ElementAt(i - 1).Value.ToString() + " шт."; } //-------------------------------------- // Сохранение с именем fileName try { worddocument.SaveAs2(fileName); } // Если файл уже открыт catch (Exception e) { string messageBoxText = e.Message; string caption = "Ошибка"; MessageBox.Show(messageBoxText, caption, MessageBoxButton.OK, MessageBoxImage.Error); } }
// Получение всех id уникальных дочерних элементов данного компонента из таблицы уникальных компонентов private List <long> GetComponentsUniqueChildrensId(ComponentsAll currentComponent) { return(componentsAllQuery.AsQueryable().Cast <ComponentsAll>() .Where(x => x.ParentId == currentComponent.Id).Select(s => s.ComponentId).ToList()); }
partial void InsertComponentsAll(ComponentsAll instance);
partial void UpdateComponentsAll(ComponentsAll instance);
partial void DeleteComponentsAll(ComponentsAll instance);
// Удаление компонента private void DeleteComponent(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> parensIDList = new List <long>(); parensIDList = GetComponentsParentsIds(currentComponent, ref parensIDList, false).OrderBy(u => u).ToList(); // Список Id внутренних уникальных компонентов данного компонета, все уровни List <long> childIDList = new List <long>(); GetComponentsAllChildrensId(currentComponent, ref childIDList); // Если у данного компонента есть вложенные компоненты if (childIDList.Count != 0) { // Вывод предуреждения о переименовании string messageBoxText = "Удалить компонент \"" + selectedItem.Header + " \"? \nУдаление данного компонента приведет за собой удаление следующих компонентов:"; // Вывод в предупреждении список всех дочерних элементов, которые будут удалены foreach (long id in childIDList) { messageBoxText += "\n - " + GetComponentUniquebyAllID(id).Name; } string caption = "Удаление компонента"; MessageBoxResult result = MessageBox.Show(messageBoxText, caption, MessageBoxButton.OKCancel, MessageBoxImage.Question); if (result == MessageBoxResult.OK) { // Удаление всех дочерних компонентов из БД foreach (long id in childIDList) { db.ComponentsAlls.DeleteOnSubmit(GetComponentAllByID(id)); } // Удаление данного компонента из БД db.ComponentsAlls.DeleteOnSubmit(currentComponent); } if (result == MessageBoxResult.Cancel) { } } else { // Вывод предуреждения о переименовании string messageBoxText = "Удалить компонент \"" + selectedItem.Header + " \"? "; string caption = "Удаление компонента"; MessageBoxResult result = MessageBox.Show(messageBoxText, caption, MessageBoxButton.OKCancel, MessageBoxImage.Question); if (result == MessageBoxResult.OK) { // Удаление данного компонента из БД db.ComponentsAlls.DeleteOnSubmit(currentComponent); } if (result == MessageBoxResult.Cancel) { } } // Сохранение изменений в БД db.SubmitChanges(); // Сворачивание TreeView TreeViewCollapseAll(); // Обновление treeView с раскрытием до текущего компонента RefreshTreeView(parensIDList); }
// Добавление дочернего компонента 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); } }