非静态字段、方法或属性错误需要对象引用
本文关键字:错误 对象引用 属性 静态 字段 方法 | 更新日期: 2023-09-27 18:13:32
我正在开发一个c# windows窗体应用程序,在主窗体上我有一个TabControl。它在form . designer .cs文件中声明如下:
public System.Windows.Forms.TabControl logFileCollectorTabControl;
在我的项目中的另一个类文件中,我想这样使用这个TabControl:
logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage);
但是我得到错误'一个对象引用是非静态字段,方法或属性错误的要求'。所以我的问题是,必须有一个窗体类的对象声明在某个地方,因为表单启动时,我启动应用程序,所以我怎么知道那是什么,或者我怎么能解决这个问题,任何帮助是非常感谢!
通常通过将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);
}
}