繁体   English   中英

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

[英]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 ,因此通过构造函数获取它的实例是没有意义的。 您只需从派生的访问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);
    }
}

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

校验

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM