2016-03-24 9 views
0

Ich erstelle ein EPoS-System für ein Universitätsprojekt, aber ich bin in eine Mauer gerannt mit einem komplexen Code, der Ereignisargumente betrifft.C# Nullreferenz, die Probleme bei benutzerdefinierten EventArgs verursacht

Diese Codeabschnitte befinden sich auf einem Zahlungsformular, das das Ende einer Transaktion behandelt. Ich habe die PaymentMadeEvent als so erklärt:

public delegate void PaymentMadeEvent(object sender, paymentMadeEventArgs e); 

    public event PaymentMadeEvent PaymentForm_PaymentMade; 

Next Ich habe einen Booleschen Wert in einer separaten öffentlichen Klasse am Ende der Codepage erklärt, wie so:

public class paymentMadeEventArgs: EventArgs 
{ 
    private bool paymentSuccess = true; 

    public bool PaymentSuccess 
    { 
     get { return paymentSuccess; } 
     set { paymentSuccess = value; } 
    } 
} 

Next I kopiert haben ein Beispiel Stück Code, das die Zahlung übernimmt, wenn es eingegeben:

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

der Fehler ist ein

System.NullReferenceException

, die von dieser Linie kommen hier zu sein scheint:

PaymentForm_PaymentMade(this, new paymentMadeEventArgs(){ PaymentSuccess = true }); 

Kann jemand sehen, was ich falsch mache?

Vielen Dank im Voraus.

+3

Sind Sie sicher, dass Sie Abonnenten zu Ihrer Veranstaltung haben? –

+1

"PaymentForm_PaymentMade" ist "null", wenn niemand diesem Ereignis zugewiesen wurde. BTW: "scheint von dieser Linie zu kommen" ist kein guter Weg, auf StackOverflow zu fragen! Eine Ausnahme hat immer einen Stack-Trace, der Ihnen _exactly_ sagt, wo der Fehler auftritt. Bitte fügen Sie diese Stapelverfolgung in Ihre nächste Frage ein. –

+1

@DanielAWhite - So sehr ich diesen Typen liebe, es ist ein bisschen hart in diesem Fall, denn das ist ein bisschen ein Spezialfall eines NRE – Jamiec

Antwort

0

Ereignisse sind null bis sie Abonnenten haben, so müssen Sie

if(PaymentForm_PaymentMade != null) 
    PaymentForm_PaymentMade(this,new paymentMadeEventArgs(){ PaymentSuccess = true }) 

Dies ist der Ursprung eines bestimmten Musters des Codes, die in dem Ereignisnamen mit nicht zu wiederholen Sie den Namen des Formulars beginnt:

public event PaymentMadeEvent PaymentMade; 

Und mit einer On<EventName> Methode, häufig geschützt.

protected void OnPaymentMade(PaymentMadeEventArgs e) 
{ 
    if(this.PaymentMade != null) 
     this.PaymentMade(this,e); 
} 

Dann müssen Sie nicht in den Boden haben Sie den Code über und über mit 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 }); 
} 
+0

Nur der Vollständigkeit halber wird es in der Regel berücksichtigt geeignet, um das Ereignis in einer lokalen Variablen zu speichern, bevor es überprüft/aufgerufen wird, um Threading-Probleme zu vermeiden. Zum Beispiel: 'PaymentMadeEvent LocalEvent = PaymentForm_PaymentMade; if (LocalEvent! = null) ... ' –

+1

@GlorinOakefoot für die vollständige Vollständigkeit: Dieses Muster ist mit C# 6 veraltet, da Sie jetzt' PaymentForm_PaymentMade? .Invozieren (...) ' –

+0

@ RenéVogt - Guter Punkt . –

Verwandte Themen