C# &引用;“需要对象引用…”;尝试访问默认窗体按钮时

C# &引用;“需要对象引用…”;尝试访问默认窗体按钮时,c#,winforms,C#,Winforms,我试图从同一应用程序中的不同线程访问默认创建表单上的按钮。然而,我得到了错误 非静态字段、方法或属性“BElite.Form1.testButton1”需要对象引用 其中,Form1是创建的默认表单,testButton1是我要从线程中更改文本的测试按钮 我知道我需要以某种方式获得对Form1对象的引用。。。但是我不知道怎么做 请帮助。您引用的是testButton1,就像它是一个静态字段而不是实例字段一样。您需要能够访问表单的实例。您可以这样做: public partial class Fo

我试图从同一应用程序中的不同线程访问默认创建表单上的按钮。然而,我得到了错误

非静态字段、方法或属性“BElite.Form1.testButton1”需要对象引用

其中,
Form1
是创建的默认表单,
testButton1
是我要从线程中更改文本的测试按钮

我知道我需要以某种方式获得对
Form1
对象的引用。。。但是我不知道怎么做


请帮助。

您引用的是
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
访问文本框

注二:

  • 仅当您始终有一个
    Form1
    时,例如当
    Form1
    是应用程序的主要表单时,此选项才有效

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

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

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

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

    是否从表单对象的方法中启动线程?显示一些代码。这个链接可能会帮助你,因为问题有点类似:这是使用默认的表单设计器创建的,所以。。。我在两个地方有一个“公共部分课程表1”。。。在Main Control.cs和Main Control.Designer.cs中。。。这会影响什么吗?好吧,如果我理解正确的话。。。表单的实际创建位于public Form1(){InitializeComponent();}正确吗?也。。。在自动创建的代码中,它是InitializeComponent,而不是InitializeComponents。。。“s”改变了什么吗?一个(小)主代码的粘贴箱位于。。它现在给我一个错误,testButton由于保护级别而无法访问。。。到目前为止,我的项目中唯一的另一个文件是由表单设计人员创建的默认文件,通过添加
    TestButton1
    属性更新了答案。这个静态属性不是一个好主意。如果在表单关闭后忘记将其设置为null,则始终会有对表单的引用,并且GC无法收集该引用。