2010-11-17 41 views
1

我试图从同一应用程序中的其他线程访问我的默认创建表单上的按钮。然而,我得到“试图访问默认表单按钮时需要一个对象引用...”

一个对象引用是所必需的误差非静态字段,方法或属性“BElite.Form1.testButton1”

其中默认表单创建Form1testButton1是我想从我的线程中更改文本的测试按钮。

据我所知,我需要得到Form1对象的引用......但我不知道如何!

请帮忙。

+0

您是否从Form对象的方法内启动线程?显示一些代码。 – Henrik 2010-11-17 08:28:15

回答

0

你引用testButton1就像是一个静态字段,而不是一个实例字段。您需要能够访问表单的实例。你可以这样做是这样的:

public partial class Form1 : Form 
{ 
    public static Form1 Instance { get; private set; } 

    public Form1() 
    { 
     InitializeComponent(); 

     if (Instance != null) 
      throw new Exception("Only one instance of Form1 is allowed"); 

     Instance = this; 

     FormClosed += new FormClosedEventHandler(Form1_FormClosed); 
    } 

    void Form1_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     Instance = null; 
    } 

    public Button TestButton1 { get { return testButton1; } } 
} 

由于窗体上的控件默认保护,你必须做出的按钮访问。您可以使用TestButton1属性执行此操作。

现在您可以使用BElite.Form1.Instance.TestButton1访问文本框。

有两点需要注意:

  1. ,如果你总是有一个Form1,例如当Form1是应用程序的主要形式,这只能;

  2. 请注意,从不同的线程访问这些控件必须使用Control.Invoke()Control.BeginInvoke()来完成。有关这些方法的原因和方法,请参阅文档。

您可以访问使用BeginInvoke()与下面的示例按钮:

Form1.Instance.BeginInvoke(new Action(() => 
{ 
    Form1.Instance.TestButton1.Text = "My new text"; 
})); 

一切都在块({ ... })是安全的。

+0

这是使用默认窗体设计器创建的,所以...我在两个地方有一个“public partial class Form 1”...在Main Control.cs和Main Control.Designer.cs中......这会影响任何东西吗? – Jason 2010-11-17 08:41:56

+0

好吧,如果我理解这个权利...表单的实际创建是在公共Form1(){InitializeComponent();}是否正确?另外...在自动创建的代码中,它是InitializeComponent,而不是InitializeComponents ...“s”是否改变了什么? – Jason 2010-11-17 08:45:11

+0

(小)主代码的pastebin位于:http://pastebin.com/FyCKKqd8 ..它现在给我一个错误,即testButton由于保护级别而无法访问......我的唯一其他文件项目到目前为止是窗体设计器创建的默认文件 – Jason 2010-11-17 08:49:45

相关问题