Что может привести к тому, что WinForms richTextBox.DataBindings.Add () вызовет исключение Null Reference? - PullRequest
2 голосов
/ 07 октября 2019

Я почесал голову над этим некоторое время и просто не могу понять это. Я даже развернул новый тестовый проект и не могу воспроизвести ошибку, которую получаю в своем основном проекте.

Код, о котором идет речь, таков:

private void FormMain_Load(object sender, EventArgs e)
{
    Binding myBinding = new Binding("Text", _gizmo, nameof(_gizmo.MyProp));
    richRmDesc.DataBindings.Add(myBinding); //NullReference exception occurs on this line
}

Я проверил в отладчике.

  • myBinding НЕ равен null.
  • _gizmo - это совершенно новый объект Gizmo. Это не ноль.
  • _gizmo.MyProp - строка. В нем есть текст.
  • Даже richRmDesc.DataBindings НЕ является нулевым. Я могу проверить все поля и свойства члена DataBindings без проблем.

Ошибка полностью поставила меня в тупик. Я пытался максимально упростить свою форму и код запуска, если не считать полного разрушения всего, что я на нем построил (что я собираюсь попробовать позже, но это будет медленно и мучительно).

Кто-нибудь знает возможную причину, по которой я получаю исключение ссылки Null в строке DataBindings, когда ни один из элементов не равен нулю?

1 Ответ

1 голос
/ 07 октября 2019

Так что я подумал , что было бы очень важно уничтожить мои компоненты формы. На самом деле это было очень легко с минимальным рефакторингом (платит за написание хорошо абстрагированного кода).

Я сократил преступника до этой строки в классе формы, сгенерированном Дизайнером:

this.richRmDesc.TextChanged += new System.EventHandler(this.RichDesc_TextChanged);

Поэтому, когда я посмотрел на метод события RichDesc_TextChanged, я обнаружил, что он вызывает другой метод, который ссылается на нулевую коллекцию, поскольку он еще не был инициализирован. Это было в какой-то заурядной логике в самой форме.

По какой-то причине отладчик не смог полностью показать мне, что на самом деле происходило исключение в событии TextChanged. Он даже не давал мне указание на то, что событие было запущено, хотя имеет смысл, что оно сработало сразу после привязки.

Я исправил ошибку инициализации, связанную с логикой события TextChanged, и теперь все в порядке.

Я предполагаю, что отладчик не смог обнаружить эту ошибку события, потому что она происходила в другом потоке ??? Не уверен, правда. Комментарии приветствуются.

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