我正在为一个大学项目创建一个EPoS系统,但是我遇到了一个关于事件参数的复杂代码的砖墙。
这些代码片段位于处理交易结束的付款表格中。我已将PaymentMadeEvent声明为:
public delegate void PaymentMadeEvent(object sender, paymentMadeEventArgs e);
public event PaymentMadeEvent PaymentForm_PaymentMade;
接下来,我在代码页底部的单独公共类中声明了一个布尔值,如下所示:
public class paymentMadeEventArgs: EventArgs
{
private bool paymentSuccess = true;
public bool PaymentSuccess
{
get { return paymentSuccess; }
set { paymentSuccess = value; }
}
}
接下来,我复制了一段代码,用于在输入付款时处理付款:
private void PaymentHasBeenMade(object sender, EventArgs e)
{
try
{
total = decimal.Parse(txtBoxAmountToPay.Text) - decimal.Parse(txtBoxAmountTendered.Text);
}
catch
{
MessageBox.Show("An Error has occured, please enter a valid amount.");
return;
}
if(total >0)
{
txtBoxAmountToPay.Text = String.Format("{0:c}", total);
}
else
{
MessageBox.Show("Please give " + String.Format("{0:c}", -total) + " in change.");
PaymentForm_PaymentMade(this, new paymentMadeEventArgs(){ PaymentSuccess = true });
}
}
错误是
System.NullReferenceException
这似乎来自这条线:
PaymentForm_PaymentMade(this, new paymentMadeEventArgs(){ PaymentSuccess = true });
谁能看到我做错了什么?
提前致谢。
答案 0 :(得分:0)
在拥有订阅者之前,事件为空,因此您需要
if(PaymentForm_PaymentMade != null)
PaymentForm_PaymentMade(this,new paymentMadeEventArgs(){ PaymentSuccess = true })
这是特定代码模式的起源,首先是不在事件名称中重复表单的名称:
public event PaymentMadeEvent PaymentMade;
采用On<EventName>
方法,通常受到保护。
protected void OnPaymentMade(PaymentMadeEventArgs e)
{
if(this.PaymentMade != null)
this.PaymentMade(this,e);
}
然后你不必使用if(...)
if(total >0)
{
txtBoxAmountToPay.Text = String.Format("{0:c}", total);
}
else
{
MessageBox.Show("Please give " + String.Format("{0:c}", -total) + " in change.");
OnPaymentMade(new PaymentMadeEventArgs(){ PaymentSuccess = true });
}