尝试从类访问表单控件时堆栈溢出

时间:2015-07-03 09:00:45

标签: c#

我有一个问题,在添加此代码后,我可以在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

两者似乎都没有编译错误,两者之间有什么区别吗?

2 个答案:

答案 0 :(得分:3)

您的Downloader班级继承了MainWindow。当您对其进行实例化时,根据C#规范,首先初始化基类。当MainWindow初始化时,它会创建一个Downloader的新实例,这会使它最终成为stackoverflow,因为你处于无限循环依赖中。

由于Downloader继承了MainWindow,因此通过构造函数获取它的实例是没有意义的。您只需从派生的protectedpublic成员访问它。

例如:

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);
    }
}

答案 1 :(得分:1)

这是问题,因为在这里你有循环依赖,即两种方法都在等待彼此完成。

检查

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
}