2011-09-07 56 views
0

我的C#代碼存在問題。目前我嘗試使用多個窗口編程Windows窗體應用程序。 現在我的問題:Public LinkedList

在第一個窗口我有一些值的組合框。當我點擊一個按鈕時,第二個窗口打開,應該可以在第一個窗體上爲此組合框添加一個值。

的問題是,在第一個窗口從來就一個LinkedList在我的值在

這樣的:

public LinkedList<String> sample = new LinkedList<String>(); 


hase.AddFirst("test"); 
combobox.Items.AddRange(sample.ToArray()); 

現在,在第二個窗口中的LinkedList的不可用,即使我公開。 解決這個問題的最好方法是什麼?

希望你能理解我的問題......

哈拉爾

+1

你如何訪問其他窗口中的鏈接列表?你的LinkedList是一個實例變量。您需要將鏈接列表傳遞給新窗口(或傳遞整個窗口) - 靜態訪問它不起作用。 – vcsjones

回答

0

不知道如何嘗試訪問LinkedList,很難說爲什麼它不適合你。

讓我們來看看你有什麼。你有一個LinkedList,它是一個表單上的一個實例變量。由於這個LinkedList是一個實例變量,因此它與窗體的實例相關聯。

下面這個例子,將工作,因爲它試圖靜態訪問:

public class MyForm : Form 
{ 
    public LinkedList<string> _list = new LinkedList<string>(); 
} 

public class MySecondForm : Form 
{ 
    public void Window_Loaded(object sender, EventArgs e) 
    { 
     MyForm._list.AddFirst("This doesn't work"); 
     //WRONG! list is an instance variable we are trying to access statically. 
    } 
} 

所以,我們可以看到這是行不通的。我們有幾個選項來實現這個工作。首先,一個非常糟糕的解決方案將實際上使list靜態。不要使用這個選項。它爲併發問題打開了大門,可能泄露強引用等。一般來說,使用靜態(如單例),我會因爲這些原因而不願意傳遞數據。 Singleton模式有時間和地點,但我不認爲這是它,因爲它很容易避免。

好的,既然我們得到了不好的解決方案,讓我們看看幾個可能的好方法。

MySecondForm上設置列表。你有幾個選擇。構造函數,屬性或方法。例如:

public class MyForm : Form 
{ 
    private LinkedList<string> _list = new LinkedList<string>(); 

    public void Button1_Click(object sender, EventArgs e) 
    { 
     var secondForm = new MySecondForm(); 
     secondForm.SetList(_list); 
     secondForm.ShowDialog(); 
     MessageBox.Show(_list.First.Value); 
    } 
} 

public class MySecondForm : Form 
{ 
    private LinkedList<string> _list; 

    public void Window_Loaded(object sender, EventArgs e) 
    { 
     this._list.AddFirst("This will work"); 
    } 

    public void SetList(LinkedList<string> list) 
    { 
     _list = list; 
    } 
} 

這是一種可能的解決方案。構造函數是Billy建議的另一種可能的解決方案。

由於LinkedList是引用類型,因此您對MySecondForm實例所做的任何更改都將反映在MyForm的鏈接列表中。

+0

謝謝你,這已經解決了我的問題!實際上很簡單:) – user896692

+0

@ user896692沒問題。確保通過點擊幫助你的答案旁邊的複選標記來將答案標記爲答案。 – vcsjones

0

您可以隨時將其傳遞給第二個窗口。正如vcsjones指出的那樣,如果你重新分配列表,你應該只需要添加ref關鍵字。您將需要一個構造函數,它將鏈接列表作爲變量。

SecondWindow secondWindow = new SecondWindow(sample); 

另一種方法是使用singleton pattern創建一個類,你可以放置在裏面的鏈接列表。如果它位於一個共同的位置,那麼您可以從兩個窗口訪問它。

+3

你不應該通過引用來傳遞它,它已經是一個引用類型。這將用於的唯一目的是如果你想實際重新分配鏈接列表到一個新的。 – vcsjones

+0

非常真實,它應該沒有參考。我會更新。 – Billy