gpt4 book ai didi

c# - 监听从不同 winform 触发的自定义事件

转载 作者:太空宇宙 更新时间:2023-11-03 21:38:07 24 4
gpt4 key购买 nike

我正在开发一个图书管理员应用程序(在 Visual Studio 2013 中,C#),它允许雇主为客户借出、归还和保留书籍。创建、触发和监听自定义事件时存在一个小问题。

在我的数据库中,有一种表单可以将数据添加到所谓的预订表中。它添加了一条包含当前日期、itemID 和其他数据的记录。

添加完成后,我想触发一个自定义事件,该事件将从不同的表单中监听。触发此事件后,我需要在触发事件时显示预订表中的总数据。

我在我的主窗体中使用了一个 onclick 方法,它会打开一个新窗体,其中将输入数据,然后如上所述,将数据添加到数据库中。添加数据后,窗体关闭,主窗体再次获得焦点。

现在唯一的问题是,完成所有这些后,我需要将预订表中的全部数据显示在屏幕上(它需要自行刷新)。这是我需要引发事件的地方。

我如何以一种形式创建一个自定义事件,它将在 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;
}

关于c# - 监听从不同 winform 触发的自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20730697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com