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