2011-03-02 81 views
1

我有一个信息类,它有以下事件。System.EventHandler转换错误

public delegate void GroupNameChangedHandler(string groupName); 
    [field: NonSerialized] 
    public event GroupNameChangedHandler GroupNameChanged; 

另一个类是注册到该事件。它似乎工作正常,但昨天我们的客户之一提到应用程序正在抛出一些异常,以下是该错误的堆栈跟踪。我不确定客户端的机器或应用程序出了什么问题。这对其他几乎50个用户来说效果很好。

Object of type 'System.EventHandler' cannot be converted to type 'EZOMS.OrderEntry.PairsOrderInfo+GroupNameChangedHandler'. (mscorlib) 


Program Location: 

    at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) 
    at System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.ComponentModel.ReflectEventDescriptor.RemoveEventHandler(Object component, Delegate value) 
    at System.ComponentModel.ReflectPropertyDescriptor.RemoveValueChanged(Object component, EventHandler handler) 
    at System.Windows.Forms.BindingSource.UnwirePropertyChangedEvents(Object item) 
    at System.Windows.Forms.BindingSource.Clear() 
    at EZOMS.OrderEntry.PairsOrderEntryForm.LoadPairsOrderInfo(PairsOrderInfo pairsOrderInfo) in C:\dev\BRANCH\EZOMS\OrderEntry\PairsOrderEntryForm.cs:line 1063 
    at EZOMS.OrderEntry.PairsOrderEntryForm.buttonSave_Click(Object sender, EventArgs e) in C:\dev\BRANCH\EZOMS\OrderEntry\PairsOrderEntryForm.cs:line 765 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
+0

LoadPairsOrderInfo中会发生什么? – 2011-03-02 12:19:45

+0

它通过清除BindingSource来重置表单上控件的绑定,然后将PairsOrderInfo添加到绑定中。 //绑定到新的订单信息。 this.pairsOrderInfoBindingSource.Clear(); this.pairsOrderInfo =(PairsOrderInfo)pairsOrderInfo.Clone(); (this.pairsOrderInfo); this.pairsOrderInfoBindingSource.Add(this.pairsOrderInfo); – fawad 2011-03-02 12:25:54

+0

此重置绑定导致下拉列表选择另一个值,并引发该groupnamechanged事件。 – fawad 2011-03-02 12:28:03

回答

0

这听起来像你有一个属性GroupName;变更处理程序有一个遵循event EventHandler *Changed模式的约定,因此绑定代码(主要位于属性描述符中)此模式并尝试使用事件处理程序进行预订。在这种情况下,这是相当的注定。

可能想检查他们是否使用相同的.NET版本(包括服务包);也许这在以后的版本中有所改进。

当然,假设有一个GroupName属性,你可以只切换回EventHandler并从那里有用户查询。