#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)
откуда вы знаете, что исключение связано с отсутствием правильного типа аутентификации? Вы должны перехватывать исключения определенного типа и обрабатывать их отдельно.