簡體   English   中英

聽取從不同winform觸發的自定義事件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM