C# 事件发送方上的相等性
我有一个UI小部件的界面,其中两个是演示者的属性C# 事件发送方上的相等性,c#,events,equals,C#,Events,Equals,我有一个UI小部件的界面,其中两个是演示者的属性 public IMatrixWidget NonProjectActivityMatrix { set { // validate the incoming value and set the field _nonProjectActivityMatrix = value; .... // configure & load no
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
}
小部件具有两个presenter对象都订阅的事件,因此presenter中有一个事件处理程序,如下所示:
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
}
}
问题是发送方上的ReferenceEquals失败,即使它是作为发送方的已实现小部件-与设置为presenter属性的已实现小部件相同
谁能发现问题/解决方法是什么
干杯,
贝里尔
我不知道你能很好地编辑。凉的以下是事件引发代码:
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);
}
以下是演示者属性sans namespace info的调试器转储:
?_nonProjectActivityMatrix
{WinPresentation.Widgets.MatrixWidgetDgv}
[WinPresentation.Widgets.MatrixWidgetDgv]: {WinPresentation.Widgets.MatrixWidgetDgv}
以下是发送方的调试器转储:
?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}
?发送方
{WinPresentation.Widgets.MatrixWidgetDgv}
base{Core.GUI.Widgets.Lookup.MatrixWidgetBase}:{WinPresentation.Widgets.MatrixWidgetDgv}
_配置:{Domain.Presentation.Timesheet.Matrix.WeeklyMatrix配置}
_wrappedWidget:{Win.Widgets.DataGridViewDynamicLookupWidget}
AllowUserToAddress:正确
列数:11
计数: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}
选择编辑项:{'AdministrativeActivity:130-04',AdministrativeTime,0.00,0.00,0.00,0.00,0.00,0.00,0.00}
- 贝里尔
为sender
-验证小部件在引发事件时是否将null
作为sender参数发送此
- 由于某种原因,小部件未分配给演示者,因此它是
null
不是你想象的那样(你如何验证它确实是你期望的发送者)发送者
- 小部件实现为
,而不是结构
类
_wrappedWidget: {Win.Widgets.DataGridViewDynamicLookupWidget}
可能是发送者是一个包装小部件的对象吗?如果是这种情况,在进行比较时,ReferenceEquals将自然返回false。请添加引发事件的代码段。现在我们只能猜测,EntryChanged内部发生了什么;你有它的代码吗?贝丽尔,你可以编辑你的原始问题。为什么你不能设置一个断点,然后在Visual Studio中检查这两个变量?你好。是我干的。我是说调试器在我编辑的问题中转储。Thx,b小部件是DataGridView(类)的包装器。我正在检查调试器转储(以及我如何知道它不为null)到列表中剩余的两种可能性:这是presenter属性转储,包含名称空间信息:?_nonProjectActivityMatrix{Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv}Hi Fredrik[Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv]:{Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv}我不太理解看起来像索引的部分(widget[widget]){Smack ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv}base{Smack Core.GUI.Widgets.Lookup.MatrixWidgetDgv}:{Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv}{u配置:{Smack.ConstructionAdmin.Domain.Presentation.Timesheet.Matrix.WeeklyMatrixConfiguration}{u wrappedWidget:{Smack.Win.Widgets.DataGridViewDynamicLookupWidget}我关闭了数据网格视图调试器信息。格式不太好。第二条注释是来自小部件调试器转储的类型信息。事件引发代码:void OnGridViewNumericUpDownEditingControl_ValueChanged(object sender,EventArgs e){//省略以保存sapce if(EntryChanged==null)return;var args=new EntryChangedEventArgs(activityID,dayID,Convert.ToDouble(amount));EntryChanged(this,args);}将代码示例添加到原始问题insead中;这样可以更容易地格式化那里的代码,也可以更容易地为其他能够提供答案的用户找到代码示例:)