2016-11-25 1 views
-1

Я полный noob на C#, и я застрял в изменении текста метки статуса из другого класса.C# - Изменить текст метки из другого класса

Когда этот класс подключается к БД Я хочу, чтобы изменить текст надписи на «Connected»:

public class DBConnect 
{ 
    public void Connect() 
    { 
     MySqlConnection conn; 
     string myConnectionString; 

     myConnectionString = "server = 127.0.0.1; uid=cardb;" + 
      "pwd=cardb; database=test;";    

     try 
     { 
      Form form = new Form(); 
      conn = new MySqlConnection(); 
      conn.ConnectionString = myConnectionString; 
      conn.Open(); 
      form.setStatus(); 
     } 
     catch (MySqlException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

Это метод setStatus я создал в классе формы:

public partial class Form : System.Windows.Forms.Form 
{ 
    public Form() 
    { 
     InitializeComponent(); 
    } 

    public void setStatus() 
    { 
     StatusTextLabel.Text = "Connected"; 
    } 

Текст этикетки не меняется, хотя ..:/

+0

Я думаю, что вы вызываете метод 'setStatus()' на некорректном экземпляре 'Form'. Вы создали новый экземпляр 'form', который еще не виден. – apocalypse

ответ

1

Я вижу код не создать DBConnect объект или вызвать его метод Connect(), и никакого кода, который делает объект Form видимым, например form.Show().

Помимо этого вы, вероятно, не должны создавать форму из метода Connect; вместо этого назовите Connect() из формы, например. в Form_Load(), пусть он вернет статус или лучше: объект conn (который вы сейчас выбрасываете после подключения), и заставьте Form_Load установить Label.Text на основе этого.

Пример кода:

private void Form1_Load(object sender, EventArgs e) 
{ 
    var conn = new DBConnect().Connect(); 
    if (conn != null && conn.State == ConnectionState.Open) 
    { 
     StatusTextLabel.Text = "Connected"; 
    } 
} 

public class DBConnect 
{ 
    public SqlConnection Connect() 
    { 
     SqlConnection conn = ... 
     // ... 
     return conn; 
    } 
} 
+0

. Вторая часть сделала трюк. Я передал данные классу Form, и я позволю ему внести изменения. –

+0

Теперь у меня есть этот код: 'MySqlDataAdapter MySqlDataAdapter = новый MySqlDataAdapter (« выберите * из заводов », connection.connection); MessageBox.Show (connection.connection.ToString()); DataSet DS = новый DataSet(); MySqlDataAdapter.Fill (DS); dataGridView1.DataSource = DS.Tables [0]; ' Но я получаю: Имя«dataGridView1»не существует в текущем контексте ошибки У меня есть DataGrid, но конечно же я хочу передать в него данные из MySQL –

+0

Вы должны в большинстве случаев делать вещи, относящиеся к объектам пользовательского интерфейса, из кода в форме. Объект пользовательского интерфейса не будет известен нигде. Вы можете поместить методы поиска данных в любом месте, но вам нужно просто вернуть данные, и именно там их ответственность прекращается. Затем код формы отправит данные в элементы пользовательского интерфейса. –

0

Передайте форму вместо создания новой.

private Form form {get;set;} 

public DBConnect(Form form) 
{ 
    this.form = form; 
} 

Тогда попробуйте это

form.Invoke(new MethodInvoker(() => form.setStatus())); 
+0

Это создает ошибку «Programm stopped working»! : P –

+0

Вам нужно передать форму в DBConnect, если вы хотите сделать это таким образом? Например, когда вы создаете соединение с БД, пропустите форму, затем используйте это – FakeCaleb

0

Вместо создания экземпляра новой формы, вы, вероятно, нужен экземпляр уже открытой форме и вызвать метод оттуда. Вы можете попробовать:

(System.Windows.Forms.Application.OpenForms["Form"] as Form).setStatus();