2015-07-03 1 views
5

У меня есть проблема, после добавления этого кода, так что я могу получить доступ управления MainWindow в Downloader класса:переполнение стека при попытке доступа к элементам управления формы из класса

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.StackOverflowException »произошло в System.Windows.Forms.dll» в строке

this.mainControlPanel.ResumeLayout(false); 

в MainWindow.Designer.cs. Если я прокомментирую код выше, он отлично работает. Любые идеи, пожалуйста?

PS. Кроме того, когда я нахожусь в классе Downloader, я должен получить доступ к элементам управления, таким как

textbox.Text 

или

_controlsRef.textbox.Text 

И, кажется, не дают никаких ошибок компиляции, есть ли разница между этими двумя?

ответ

3

Ваш 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); 
    } 
} 
+2

Я на самом деле удален наследование, и относятся к контролирует s _controlRef.control.attribute, и теперь он отлично работает. Благодаря :) – Januszoff

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

Мои хотят сказать, как вы наследуя Downloader из MainWindow, который в конструкторе Crating загрузчик 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 
} 
Смежные вопросы