2012-04-19 30 views
0

目前我正在從form2發送一個數組列表到表格1,它工作正常。在表格之間發送數組列表

Form1 form2 = new Form1(this, SampleArrayList); //pass form reference and an arraylist 
form2.Show(); 
this.Hide(); 

而在form1上我將SampleArrayList與本地數組列表關聯起來。

Form2 formParent; 
ArrayList SampleArrayList; 
public MainForm(Form2 par, ArrayList _SampleArrayList) 
{    
     InitializeComponent(); 
     this.formParent = par; 
     this.SampleArrayList = _SampleArrayList; 
} 

但是我想避免Form1中

form2 = new Form1(this, SampleArrayList); 

我想給數組列表到當前正在運行的Form1的實例創建新實例。什麼是最好的方式來做到這一點。謝謝

+0

由於您持有對'SampleArrayList'的引用,因此您爲什麼需要將它傳遞迴Form1? – 2012-04-19 16:06:19

+1

爲什麼使用'ArrayList'而不是'List '? – Servy 2012-04-19 16:07:43

+0

在某些時候,您需要創建一箇舊窗體的新實例,那麼您何時應該創建一個以及何時應該使用現有窗體? – Servy 2012-04-19 16:08:26

回答

1

報價:

Form1中首次創建,單擊Add按鈕創建窗體2。點擊 提交按鈕隱藏Form2並創建Form1的新實例以及我不想處置的 舊實例。我想單擊提交 按鈕並返回到Form1的運行實例。

那真是一個更大的問題。這是我喜歡的一個很好的解決方案。

public partial class Form1 : Form 
{ 
    private string dataFromThisForm; //can be whatever 
    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 otherForm = new Form2(); 
     //pass some data to other form 
     otherForm.SomeData = dataFromThisForm; 

     this.Hide(); 
     otherForm.Show(); 

     //when the other form is closed 
     otherForm.FormClosed += (sender2, e2) => 
     { 
      this.Show(); 

      string newData = otherForm.NewData; 
     }; 

     //when the other form is hidden. 
     otherForm.VisibleChanged += (sender2, e2) => 
     { 
      this.Show(); 

      string newData = otherForm.NewData; 
     }; 
    } 
} 
public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
     //Use SomeData to populate controls. 
    } 

    public string SomeData { get; set; } //data passed in from other form 

    public string NewData { get; private set; } //data to expose to other form 

    private void button1_Click(object sender, EventArgs e) 
    { 
     NewData = "SomeDataToPassToForm1"; 
     //this.Close(); 
     this.Hide(); 
    } 
} 

的幾個注意事項:

  • 你傳遞一個ArrayList周圍,而不是字符串,因爲我在 這個例子一樣。 ArrayList是可變參考類型,而 string是不可變的。這意味着您可以修改傳遞給Form2的 ArrayList,這些更改將反映在 Form1中的變量中,因爲它們都指向相同的底層 ArrayList。我在這裏留下了這個代碼,因爲它涵蓋了一般情況 。
  • 你說當你點擊提交按鈕時你隱藏Form2。 通常在這個設計中,你會關閉它,因爲它不再需要 。如果你真的不打算再次使用它,我建議關閉 它。如果你真的打算再次展示該表單,那麼只需隱藏 就可以了。
  • 如果您在提交時關閉Form2,將觸發FormClosing事件,如果您只隱藏它,則會觸發Visible事件。您可能應該根據 刪除我的代碼中的這兩個事件處理程序中的一個,無論您是真正關閉還是隱藏它。如果你有時做一個,有時另一個則隨意離開這兩個。如果您只使用 ,那麼您實際上不會對任何東西造成傷害(除了令人困惑的人)。
+0

謝謝。這有幫助 – GuyWhoReadsStockoverflow 2012-04-19 17:37:39

+0

沒問題。這是winform出現的一個非常常見的問題,因此有很多不同的解決方案。有些是可以的,但是從設計的角度來看,其中很多人真的很窮。 (也就是說,在這個線程中的建議就是開始讓東西變成靜態的,而不是適當地確定一切範圍。) – Servy 2012-04-19 17:40:59

0

我會向Form1中添加一個方法來接受Array列表。

喜歡的東西:

public void Setup(ArrayList SampleArrayList) 
{ 
    // Do what you need here... 
} 

然後,你可以從你的構造函數中調用這個方法(保持構造相同),並調用安裝程序時,你需要改變的形式使用列表。

你上面的代碼會是這樣的:

// If you needed a new instance of Form1, it wouldn't change 
Form1 form2 = new Form1(this, SampleArrayList); //pass form reference and an arraylist 
form2.Show(); 
this.Hide(); 

// If you already had an instance in the form2 variable 
form2.Setup(SampleArrayList); 

無論什麼時候,如果你使用的是.NET 2.0或更高版本,我會建議使用一個通用的列表存儲列表數據,而不是ArrayList中。

+0

不起作用它仍然每次創建新實例 – GuyWhoReadsStockoverflow 2012-04-19 16:27:32

+0

當您創建新實例取決於您時 - 如果在創建它之後保留對該表單的引用,則可以使用我建議給它的'Setup'方法一個新的ArrayList。 (也許你需要在'Form1'中將'form2'變量設置爲一個私有字段,所以你可以追蹤你是否已經創建了這個表單。) – davisoa 2012-04-19 17:25:37

1

在您的應用程序中充當通信平臺的靜態類可以解決問題,或者兩個表單都可以由同一個對象擁有。

+0

我有一個靜態類 – GuyWhoReadsStockoverflow 2012-04-19 16:21:51

+0

如果你創建一個靜態類並且創建數組一個公共的靜態屬性,你可以從程序中的任何類/表單中獲取該數組。當然,那麼你的form2不再需要它的構造函數中的數組了,因爲它可以從靜態類中獲得它。 – 2012-04-19 19:43:10

0

如果您不需要創建它的實例,則可以在Form1類中編寫靜態屬性。例如:

private static ArrayList _SampleArrayList; 
public static ArrayList SampleArrayList 
{ 
    get { return _SampleArrayList; } 
    set { _SampleArrayList = value; } 
} 

,當你想更新ArrayList寫簡單:

Form1.SampleArrayList = SampleArrayList; 

PS:我建議你使用List<>而不是ArrayList

如果您不知道類型而不是ArrayList使用List<object>否則List<T>

編輯:

如果Form1中窗口2是同一類的既有istance你只需要做出ArrayList靜態的。在上述意見OP的

+0

但如果sampleArrayList已經在form2中聲明,這將如何工作 public ArrayList sampleArrayList = new ArrayList(); – GuyWhoReadsStockoverflow 2012-04-19 16:37:28

+0

如果已經創建,則傳遞ArrayList。所以創建它後寫入'Form1.SampleArrayList = sampleArrayList;'。 – 2012-04-19 17:04:37

+0

但我不能傳遞數組而不創建新的表單。有沒有什麼辦法可以將它傳遞給現有的表單。 – GuyWhoReadsStockoverflow 2012-04-19 17:13:57