2009-06-06 4 views
0

J'ai une interface pour un widget d'interface utilisateur, dont deux sont des attributs d'un présentateur.égalité sur l'expéditeur d'un événement

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 
    } 

Le widget a un événement que les deux objets du présentateur souscrivent, et donc il est un gestionnaire d'événements dans le présentateur comme ceci:

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

Le problème est que les ReferenceEquals sur l'expéditeur échoue, même si c'est le widget implémenté qui est l'expéditeur - le même widget implémenté qui a été mis à l'attribut du présentateur! Est-ce que quelqu'un peut voir ce que le problème/correctif est?

Cheers, Berryl

Je ne savais pas qu'on pouvait modifier bien. Cool. Voici l'événement de code à lever:

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

est ici le vidage de débogage de l'attribut présentateur, espace de noms sans info:

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

Voici la décharge de débogage de l'expéditeur:

?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

Veuillez ajouter le bout de code où l'événement est levé. En ce moment nous pouvons seulement deviner. –

+0

Que se passe-t-il dans EntryChanged; avez-vous le code pour cela? –

+0

Beryl, vous pouvez Modifier votre question d'origine. –

Répondre

0

Du haut de ma tête, je peux penser à ces raisons pour lesquelles ReferenceEquals retournera false:

  • sender est null - Vérifiez que le widget envoie this comme paramètre d'expéditeur lors de l'événement est.
  • Le widget n'est pas attribué au présentateur pour une raison quelconque, il est donc null
  • sender est pas ce que vous pensez qu'il est (comment avez-vous vérifié qu'il est bien l'expéditeur que vous attendez)
  • Le widget est mis en œuvre en tant que struct, pas class

Il peut y avoir plus, mais c'est là que je commencerais (dans cet ordre).

Mise à jour: une chose qui attire mon attention est la suivante:

_wrappedWidget: {Win.Widgets.DataGridViewDynamicLookupWidget} 

Se pourrait-il que l'expéditeur est un objet qui enveloppe votre widget? Si tel est le cas, ReferenceEquals retournera naturellement false lors de la comparaison.

+0

Le widget est un wrapper pour un DataGridView (une classe). Je vérifie les dumps du débogueur (et comment je sais que ce n'est pas null) aux deux possibilités restantes sur votre liste: Voici le vidage d'attribut de présentateur, complet avec des informations d'espace de noms: ? _nonProjectActivityMatrix {Smack.ConstructionAdmin. WinPresentation.Widgets.MatrixWidgetDgv} Salut Fredrik [Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv]: {} Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv Je ne comprends pas tout à fait la partie qui ressemble à un indice (widget [widget]) – Berryl

+0

{Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv} base {Smack.Core.GUI.Widgets.Lookup.MatrixWidgetBase }: {} Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv _configuration: {} Smack.ConstructionAdmin.Domain.Presentation.Timesheet.Matrix.WeeklyMatrixConfiguration _wrappedWidget: {} Smack.Win.Widgets.DataGridViewDynamicLookupWidget J'ai laissé l'information du débogueur de vue de la grille de données désactivée. – Berryl

+0

Ça n'a pas très bien été formaté. Le deuxième commentaire est l'information de type de la décharge du débogueur du widget. – Berryl

Questions connexes