2009-06-06 12 views
0

Ich habe eine Schnittstelle für ein UI-Widget, von denen zwei Attribute eines Presenter sind.Gleichheit auf dem Absender eines Ereignisses

public IMatrixWidget NonProjectActivityMatrix { 
     set { 
      // validate the incoming value and set the field 
      _nonProjectActivityMatrix = value; 
      .... 
      // configure & load non-project activities 
    } 

public IMatrixWidget ProjectActivityMatrix { 
     set { 
      // validate the incoming value and set the field 
      _projectActivityMatrix = value; 
      .... 
      // configure & load project activities 
    } 

Das Widget ein Ereignis hat, dass beide Präsentator Objekte abonnieren, und so ist es ein Event-Handler in dem Moderator wie so:

public void OnActivityEntry(object sender, EntryChangedEventArgs e) { 
    // calculate newTotal here 
    .... 
     if (ReferenceEquals(sender, _nonProjectActivityMatrix)) { 
      _nonProjectActivityMatrix.UpdateTotalHours(feedback.ActivityTotal); 
     } 

     else if (ReferenceEquals(sender, _projectActivityMatrix)) { 
      _projectActivityMatrix.UpdateTotalHours(feedback.ActivityTotal); 
     } 
     else { 
      // ERROR - we should never be here 
     } 
    } 

Das Problem ist, dass die Reference auf dem Sender ausfällt, obwohl es das implementierte Widget ist, das der Absender ist - das gleiche implementierte Widget, das auf das Presenter-Attribut gesetzt wurde!

Kann jemand feststellen, was das Problem/beheben ist?

Cheers, Berryl

ich Sie nicht wissen konnte gut bearbeiten. Cool. Hier ist das Ereignis auslöst Code:

void OnGridViewNumericUpDownEditingControl_ValueChanged(object sender, EventArgs e) 
    { 
    // omitted to save sapce 

     if (EntryChanged == null) return; 

     var args = new EntryChangedEventArgs(activityID, dayID, Convert.ToDouble(amount)); 
     EntryChanged(this, args); 
    } 

Hier ist der Debugger-Dump des Moderators Attribut, sans-Namespace Info:

?_nonProjectActivityMatrix 
{WinPresentation.Widgets.MatrixWidgetDgv} 
[WinPresentation.Widgets.MatrixWidgetDgv]: {WinPresentation.Widgets.MatrixWidgetDgv} 

Hier ist der Debugger-Dump des Senders:

?sender 
{WinPresentation.Widgets.MatrixWidgetDgv} 
base {Core.GUI.Widgets.Lookup.MatrixWidgetBase<Core.GUI.Widgets.Lookup.DynamicDisplayDto>}: {WinPresentation.Widgets.MatrixWidgetDgv} 
_configuration: {Domain.Presentation.Timesheet.Matrix.WeeklyMatrixConfiguration} 
_wrappedWidget: {Win.Widgets.DataGridViewDynamicLookupWidget} 
AllowUserToAddRows: true 
ColumnCount: 11 
Count: 4 
EntryChanged: {Method = {Void OnActivityEntry(System.Object, Smack.ConstructionAdmin.Domain.Presentation.Timesheet.Matrix.EntryChangedEventArgs)}} 
SelectedCell: {DataGridViewNumericUpDownCell { ColumnIndex=3, RowIndex=3 }} 
SelectedCellValue: "0.00" 
SelectedColumn: {DataGridViewNumericUpDownColumn { Name=MONDAY, Index=3 }} 
SelectedItem: {'AdministrativeActivity: 130-04', , AdministrativeTime, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00} 
  • Berryl
+0

Fügen Sie das Codeelement hinzu, in dem das Ereignis ausgelöst wird. Im Moment können wir nur raten. –

+0

Was passiert in EntryChanged; Hast du den Code dafür? –

+0

Beryl, können Sie Ihre ursprüngliche Frage bearbeiten. –

Antwort

0

Aus der Spitze von meinem Kopf ich aus diesen Gründen denken kann, warum Reference falsch zurück:

  • sender ist null - Stellen Sie sicher, dass das Widget this als Absender Parameter sendet, wenn das das Ereignis auslöst.
  • Das Widget wird auf den Vortragenden aus irgendeinem Grund nicht belegt, so ist es null
  • sender nicht, was Sie ist denken, es ist
  • Das Widget (wie Sie, dass es in der Tat Sie erwarten, dass der Absender überprüft haben) ist implementiert als struct, keine class

Es kann mehr sein, aber das ist, wo ich (in dieser Reihenfolge) beginnen würde.

aktualisieren: eine Sache, die mein Auge fällt, ist dies:

_wrappedWidget: {Win.Widgets.DataGridViewDynamicLookupWidget} 

Könnte es, dass Absender sein ist ein Objekt, das das Widget hüllt? Wenn dies der Fall ist, gibt ReferenceEquals beim Vergleich natürlich false zurück.

+0

Das Widget ist ein Wrapper für ein DataGridView (eine Klasse). Ich überprüfe den Debugger-Dumps (und wie ich weiß, es ist nicht null) an den verbleibenden zwei Möglichkeiten auf Ihrer Liste: Hier ist der Moderator Attribut-Dump, komplett mit Namespace-Info: _nonProjectActivityMatrix {Smack.ConstructionAdmin. WinPresentation.Widgets.MatrixWidgetDgv} Hallo Fredrik [Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv]: {} Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv ich nicht ganz die Rolle bekommen, die wie ein Index aussieht (Widget [Widget]) – Berryl

+0

{Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv} Basis {Smack.Core.GUI.Widgets.Lookup.MatrixWidgetBase }: {} Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv _configuration: {Smack.ConstructionAdmin.Domain.Presentation.Timesheet.Matrix.WeeklyMatrixConfiguration} _wrappedWidget: {Smack.Win.Widgets.DataGridViewDynamicLookupWidget} Ich verließ die Datenraster Ansicht Debugger Informationen aus. – Berryl

+0

Das hat nicht sehr gut formatiert. Der zweite Kommentar ist die Typinfo aus dem Debugger-Dump des Widgets. – Berryl

Verwandte Themen