[英]Listening for a custom event fired from different winform
我正在開發一個圖書管理員應用程序(在Visual Studio 2013,C#中),它允許雇主為客戶貸款,退貨和預訂圖書。 創建,觸發和偵聽自定義事件存在一個小問題。
有一種形式可以將數據添加到我的數據庫中的所謂Reservartion表中。 它添加了包含當前日期,itemID和其他數據的記錄。
當添加完成后,我想觸發一個自定義事件,該事件將從另一個表單中被監聽。 觸發此事件時,我需要在觸發事件時顯示預留表中的總數據。
我在我的主窗體中使用了一個onclick方法,它打開一個新的表單,輸入數據,之后,如上所述,添加到數據庫中。 添加數據后,表單將關閉,主窗體將再次獲得焦點。
現在唯一的問題是,當所有這一切都完成后,我需要在Reservartion表中顯示整個數據(它需要刷新自己)。 這是我需要舉辦活動的地方。
如何在一個表單中創建自定義事件,這將監聽INSIDE和onclick方法?
我提供了一些代碼供參考。
這是來自主窗體buttonclick的代碼:
private void btnToevoegR_Click(object sender, EventArgs e)
{
Forms.HandAddReserveer HAR = new Forms.HandAddReserveer();
HAR.Show();
// listen for event raised
// When event is raised do this
DataTable DT = DBReserveer.getAllReserveerItems();
gvUitleen.DataSource = DT;
}
而在另一種形式,應該提出事件
private void button1_Click(object sender, EventArgs e)
{
int pasID;
int itemID;
if (int.TryParse(tbItemID.Text, out itemID))
{
if (int.TryParse(tbPasID.Text, out pasID))
{
if ((DBReserveer.ReserveerPasCheck(itemID, pasID)) != 0)
{
MessageBox.Show("Je hebt dit item al gereserveerd!");
}
if ((DBReserveer.ReserveerPasCheck(itemID, pasID)) == 0)
{
if (MessageBox.Show("Weet je zeker dat je dit item wilt reserveren?", "Reserveren?", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
DBReserveer.ReserveerItem(itemID, pasID);
if (DBReserveer.QueryStatus == true)
{
MessageBox.Show("Het item is gereserveerd!");
// Event should be raised from here
}
}
}
}
}
}
您可以訂閱HAR的FormClosed
事件。
private void btnToevoegR_Click(object sender, EventArgs e)
{
Forms.HandAddReserveer HAR = new Forms.HandAddReserveer();
HAR.FormClosed += new FormClosedEventHandler(HAR_FormClosed);
HAR.Show();
}
private void Har_FormClosed(Object sender, FormClosedEventArgs e) {
DataTable DT = DBReserveer.getAllReserveerItems();
gvUitleen.DataSource = DT;
}
另一種方法是在表單中創建正在關閉的on事件:
public event EventHandler<EventArgs> ReservationComplete;
protected virtual void OnReservationComplete()
{
EventHandler<EventArgs> handler = this.ReservationComplete;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
通過添加對OnReservationComplete()
的調用來提升事件
if (DBReserveer.QueryStatus)
{
MessageBox.Show("Het item is gereserveerd!");
this.OnReservationComplete();
// Event should be raised from here
}
並聽取這樣的事件(我不確定+ =語法是否正確。我正在編寫我的頭頂代碼。隨意糾正):
private void btnToevoegR_Click(object sender, EventArgs e)
{
Forms.HandAddReserveer HAR = new Forms.HandAddReserveer();
HAR.ReservationComplete += Har_ReservationComplete;
HAR.Show();
}
private void Har_ReservationComplete(Object sender, EventArgs e) {
DataTable DT = DBReserveer.getAllReserveerItems();
gvUitleen.DataSource = DT;
}
編輯:第三個選項。 您可以將第二種形式顯示為模態。
private void btnToevoegR_Click(object sender, EventArgs e)
{
Forms.HandAddReserveer HAR = new Forms.HandAddReserveer();
HAR.ShowDialog();
DataTable DT = DBReserveer.getAllReserveerItems();
gvUitleen.DataSource = DT;
}
你可以用一個事件做到這一點。 但為什么這么麻煩呢? 為什么不在預訂成功時簡單刷新列表。 無論如何,你已經采用了正確的方法。
編輯像這樣:
...
if (MessageBox.Show("Je hebt dit item al gereserveerd!") == DialogResult.OK)
{
<Refresh list>
}
...
編輯2
好像我有點誤解了這個問題。 如果list-to-refresh位於另一個表單中,那么您將在打開時為第二個表單提供對它的引用。
在第二種形式中,您將聲明一個引用Form 1的屬性:
public partial class Form2
{
public Form1 CallingForm { get; set; }
...
...在打開Form2時設置此引用...
private void btnToevoegR_Click(object sender, EventArgs e)
{
Forms.HandAddReserveer HAR = new Forms.HandAddReserveer();
HAR.CallingForm = this;
...
...最后第二個Form將在關閉時調用Form1上的Refresh操作:
if (MessageBox.Show("Je hebt dit item al gereserveerd!") == DialogResult.OK)
{
CallingForm.<Refresh list>
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.