2015-07-03 14 views
5

mam problem, po dodaniu tego kodu, dzięki czemu można uzyskać dostęp do moich kontrole MainWindow w klasie Downloader:przepełnienie stosu podczas próby dostępu do formantów formularzy z klasy

public partial class MainWindow : Form 
{ 
    private Downloader fileDownloader; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     fileDownloader = new Downloader(this); 
    } 
//smth 
} 

i

class Downloader : MainWindow 
{ 
    private MainWindow _controlsRef; 

    public Downloader(MainWindow _controlsRef) 
    { 
     this._controlsRef = _controlsRef; 
    } 
// smth 
} 

nim teraz daje mi "Nieobsługiwany wyjątek typu" System.StackOverflowException "wystąpił w System.Windows.Forms.dll" na linii

this.mainControlPanel.ResumeLayout(false); 

w MainWindow.Designer.cs. Jeśli skomentuję powyższy kod, działa poprawnie. Masz jakieś pomysły?

PS. Również, gdy jestem w klasie Downloader, mam dostęp kontrole jak

textbox.Text 

lub

_controlsRef.textbox.Text 

Oba wydają się dawać żadnych błędów kompilacji jest jakaś różnica między tymi dwoma?

Odpowiedz

3

Twoja klasadziedziczy po MainWindow. Po uruchomieniu go, zgodnie ze specyfikacją C#, najpierw zostaje zainicjowana klasa bazowa. Po zainicjowaniu MainWindow tworzy nową instancję z Downloader, co powoduje, że w końcu staje się stackoverflow, ponieważ jesteś w nieskończonej cyklicznej zależności.

Od Downloader dziedziczy MainWindow, nie ma sensu, aby uzyskać jego instancję za pośrednictwem konstruktora. Możesz po prostu uzyskać dostęp do jego elementów pochodnych od protected i public.

Na przykład:

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

i rzeczywiście usunięty dziedziczenia, oraz zapoznać się kontroluje s _controlRef.control.attribute i teraz działa dobrze. Dzięki :) – Januszoff

1

To problem, bo tutaj masz Zależność cykliczna tj zarówno metoda czekają na siebie, aby zakończyć.

check

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

moich powiedzieć jak jesteś dziedziczenie Downloader z MainWindow konstruktor, który w skrzynie downloader instace ... i downloader wywołuje konstruktor MainWindow najpierw jako jego rodzica kratownice problem dla was tutaj Rozwiązanie

jeśli chcą odwołać można zrobić, jak to

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 
} 
Powiązane problemy