private void AddNodes(ref TreeViewItem rootNode, TypeParameter typeParameter)
        {
            using (var db = new DatabaseContext())
            {
                foreach (TypeParameter childType in db.TypeParameters.Where(ch => ch.IdTypeParameterParent == typeParameter.IdTypeParameter))
                {
                    TreeViewItem childNode = new TreeViewItem
                    {
                        Header = childType.TypeParameterName,
                        Tag    = childType.IdTypeParameter.ToString()
                    };

                    rootNode.Items.Add(childNode);
                    AddNodes(ref childNode, childType);
                }
            }
        }
        private void removeMI_Click(object sender, RoutedEventArgs e)
        {
            using (var db = new DatabaseContext())
            {
                try
                {
                    if (treeView.SelectedItem == null)
                    {
                        MessageBox.Show("Предупреждение!\r\nУдаление невозможно: не выбран ни один узел в древовидном списке.", "Удаление типа параметра", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }

                    var id = Convert.ToInt64((treeView.SelectedItem as TreeViewItem).Tag);

                    if (db.TypeParameters.Where(t => t.IdTypeParameterParent == id).Count() > 0)
                    {
                        MessageBox.Show("Предупреждение!\r\nДанный узел содержит дочерние узлы. Удалять можно только пустые узлы.", "Удаление типа параметра", MessageBoxButton.OK, MessageBoxImage.Warning);
                        Logging.GetInstance().WriteInLog("Была предпринята попытка удаления типа параметра из базы данных.");
                        return;
                    }

                    TypeParameter typeParameter = db.TypeParameters.Find(id);   // возможно, в дальнейшем потребуется проверка parameter на null

                    db.TypeParameters.Remove(typeParameter);
                    db.SaveChanges();

                    TreeFiller.GetInstance().DeleteNode(ref treeView);
                    Logging.GetInstance().WriteInLog("Успешное удаление типа параметра " + typeParameter.TypeParameterName + " из базы данных.");
                }
                catch (SqlException ex)
                {
                    MessageBox.Show("Ошибка!\r\n" + ex.Message, "Подключение к базе данных", MessageBoxButton.OK, MessageBoxImage.Error);
                    Logging.GetInstance().WriteInLog(ex.Message);
                    Application.Current.Shutdown();
                    return;
                }
                catch (DbUpdateException)
                {
                    MessageBox.Show("Предупреждение!\r\nДанный узел содержит параметры. Удалять можно только пустые узлы.", "Удаление типа параметра", MessageBoxButton.OK, MessageBoxImage.Warning);
                    Logging.GetInstance().WriteInLog("Была предпринята попытка удаления типа параметра из базы данных.");
                    return;
                }
            }
        }
        private void addChildMI_Click(object sender, RoutedEventArgs e)
        {
            using (var db = new DatabaseContext())
            {
                try
                {
                    if (treeView.SelectedItem == null)
                    {
                        MessageBox.Show("Предупреждение!\r\nУдаление невозможно: не выбран ни один узел в древовидном списке.", "Удаление типа параметра", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }

                    Editor editor = new Editor(this);

                    if (editor.ShowDialog() != true)
                    {
                        return;
                    }

                    TypeParameter typeParameter = new TypeParameter
                    {
                        TypeParameterName     = editor.TypeParameterName,
                        IdTypeParameterParent = Convert.ToInt64((treeView.SelectedItem as TreeViewItem).Tag)
                    };

                    db.TypeParameters.Add(typeParameter);
                    db.SaveChanges();

                    TreeFiller.GetInstance().AddNode(ref treeView, typeParameter.TypeParameterName,
                                                     typeParameter.IdTypeParameter.ToString(), (sender as MenuItem).Name);

                    Logging.GetInstance().WriteInLog("Успешное добавление типа параметра " + typeParameter.TypeParameterName + " в базу данных.");
                }
                catch (SqlException ex)
                {
                    MessageBox.Show("Ошибка!\r\n" + ex.Message, "Подключение к базе данных", MessageBoxButton.OK, MessageBoxImage.Error);
                    Logging.GetInstance().WriteInLog(ex.Message);
                    Application.Current.Shutdown();
                    return;
                }
            }
        }
        private void changeMI_Click(object sender, RoutedEventArgs e)
        {
            using (var db = new DatabaseContext())
            {
                try
                {
                    if (treeView.SelectedItem == null)
                    {
                        MessageBox.Show("Предупреждение!\r\nПереименование невозможно: не выбран ни один узел в древовидном списке.", "Переименование типа параметра", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }

                    var           id            = Convert.ToInt64((treeView.SelectedItem as TreeViewItem).Tag);
                    TypeParameter typeParameter = db.TypeParameters.Find(id);   // возможно, в дальнейшем потребуется проверка parameter на null

                    Editor editor = new Editor(this);

                    editor.TypeParameterName = typeParameter.TypeParameterName;

                    if (editor.ShowDialog() != true)
                    {
                        return;
                    }

                    typeParameter.TypeParameterName = editor.TypeParameterName;
                    db.SaveChanges();

                    TreeFiller.GetInstance().RenameNode(ref treeView, editor.TypeParameterName);
                    Logging.GetInstance().WriteInLog("Успешное переимнование типа параметра " + typeParameter.TypeParameterName + ".");
                }
                catch (SqlException ex)
                {
                    MessageBox.Show("Ошибка!\r\n" + ex.Message, "Подключение к базе данных", MessageBoxButton.OK, MessageBoxImage.Error);
                    Logging.GetInstance().WriteInLog(ex.Message);
                    Application.Current.Shutdown();
                    return;
                }
            }
        }
        private void addMI_Click(object sender, RoutedEventArgs e)
        {
            using (var db = new DatabaseContext())
            {
                try
                {
                    Editor editor = new Editor(this);

                    if (editor.ShowDialog() != true)
                    {
                        return;
                    }

                    TypeParameter typeParameter = new TypeParameter
                    {
                        TypeParameterName     = editor.TypeParameterName,
                        IdTypeParameterParent = 0
                    };

                    db.TypeParameters.Add(typeParameter);
                    db.SaveChanges();

                    TreeFiller.GetInstance().AddNode(ref treeView, typeParameter.TypeParameterName,
                                                     typeParameter.IdTypeParameter.ToString(), (sender as MenuItem).Name);

                    Logging.GetInstance().WriteInLog("Успешное добавление корневого типа параметра " + typeParameter.TypeParameterName + " в базу данных");
                }
                catch (SqlException ex)
                {
                    MessageBox.Show("Ошибка!\r\n" + ex.Message, "Подключение к базе данных", MessageBoxButton.OK, MessageBoxImage.Error);
                    Logging.GetInstance().WriteInLog(ex.Message);
                    Application.Current.Shutdown();
                    return;
                }
            }
        }