簡體   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