繁体   English   中英

事件不为空,但_invocationList为空?

[英]event is not null but _invocationList is null?

我以为如果我有这段代码:

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        if (PropertyChanged != null) PropertyChanged(this, e);
    }

并且没有钩住PropertyChanged事件, ProeprtyChanged将为null ,但是我得到的PropertyChanged不为null且_invocationList成员为null_invocationCount成员为0。这(我认为)在我调用时导致ArgumentOutOfRangeException PropertyChanged(this, e) 知道问题可能在哪里吗?

这是我在OnClick事件中的堆栈跟踪:

位于System.Windows.Forms.BindingsCollection.get_Item(Int32索引)处于System.Windows.Forms.BindingManagerBase.PushData处的System.Windows.Forms.PropertyManager.OnCurrentChanged处于System.Collections.ArrayList.get_Item(Int32索引) (EventArgs EA)位于System.Windows.Forms.BindToObject.PropValueChanged(Object sender,EventArgs e)在System.EventHandler.Invoke(Object sender,EventArgs e)在System.ComponentModel.PropertyDescriptor.OnValueChanged(Object component,EventArgs e) System.ComponentModel.ReflectPropertyDescriptor.OnValueChanged(对象组件,EventArgs e)位于C:\\ Users \\ Juan Luis中的Player.DataBaseManager.OnPropertyChanged(PropertyChangedEventArgs e)中的System.ComponentModel.ReflectPropertyDescriptor.OnINotifyPropertyChanged(Object component,PropertyChangedEventArgs e) \\ Documents \\ CodeWebScraper Player \\ WebScraperAndPlayer \\ Player \\ DataBaseManager2.cs:C:\\ Users \\ Juan Luis \\ My Dropbox \\ Docume中Player.DataBaseManager.set_TableNames(列出1值)处的第100行 nts \\ CodeWebScraper sin Player \\ WebScraperAndPlayer \\ Player \\ DataBaseManager2.cs:C:\\ Users \\ Juan Luis \\ My Dropbox \\ Documents \\ CodeWebScraper sin Player \\ WebScraperAndPlayer \\ Player \\ DataBaseManager2.cs中Player.DataBaseManager.UpdateTableNames()的第30行: C:\\ Users \\ Juan Luis \\ My Dropbox \\ Documents \\ CodeWebScraper中Player.DataBaseManager.ExecuteNonQuery(String sqlQuery)的第95行sin Player \\ WebScraperAndPlayer \\ Player \\ DataBaseManager2.cs:WebScraperAndPlayer.DataBaseEditor.deleteTableButtonButton_Click的第336行C:\\ Users \\ Juan Luis \\ My Dropbox \\ Documents \\ CodeWebScraper sin Player \\ WebScraperAndPlayer \\ BuilderForm2 \\ Data \\ DataBaseEditor.cs:System.Windows.Forms.ToolStripItem.RaiseEvent中的第90行的EventArgs e)(Object key,EventArgs e)在System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)

查看您的堆栈跟踪

在System.Windows.Forms.BindingsCollection.get_Item(Int32索引)在System.Windows.Forms.BindingManagerBase.PushData(布尔值和成功)在System.Windows.Forms.BindingsCollection.get_Item(Int32索引)在

这与事件连线无关紧要,在数据绑定中还有其他问题。

System.EventHandler.Invoke(对象发送者,EventArgs e)

那是PropertyChanged(this,e)调用。 这不是异常的原因,您的堆栈跟踪已经远远超出了此范围。 不幸的是,在您未编写的代码中,它是Winforms绑定管道的一部分。 捆绑物弄砸了。

找到了问题。 我有一个数据表编辑器,该表具有一个TablesList属性,该属性绑定到数据库管理器对象中的数据表列表。 在其set访问器中,我检查了表是否仍然存在于列表中,以及是否没有关闭编辑器并从数据库管理器中删除了数据绑定。 因此,当.NET的内部遍历绑定到TablesList的对象时,其中一个将自身从列表中删除。 但是由于循环的编写方式,.NET不会注意到此更改:

int numLinks = Bindings.Count;
for (int i = 0; i < numLinks; i++) { 
    if (Bindings[i].PushData()) { 
        success = false;
    } 
}

我基本上是从PushData()调用中删除绑定。 我的解决方案是将事件处理程序附加到PropertyChanged事件并检查那里的表列表。 显然,.NET使用什么循环遍历事件的调用列表,都可以让您在循环中删除事件。

我想这可能是:永远不要从该属性的set访问器中删除更新该属性的Binding 但可以从事件处理程序本身中删除事件处理程序。 对?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM