public MainWindow()
        {
            InitializeComponent();
            CustomGrid = DataTableGrid;

            var connectionStrings = ConfigurationManager.ConnectionStrings;

            foreach (ConnectionStringSettings connectionString in connectionStrings)
            {
                switch (connectionString.ProviderName)
                {
                case "PostgreSQL":
                    PostgreCommunications.Add(connectionString.Name, new NpgsqlCommunication(connectionString));
                    PostgreCommunications[connectionString.Name].FillDs();
                    BuildTreeView(DatabasesTreeView, PostgreCommunications[connectionString.Name]);
                    break;

                case "MS SQL":
                    MsCommunications.Add(connectionString.Name, new MsCommunication(connectionString));
                    MsCommunications[connectionString.Name].FillDs();
                    BuildTreeView(DatabasesTreeView, MsCommunications[connectionString.Name]);
                    break;
                }
            }
        }
        private void DbMenuItem_Disconnect(object sender, RoutedEventArgs e)
        {
            if (!(sender is MenuItem menuItem))
            {
                return;
            }

            if (!(menuItem.Parent is ContextMenu contextMenu))
            {
                return;
            }

            if (!(contextMenu.PlacementTarget is TreeViewItem viewItem))
            {
                return;
            }

            if (!(viewItem.Header is StackPanel stack))
            {
                return;
            }

            DatabasesTreeView.Items.Remove(viewItem);

            var header = (TextBlock)stack.Children[1];

            PostgreCommunications.Remove(header.Text);

            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

            config.ConnectionStrings.ConnectionStrings.Remove(header.Text);
            config.Save();
        }
        private void AddDb_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                NpgsqlConnectionStringBuilder connectionBuilder;
                var addDbWindow = new AddDbWindow();
                if (addDbWindow.ShowDialog() == true)
                {
                    connectionBuilder = NpgsqlCommunication.CreateConnectionStringBuilder(
                        addDbWindow.Server, addDbWindow.Port, addDbWindow.Database,
                        addDbWindow.User, addDbWindow.Password);

                    var connection = new NpgsqlConnection(connectionBuilder.ConnectionString);
                    connection.Open();

                    if (connection.State == ConnectionState.Open)
                    {
                        MessageBox.Show("The connection to " + addDbWindow.Database + " was successful. Database saved",
                                        "Connected", MessageBoxButton.OK, MessageBoxImage.Information);
                    }
                    else
                    {
                        MessageBox.Show("Failed to connect to database, maybe server is closed or your input is wrong.",
                                        "Failure", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    connection.Close();
                }
                else
                {
                    return;
                }

                var communication =
                    new NpgsqlCommunication(addDbWindow.Database, addDbWindow.User,
                                            addDbWindow.Server, addDbWindow.Port, addDbWindow.Password);

                // Create recording in the DbCourseWork.exe.Config
                var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
                var settings   = configFile.ConnectionStrings.ConnectionStrings;
                if (settings[addDbWindow.Database] == null)
                {
                    settings.Add(new ConnectionStringSettings(addDbWindow.Database, connectionBuilder.ConnectionString));
                    settings[addDbWindow.Database].ProviderName = "PostgreSQL";

                    PostgreCommunications.Add(addDbWindow.Database, communication);
                    PostgreCommunications[addDbWindow.Database].FillDs();

                    BuildTreeView(DatabasesTreeView, communication);
                }

                else
                {
                    settings[addDbWindow.Database].Name             = addDbWindow.Database;
                    settings[addDbWindow.Database].ConnectionString = connectionBuilder.ConnectionString;
                    settings[addDbWindow.Database].ProviderName     = "PostgreSQL";

                    PostgreCommunications.Remove(addDbWindow.Database);
                    PostgreCommunications.Add(addDbWindow.Database, communication);
                    PostgreCommunications[addDbWindow.Database].FillDs();

                    RemoveTreeView(DatabasesTreeView, addDbWindow.Database);
                    BuildTreeView(DatabasesTreeView, communication);
                }

                configFile.Save(ConfigurationSaveMode.Modified);
                ConfigurationManager.RefreshSection("connectionStrings");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }