听取从不同winform触发的自定义事件

时间:2013-12-22 14:59:20

标签: c# winforms visual-studio

我正在开发一个图书管理员应用程序(在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
                        }
                    }
                }
            }
        }

}

2 个答案:

答案 0 :(得分:3)

您可以订阅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;
}

答案 1 :(得分:1)

您可以通过活动来完成。但为什么这么麻烦呢?为什么不在预订成功时简单刷新列表。无论如何,你已经采用了正确的方法。

修改 像这样:

...        
if (MessageBox.Show("Je hebt dit item al gereserveerd!") == DialogResult.OK)
{
    <Refresh list>
}    
...

编辑2
似乎我误解了这个问题。如果要刷新的列表位于另一个表单中,那么您将在打开时为第二个表单提供对它的引用。

在第二种形式中,您将声明一个引用表单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>
}