我想訪問Form1的事件處理程序在窗體2訪問事件處理程序之間有兩個形式
Form1的事件處理程序是: -
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
如何實現的呢?
我想訪問Form1的事件處理程序在窗體2訪問事件處理程序之間有兩個形式
Form1的事件處理程序是: -
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
如何實現的呢?
將訪問修飾符更改爲public而不是private。
答案在評論你的問題更新,我沒有檢查其工作正常,可能是有一個與它的錯誤: 當你有一個類似的活動,你也可以通過不同的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)
{
}
}
@Saeed,你能告訴我,如果有兩種以上的表單需要訪問,而不是你的代碼有效嗎? – mahesh 2010-11-07 15:48:27
@mahesh,是的,他們工作得很好,如果你有一個Form1的實例,你可以在任何地方使用它的事件,你可以複製和過去以上的代碼和多次使用它,這是一個基本的事件路由參見http:// msdn.microsoft.com/en-us/library/ms742806.aspx,這是WPF也可以從Win窗體中學習 – 2010-11-07 15:55:03
@SaeedAlg,你說得對,多個實例可以做到這一點,但這裏是在你的代碼中,我看到你已經創建了兩個form1對象。一個是form2結構,另一個是form2結構。 – mahesh 2010-11-07 16:18:57
另一種選擇是解析在事件處理程序Form1
Form2
到:
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
存在編譯錯誤,「名稱datagridview1在當前上下文中不存在」。我認爲form1 datagridview eventhandler不能訪問你的情況。 – mahesh 2010-11-07 15:33:47
@mahesh,我沒有顯示所有的代碼。我在Form2上添加了另一個DataGridView(dataGridViewOnForm2)。我的geuss是你在Form1和Form2上都有一個DataGridView,並且想重用EventHandler? – 2010-11-07 15:47:03
哦!不,我只有form1上有datagridview。我必須在form2中使用或訪問哪些事件。並再次在form1_load Event中將其替換爲form1。 – mahesh 2010-11-07 15:53:12
我剛更新。 – 2010-11-07 17:03:39