尝试访问默认表单按钮时,“...需要对象引用”

时间:2010-11-17 08:20:54

标签: c# winforms

我正在尝试从同一应用程序中的其他线程访问默认创建表单上的按钮。但是,我收到了错误

  

非静态字段,方法或属性'BElite.Form1.testButton1'

需要对象引用

其中Form1是创建的默认表单,testButton1是我想要更改我的帖子文本的测试按钮。

我知道我需要获得对Form1对象的引用...但我不知道如何!

请帮忙。

2 个答案:

答案 0 :(得分:0)

此链接可能对您有所帮助,因为问题有点类似:

Best way to access a control on another form in Windows Forms?

答案 1 :(得分: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()从其他主题访问这些控件。有关原因和方法,请参阅有关这些方法的文档。

  3. 您可以使用BeginInvoke()使用以下示例访问该按钮:

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

    区块中的所有内容({ ... })都是安全的。