Очистка элементов в выпадающем списке при изменении выбора пользователя

#c# #winforms

#c# #winforms

Вопрос:

Я разрабатываю приложение windowsform. Он состоит из выпадающего списка со списком имен серверов и еще одного для списка баз данных для выбранного имени сервера и еще одного для списка таблиц для выбранной базы данных. когда пользователь выбирает servername и нажимает кнопку, он отображает имена баз данных на сервере. Если пользователь передумает и выберет другое имя сервера, у меня все равно будет тот же список баз данных, что и у первого выбранного. Мой список базы данных должен обновляться каждый раз в зависимости от изменения конфигурации сервера, как я могу этого добиться

Вот мой пример кода :

    public MainForm()
    {
        InitializeComponent();
        // FileHelper = new SqlDatabaseDataExport.FileHelper.FileUtilHelper();
        dt = SmoApplication.EnumAvailableSqlServers(false);

        if (dt.Rows.Count > 0)
        {
            foreach (DataRow dr in dt.Rows)
            {
                ServernamesList_combobox.Items.Add(dr["Name"]);

            }
           // ServernamesList_combobox.Items.Add("10.80.104.30\webx");

            DisplayMainWindow("Server list added");
            Logger.Log("Server List added");
        }

        Authentication_combobox.Items.Add("Windows Authentication");
        Authentication_combobox.Items.Add("Sql Authentication");
    }



    /// <summary>
    /// Generating list of databases with in the selected Server and list of 
    /// selected tables with in the selected 
    /// databse
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>

    private void DatabasenamesList_combobox_SelectedIndexChanged(object sender, EventArgs e)
    {

        dbName = DatabasenamesList_combobox.SelectedItem.ToString();


        connectionString = GetConnectionString();
        string mySelectQuery = "select [name] from sys.tables WHERE type = 'U' AND is_ms_shipped = 0 ORDER BY [name];";
        SqlConnection con = new SqlConnection(connectionString);
        SqlCommand myCommand = new SqlCommand(mySelectQuery, con);

        con.Open();
        SqlDataReader myReader = myCommand.ExecuteReader();
        try
        {
            while (myReader.Read())
            {
                SelectTables.Items.Add(myReader.GetString(0));
            }
        }
        finally
        {

            myReader.Close();
            con.Close();
        }


    }



      private void button1_Click_1(object sender, EventArgs e)
    {
        serveName = ServernamesList_combobox.SelectedItem.ToString();
        if (string.IsNullOrEmpty(serveName))
        {
            MessageBox.Show("Please select servername");
            return;
        }

        if (Authentication_combobox.SelectedItem == null)
        {
            MessageBox.Show("Please select authentication");
            return;
        }
        String conxString = string.Empty;

        if (Authentication_combobox.SelectedItem == "Windows Authentication")
        {
            conxString = "Data Source="   serveName   "; Integrated Security=True;";
        }

        if (Authentication_combobox.SelectedItem == "Sql Authentication")
        {
            if (string.IsNullOrEmpty(Username.Text))
            {
                MessageBox.Show("Please Enter Valid User name");
                return;
            }
            if (string.IsNullOrEmpty(Password.Text))
            {
                MessageBox.Show("Please Enter Valid Password");
                return;
            }
            conxString = "Data Source="   serveName   "; Integrated Security=False;User ID ="   Username.Text   ";Password="   Password.Text;
        } 


        using (SqlConnection sqlConx = new SqlConnection(conxString))
        {

            try
            {
                sqlConx.Open();
                MessageBox.Show("Connection established successfully");

            }
            catch (Exception ex)
            {

                MessageBox.Show("Exception"   ex);
                MessageBox.Show(" Please enter valid Credentials");
                return;

            }

            DataTable tblDatabases = sqlConx.GetSchema("Databases");
            sqlConx.Close();

            foreach (DataRow row in tblDatabases.Rows)
            {
                Databases.Add(row["database_name"].ToString());
            }

        foreach (var database in Databases)
        {
            DatabasenamesList_combobox.Items.Add(database);
        }


    }

  }
  

Ответ №1:

Добавьте событие SelectedIndexChanged в ваш DatabasenamesList_combobox. В коде для этого метода просто вызовите свой код для заполнения вашей базы данных. Теперь все помещается в ‘button1’. Переместите вашу процедуру в ту, которая называется что-то вроде

 
private void PopulateDatabases(string serverName)
{
        //populate Databases
        //.. your code here ...

        //clear the list
        DatabasenamesList.Items.Clear();
        foreach (var database in Databases)
        {
            DatabasenamesList_combobox.Items.Add(database);
        }

}
  

Существует много других способов очистки этого кода, например, в вашем:
catch (исключение ex)

откуда вы знаете, что исключение связано с отсутствием правильного типа аутентификации? Вы должны перехватывать исключения определенного типа и обрабатывать их отдельно.