[英]Stack Overflow when trying to access form controls from class
我有一个问题,添加此代码后,我可以在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。 此外,当我在Downloader类时,我应该访问像这样的控件
textbox.Text
要么
_controlsRef.textbox.Text
两者似乎都没有给出编译错误,两者之间有什么区别吗?
您的Downloader
类继承MainWindow
。 当您对其进行实例化时,根据C#规范,首先初始化基类。 当MainWindow
初始化时,它会创建一个新的Downloader
实例,这会使它最终成为stackoverflow,因为你处于无限循环依赖状态。
由于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时,在构造函数caging downloader instace中...并且下载器首先调用Mainwindow构造函数,因为它的父包装问题在这里解决方案
如果想要参考,你可以这样做
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.