2011-09-07 8 views
0

C# 코드에 문제가 있습니다. 지금은 하나 이상의 Window가있는 Windows Forms 응용 프로그램을 프로그래밍하려고합니다. 이제 내 문제 :Public LinkedList

첫 번째 창에는 몇 가지 값이있는 콤보 박스가 있습니다. 버튼을 클릭하면 두 번째 창이 열리고 첫 번째 양식에서이 콤보 상자에 값을 추가 할 수 있어야합니다.

문제는 첫 번째 창에서 내 값으로되어 LinkedList의를 I've이다 이와 같이

:.

이제
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을 정적으로 만드는 것입니다. 이 옵션을 사용하지 마십시오. 이것은 동시성 문제에 대한 문을 열어 아마도 강력한 참조가 누출 될 수 있습니다. 일반적으로 통계 (예 : 싱글 톤)를 사용하면 이러한 이유로 데이터를 전달하지 않을 것입니다. 싱글 톤 패턴은 시간과 장소가 있지만, 그렇게 쉽게 피할 수 있기 때문에 이것이라고 생각하지 않습니다.

좋아요, 우리가 나쁜 해결책을 얻었으므로 몇 가지 좋은 것들을 살펴 봅시다.

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