2011-09-29 39 views
1

我正在开发一个windowsform应用程序。它由一个带有服务器名称列表的组合框和一个用于所选服务器名称的数据库列表组成,另外一个用于所选数据库的列表。当用户选择servername并单击按钮时,它将在服务器中显示数据库名称。如果用户改变了主意并选择了另一个服务器名称,我仍然有相同的首先选择的数据库列表。我的数据库列表应该每次刷新取决于服务器种选择改变我怎样才能实现这一目标如果用户选择发生变化,清除Combobox中的项目

这里是我的示例代码:

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); 
     } 


    } 

    } 

回答

3

一个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); 
     } 

} 
 

还有许多其他的方式来收拾这个代码,如您: 赶上(异常前)

你怎么知道的例外是从没有正确的认证类型?您应该捕获特定类型的异常并单独处理。

相关问题