aravindkrgec Ответов: 2

C# Treeview owner draw, исключение нулевой ссылки


Привет,

В настоящее время я застрял с проблемой.
Я попытался настроить treeview в C# .Net 3.5.
Я собственноручно нарисовал узлы.
Но при выполнении следующих действий часто возникает исключение:
1. Добавить 2 узлов с большим количеством текста в компоненте TreeView.
2. Установите для свойств RightToLeft и RightToLeftLayout значение true.
3. Удалите все узлы с помощью API RemoveAll ().
4. Добавить 2-3 узлов с большим количеством текста в виде дерева.

Пустая ссылка исключение. Трассировка стека выглядит следующим образом:
в системе.Окна.Формы.Узлов дерева.get_Handle()
в системе.Окна.Формы.Узлов дерева.get_RowBounds()
в системе.Окна.Формы.TreeView элемент.CustomDraw(сообщение&амп; м)
в системе.Окна.Формы.TreeView элемент.WmNotify(сообщение& m)
в системе.Окна.Формы.TreeView элемент.WndProc(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.WndProc(сообщение& m)
в системе.Окна.Формы.Родное окно.DebuggableCallback(hwnd элемента указателя IntPtr, int32 и глутамат натрия, указателя IntPtr параметр wparam, указателя IntPtr lparam должен)
Сообщение, отправляемое в WndProc во время исключения, называется "WndProc(ref System.Окна.Forms.Message message = {msg=0x204e (WM_REFLECT + WM_NOTIFY))"

Пожалуйста, помогите мне в решении этого вопроса.

Sergey Alexandrovich Kryukov

Трассировка стека исключений без кода, который вызывает исключение? Хм? Как насчет того, чтобы немного поразмыслить над ситуацией?..
—СА

2 Ответов

Рейтинг:
4

aravindkrgec

Проблема была связана с сообщением Reflect Notify, WM_CustomDraw.
По некоторым причинам дескриптор для последнего узла не был создан во время рисования.
Так что подтвердите это, и все пойдет хорошо.

Спасибо за Вашу поддержку в этом вопросе.

С уважением
Аравинд


Рейтинг:
1

Sergey Alexandrovich Kryukov

Несмотря на то, что вы показали некоторую трассировку стека исключений, вы не показали, где возникает это исключение с сообщением "ссылка на объект не установлена на экземпляр объекта".

Not to worry. This is one of the very easiest cases to detect and fix. It simply means that some member/variable of some reference type is dereferenced by using and of its instance (non-static) members, which requires this member/variable to be non-null, but in fact it appears to be null. Simply execute it under debugger, it will stop the execution where the exception is thrown. Put a break point on that line, restart the application and come to this point again. Evaluate all references involved in next line and see which one is null while it needs to be not null. After you figure this out, fix the code: either make sure the member/variable is properly initialized to a non-null reference, or check it for null and, in case of null, do something else.

Смотрите также: хотите отобразить следующую запись при нажатии кнопки. но получил ошибку в том случае, если условие следующей функции записи "ссылка на объект не установлена на экземпляр объекта"[^].

Иногда вы не можете сделать это под отладчиком по той или иной причине. Один действительно неприятный случай-это когда проблема проявляется только в том случае, если программное обеспечение построено, когда отладочная информация недоступна. В этом случае вам придется использовать более сложный способ. Во-первых, вам нужно убедиться, что вы никогда не блокируете распространение исключений, обрабатывая их молча (это преступление разработчиков против самих себя, но очень обычное). Вам нужно поймать абсолютно все исключения на самом верхнем кадре стека каждого потока. Вы можете сделать это, если будете обрабатывать исключения данного типа System.Exception В обработчике вам нужно записать всю информацию об исключениях, особенно System.Exception.StackTrace:
http://msdn.microsoft.com/en-us/library/system.exception.aspx[^],
http://msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx[^].

Трассировка стека - это просто строка, показывающая полный путь распространения исключения от оператора throw до обработчика. Читая его, вы всегда можете найти концы. Для ведения журнала лучше всего (в большинстве случаев) использовать класс System.Diagnostics.EventLog:
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx[^].

Удачи,

—СА


aravindkrgec

Спасибо, что ответили.
Исключение было вызвано в случае WndProc по умолчанию( сообщение, которое не обрабатывается пользователем).
Так что отладка не помогает.

Sergey Alexandrovich Kryukov

Как "отладка не помогает"? Что же тогда может помочь? добавление ошибок? :-)
—СА

Kaizen202

@Сергей:
Из трассировки стека можно было понять, что исключение null reference выбрасывается при обработке сообщения "{msg=0x204e (WM_REFLECT + WM_NOTIFY))" в методе WndProc (), и оно точно из "System.Окна.Формы.Метод TreeNode.get_Handle ()".
Поэтому его трудно отлаживать, так как исключение происходит из Базового элемента управления.
@Aravind (FunCorner):
Правильно ли вы обрабатываете сообщение "WM_NOTIFY"?

Sergey Alexandrovich Kryukov

Проблема заключается в следующем: трассировка стека, которую вы показываете, не показывает ни одной строки вашего кода, но такой код должен быть в трассировке.
—СА