[英]Error: An object reference is required for the non-static field, method, or property
[英]An object reference is required for the non-static field, method or property error
我正在开发C#Windows窗体应用程序,并且在主窗体上有一个TabControl。 在Form1.Designer.cs文件中声明它,如下所示:
public System.Windows.Forms.TabControl logFileCollectorTabControl;
在我项目的另一个类文件中,我想按以下方式使用此TabControl:
logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage);
但是我收到错误消息“非静态字段,方法或属性错误需要对象引用”。 所以我的问题是,必须在某个地方声明一个Form类的对象,因为在启动应用程序时会启动该窗体,因此,如何确定其含义或如何解决此问题,我们将不胜感激!
通常可以通过将Form1的实例传递给调用类的构造函数,然后将其保留在字段中直到需要时来克服。
//somewhere in Form1
OtherClass other = new OtherClass (this);
// OtherClass.cs
class OtherClass {
Form1 _opener;
public OtherClass(Form1 opener) {
_opener = opener;
}
}
您的其他班级是否知道logFileCollectorForm?
如果您没有将对表单的引用传递给另一个类,则另一个类将不知道logFileCollectorForm引用了什么。
//example of another class
class AnotherClass
{
Form1 logFileCollectorForm;
public AnotherClass(Form1 logFileCollectorForm)
{
this.logFileCollectorForm = logFileCollectorForm;
}
public DoSomething(String newTabPage)
{
logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage);
}
}
可能不需要传递整个表单的实例,您可以仅传递对TabControl
的引用。 但是我认为这仍然是一个糟糕的设计。 您的逻辑应与UI分开。 如果您的班级执行了一些计算,数据库操作或其他操作,那么它实际上根本就不必“知道”您的窗口,因为这很不灵活。 改为实施一个事件。
另一种选择是在Program
类中保留对主窗体的静态引用。
static class Program
{
internal static Form1 MainForm { get; set; }
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
MainForm = new Form1();
Application.Run(MainForm);
}
}
class OtherClass
{
public void AddNewTab(TabPage newTabPage)
{
Program.MainForm.logFileCollectorTabControl.TabPages.Add(newTabPage);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.