2016-11-25 78 views
-1

我是C#上的总noob,我被困在更改其他类的状态标签文本。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); 
     } 
    } 
} 

这是我在Form类中创建的方法setStatus:

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

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

的标签文本虽然没有改变..:/

+0

我想你是不正确的'Form'实例调用'setStatus()'方法。您已创建新的“表单”实例,该实例尚不可见。 – apocalypse

回答

1

我看不出有任何的代码来创建一个DBConnect对象,或调用它的Connect()方法,并没有代码,使窗体对象可见,例如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 = new MySqlDataAdapter(“select * from factories”,connection.connection); MessageBox.Show(connection.connection.ToString()); DataSet DS = new DataSet(); MySqlDataAdapter.Fill(DS); dataGridView1.DataSource = DS.Tables [0];' 但我得到一个:在'dataGridView1的名字没有出现在目前情况下错误 我有一个DataGrid ofcourse存在,但我希望将数据从MySQL传递给它 –

+0

在大多数情况下,您应该从表单中的代码处理与用户界面对象有关的内容。 UI对象在别处不会被知道。您可以将数据检索方法放在任何你喜欢的地方,但它们应该简单地返回数据,这是他们责任停止的地方。然后,表单代码将数据发送到UI元素。 –

0

通过表单,而不是创建一个新的。

private Form form {get;set;} 

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

那就试试这个

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

这会创建一个“Programm停止工作”错误! :P –

+0

如果你想这样做,你需要将表单传递给DBConnect?例如,当你创建数据库连接,通过表单然后使用这个 – FakeCaleb

0

创建一个新的窗体的实例相反的,你可能需要已经打开窗体的实例,并从那里调用该方法。你可以尝试:

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