2011-04-24 79 views
1

我使用委託在兩個表格之間傳遞數據 MainForm;如何在2表單之間傳遞數據?

public delegate void PassData(ListViewItem itemss); 
public PassData passdata; 
private void ViewList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
     passdata(ViewList.FocusedItem); 
} 
call PropertiesForm 
Properties1 pro = new Properties1();    
     pro.Show(); 

在窗口2

public void f_pass(ListViewItem item) 
    { 
     this.item = item; 
    } 
    private void Properties1_Load(object sender, EventArgs e) 
    { 
     Main main = new Main(); 
     main.passdata += new Main.PassData(f_pass); 
    } 

當運行它有一個錯誤是在passdata(ViewList.FocusedItem)null對象;

+0

當你調用passdata()。你可以告訴我一些更多的細節 – 2011-04-24 19:08:18

+0

我調用passwata(ViewList.FocusedItem)在主窗體的私人無效ViewList_SelectedIndexChanged – giaosudau 2011-04-24 19:11:19

+0

可能重複的[在winforms之間傳遞變量](http://stackoverflow.com/questions/4247807/passing-variable-在-Winforms之間) – 2011-04-24 19:18:21

回答

1

您可以爲要傳遞數據的表單創建另一個構造函數。構造函數將接受您想要的數據類型的參數,但要確保你使用

: base() 
+0

但我想用代理 – giaosudau 2011-04-24 19:34:45

1

看來你是電話委託befor創建它調用默認的構造函數。據我瞭解正確您打算將數據從MainForm傳遞到PropertiesForm但初始化僅在PropertiesForm加載期間發生。它很可能是你有問題的建築,但現在只是試圖改變自己的ViewList_SelectedIndexChanged方法如下:

public PassData passdata = null; 
private void ViewList_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if(passdata != null) 
    { 
     passdata(ViewList.FocusedItem); 
    } 
} 
+0

我已經做了這個但是如果使用if(passdata!= null)它不會在2個表單之間傳遞數據? – giaosudau 2011-04-24 19:35:48

+0

是的,直到初始化它纔會傳遞數據。試着在'if'上設置斷點,你會發現它是否被初始化 – 2011-04-25 06:55:48

0

我覺得形式之間傳遞的數據是不是一個好主意。嘗試使用一些中間人來包含數據。

0

做這種方式,

public partial class Main : Form 
{ 
    public delegate void PassData(ListViewItem itemss); 
    public static event PassData PassDataEvent; 

    private void ViewList_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (PassDataEvent != null) 
     { 
      PassDataEvent(ViewList.FocusedItem); 
     } 
    } 
} 

public partial class Properties1 : Form 
{ 
    public Properties1() 
    { 
     InitializeComponent(); 
     this.Load += new EventHandler(Main_Load); 
    } 

    void Properties1_Load(object sender, EventArgs e) 
    { 
     Main.PassDataEvent += new Main.PassData(Main_PassDataEvent); 
    } 

    void Main_PassDataEvent(ListViewItem itemss) 
    { 
     //do your logic. 
    } 
}