我正在开发一个C#windows窗体应用程序,在主窗体上我有一个TabControl。它在Form1.Designer.cs文件中声明如下:
public System.Windows.Forms.TabControl logFileCollectorTabControl;
在我项目的另一个类文件中,我想使用此TabControl,如下所示:
logFileCollectorForm.logFileCollectorTabControl.TabPages.Add(newTabPage);
但我收到错误'非静态字段,方法或属性错误需要对象引用'。所以我的问题是,必须有一个Form类的对象在某处声明,因为当我启动应用程序时窗体会启动,所以如何找出它是什么,或者如何解决这个问题,非常感谢任何帮助!
答案 0 :(得分:1)
这通常是通过将Form1的实例传递给调用类的构造函数,然后将其保存在字段中直到需要来克服的。
//somewhere in Form1
OtherClass other = new OtherClass (this);
// OtherClass.cs
class OtherClass {
Form1 _opener;
public OtherClass(Form1 opener) {
_opener = opener;
}
}
答案 1 :(得分:1)
您的其他班级是否了解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);
}
}
答案 2 :(得分:1)
可能无需传递整个表单的实例,您只能将引用传递给TabControl
。但在我看来,这仍然是糟糕的设计。您的逻辑应该与UI分开。如果你的类执行一些计算,数据库操作或者不执行某些操作,它根本不应该“知道”你的窗口,因为这是不灵活的。实现一个事件。
答案 3 :(得分:0)
另一个选择是在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);
}
}