2010-11-07 53 views
0

我想訪問Form1的事件處理程序在窗體2訪問事件處理程序之間有兩個形式

Form1的事件處理程序是: -

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 

如何實現的呢?

+0

我剛更新。 – 2010-11-07 17:03:39

回答

2

你在做錯事。

如果你想公開功能,你應該創建一個公共的方法/函數來做到這一點。您可以通過您的其他表單從您的事件處理程序中調用此方法。

+0

@Oded,我想你是對的,如果我修改「private」修飾符爲「公共」,而不是如何在form2中調用它。請舉一些例子。 – mahesh 2010-11-07 14:19:38

+0

@mahesh - 你不應該這樣暴露事件處理程序。如果你使用公共方法,你只需要引用它定義的對象並調用它。 – Oded 2010-11-07 14:20:15

+0

你能解釋一下你想做什麼? – 2010-11-07 14:24:22

0

將訪問修飾符更改爲public而不是private。

1

答案在評論你的問題更新,我沒有檢查其工作正常,可能是有一個與它的錯誤: 當你有一個類似的活動,你也可以通過不同的EventArgs這是非常有用的,最簡單的方法是成具有不同的屬性,它確定每一個表格,並在其set方法添加事件,但波紋管是一般

public abstract class FormBase : Form 
{ 
    public virtual event EventHandler MyEventHandler; 
} 

public class Form3 : FormBase 
{ 
    public override event EventHandler MyEventHandler; 
    Form2 instance; 
    public Form3() 
    { 
     instance = Form2.Instance; 
     instance[this.GetType().ToString()] = this; 
     // or 
     //instance["Form3"] = this; 
    } 

    private void dataGridView1_CellEndEdit(object sender, EventArgs e) 
    { 
     // todo 
     if (MyEventHandler != null) 
      MyEventHandler(this, e); 
    } 
} 

public class Form2 
{ 
    Dictionary<string, FormBase> dic = new Dictionary<string,FormBase>(); 

    public FormBase this[string index] 
    { 
     get 
     { 
      FormBase retVal = null; 
      if (dic.TryGetValue(index, out retVal)) 
       return retVal; 
      return null; 
     } 
     set 
     { 
      FormBase retVal = null; 

      if (value == null) 
       return; 

      if (dic.TryGetValue(index, out retVal)) 
      { 
       try 
       { 
        value.MyEventHandler -= MyEventHandler1; 
       } 
       catch 
       { 
       } 

       retVal = value; 

       retVal.MyEventHandler += MyEventHandler1; 
       return; 
      } 

      value.MyEventHandler += MyEventHandler1; 

      dic.Add(index, value); 
     } 
    } 

    private static Form2 instance; 
    public static Form2 Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new Form2(); 
      } 
      return instance; 
     } 
    } 

    private Form2() 
    { 
    } 

    private void MyEventHandler1(object sender, EventArgs e) 
    { 

    } 
}  
+0

@Saeed,你能告訴我,如果有兩種以上的表單需要訪問,而不是你的代碼有效嗎? – mahesh 2010-11-07 15:48:27

+0

@mahesh,是的,他們工作得很好,如果你有一個Form1的實例,你可以在任何地方使用它的事件,你可以複製和過去以上的代碼和多次使用它,這是一個基本的事件路由參見http:// msdn.microsoft.com/en-us/library/ms742806.aspx,這是WPF也可以從Win窗體中學習 – 2010-11-07 15:55:03

+0

@SaeedAlg,你說得對,多個實例可以做到這一點,但這裏是在你的代碼中,我看到你已經創建了兩個form1對象。一個是form2結構,另一個是form2結構。 – mahesh 2010-11-07 16:18:57

0

另一種選擇是解析在事件處理程序Form1Form2到:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     DataGridViewCellEventHandler dataGridViewCellEventHandler = new DataGridViewCellEventHandler(this.dataGridView1_CellEndEdit); 
     this.dataGridView1.CellEndEdit += dataGridViewCellEventHandler; 

     Form2 form2 = new Form2(); 
     form2.CellEndEdit += dataGridViewCellEventHandler; 
    } 

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     //Do something 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public event DataGridViewCellEventHandler CellEndEdit 
    { 
     add { dataGridViewOnForm2.CellEndEdit += value; } 
     remove { dataGridViewOnForm2.CellEndEdit -= value; } 
    } 
} 

然而,這需要Form1有權訪問Form2

+0

存在編譯錯誤,「名稱datagridview1在當前上下文中不存在」。我認爲form1 datagridview eventhandler不能訪問你的情況。 – mahesh 2010-11-07 15:33:47

+0

@mahesh,我沒有顯示所有的代碼。我在Form2上添加了另一個DataGridView(dataGridViewOnForm2)。我的geuss是你在Form1和Form2上都有一個DataGridView,並且想重用EventHandler? – 2010-11-07 15:47:03

+0

哦!不,我只有form1上有datagridview。我必須在form2中使用或訪問哪些事件。並再次在form1_load Event中將其替換爲form1。 – mahesh 2010-11-07 15:53:12

相關問題