尝试从类访问窗体控件时使用c#
本文关键字:控件 窗体 访问 | 更新日期: 2023-09-27 18:00:53
我有一个问题,在添加了这段代码之后,我可以访问Downloader类中的MainWindow控件:
public partial class MainWindow : Form
{
private Downloader fileDownloader;
public MainWindow()
{
InitializeComponent();
fileDownloader = new Downloader(this);
}
//smth
}
和
class Downloader : MainWindow
{
private MainWindow _controlsRef;
public Downloader(MainWindow _controlsRef)
{
this._controlsRef = _controlsRef;
}
// smth
}
它现在在行上给我"System.Windows.Forms.dll中发生了类型为System.StackOverflowException的未处理异常">
this.mainControlPanel.ResumeLayout(false);
在MainWindow.Designer.cs中。如果我注释掉上面的代码,它就可以正常工作。有什么想法吗?
PS。此外,当我在下载程序类中时,我应该访问像这样的控件吗
textbox.Text
或
_controlsRef.textbox.Text
两者似乎都没有出现编译错误,两者之间有什么区别吗?
您的Downloader
类继承了MainWindow
。当您安装它时,根据C#规范,基类首先被初始化。当MainWindow
初始化时,它会创建一个Downloader
的新实例,这会导致它最终堆叠,因为您处于一个无休止的循环依赖关系中。
由于Downloader
继承了MainWindow
,因此通过构造函数获取它的实例是没有意义的。您可以简单地从派生中访问它的protected
和public
成员。
例如:
public partial class MainWindow : Form
{
protected string Bar { get; set; }
public MainWindow()
{
Bar = "bar";
InitializeComponent();
}
}
public class Downloader : MainWindow
{
public void Foo()
{
// Access bar:
Console.WriteLine(Bar);
}
}
这是个问题,因为这里有循环依赖性,即两个方法都在等待对方完成。
检查
public MainWindow()
{
InitializeComponent();
fileDownloader = new Downloader(this);//this wait to complete downloader intialization
}
public Downloader(MainWindow _controlsRef)//this wait to complete mainwindow first
{
this._controlsRef = _controlsRef;
}
我的意思是说,当你从MainWindow继承Downloader时,它在构造函数中装入了下载程序。。。下载程序首先调用Mainwindow构造函数作为它的父crates问题解决方案
如果需要参考,你可以这样做
public partial class MainWindow : Form
{
protected MainWindow mainWindow;
public MainWindow()
{
InitializeComponent();
mainWindow = this;
}
//smth
}
class Downloader : MainWindow
{
public Downloader()
{
//this.mainWindow //will give you reference to main winsow
}
// smth
}