c#空引用导致自定义EventArgs出现问题

时间:2016-03-24 16:52:51

标签: c# eventargs

我正在为一个大学项目创建一个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 });

谁能看到我做错了什么?

提前致谢。

1 个答案:

答案 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 });
}