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