繁体   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