尝试从类访问窗体控件时使用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

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

尝试从类访问窗体控件时使用c#

您的Downloader类继承了MainWindow。当您安装它时,根据C#规范,基类首先被初始化。当MainWindow初始化时,它会创建一个Downloader的新实例,这会导致它最终堆叠,因为您处于一个无休止的循环依赖关系中。

由于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时,它在构造函数中装入了下载程序。。。下载程序首先调用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
}