событие не является нулевым, но _invocationList является нулевым? - PullRequest
0 голосов
/ 20 декабря 2010

Я думал, что если у меня есть этот код:

    public event PropertyChangedEventHandler PropertyChanged;

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

и событие PropertyChanged не будет перехвачено, ProeprtyChanged будет null, но я получаю PropertyChangedэто не ноль, и чей _invocationList член равен null, а чей _invocationCount член равен 0. Это (я думаю) вызывает ArgumentOutOfRangeException, когда я вызываю PropertyChanged(this, e).Любая идея, где может быть проблема?

Это моя трассировка стека от события OnClick:

в System.Collections.ArrayList.get_Item (Int32 index) в System.Windows.Forms.BindingsCollection.get_Item (Int32 index) в System.Windows.Forms.BindingManagerBase.PushData (Boolean & success) в System.Windows.Forms.PropertyManager.OnCurrentChanged (EventArgs ea) в System.Windows.Forms.BindToObueHP.Отправитель объекта, EventArgs e) в System.EventHandler.Invoke (Отправитель объекта, EventArgs e) в System.ComponentModel.PropertyDescriptor.OnValueChanged (Компонент объекта, EventArgs e) в System.ComponentModel.ReflectPropertyDescriptor.OnValuegs ()System.ComponentModel.ReflectPropertyDescriptor.OnINotifyPropertyChanged (Компонент объекта, PropertyChangedEventArgs e) в Player.DataBaseManager.OnPropertyChanged (PropertyChangedEventArgs e) в C: \ Users \ Плеер \ Juan \ \ \ \ \ \ \ \ \ \ \ \ \ \ Facebook \ документыanager2.cs: строка 100 в Player.DataBaseManager.set_TableNames (значение List`1) в C: \ Users \ Хуан Луис \ My Dropbox \ Documents \ CodeWebScraper sin Player \ WebScraperAndPlayer \ Player \ DataBaseManager2.cs: строка 30 в Player.DataBaseManager.UpdateTableNames () в C: \ Users \ Хуан Луис \ My Dropbox \ Documents \ CodeWebScraper sin Player \ WebScraperAndPlayer \ Player \ DataBaseManager2.cs: строка 95 в Player.DataBaseManager.ExecuteNonQuery (строка sqlQuery) в C: \ Users \ Juan\ My Dropbox \ Documents \ CodeWebScraper sin Player \ WebScraperAndPlayer \ Player \ DataBaseManager2.cs: строка 336 в WebScraperAndPlayer.DataBaseEditor.deleteTableButton_Click (отправитель объекта, EventArgs e) в C: \ Users \ Player Хуана Луиса \ My Dropbox \ Documents \ CodeW\ WebScraperAndPlayer \ BuilderForm2 \ Data \ DataBaseEditor.cs: строка 90 в System.Windows.Forms.ToolStripItem.RaiseEvent (ключ объекта, EventArgs e) в System.Windows.Forms.ToolStripButton.OnClick (EventArgs e)

* 1019

Ответы [ 3 ]

2 голосов
/ 20 декабря 2010

Посмотрите на трассировку стека

в System.Collections.ArrayList.get_Item (индекс Int32) в System.Windows.Forms.BindingsCollection.get_Item (индекс Int32) в System.Windows.Forms.BindingManagerBase.PushData (Boolean & success) в

Это не проблема с передачей событий, что-то еще запутано в привязке данных.

1 голос
/ 20 декабря 2010

System.EventHandler.Invoke (Отправитель объекта, EventArgs e)

Это был вызов PropertyChanged (this, e).Это не является причиной исключения, ваш след стека вышел далеко за рамки этого.К сожалению, в код, который вы не написали, это часть связующего средства Winforms.Что-то облажалось с привязкой.

0 голосов
/ 21 декабря 2010

Нашел проблему.У меня был редактор таблиц данных, у которого свойство 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 для циклического перемещения по списку событий, позволяет удалить событие, находящееся в цикле.

Полагаю, мораль такова: никогда не удаляйте Binding, который обновляет свойство из set принадлежащий этому имуществу;но можно удалить обработчик события из самого обработчика события.Правильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...