VB.NET - NullReferenceException Необработанный - PullRequest
1 голос
/ 20 сентября 2011

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

Я пытаюсь написать простой анализатор запросов.Я случайно получаю такие сбои:

1) Я начинаю со следующей функции:

Dim thd As New Thread(AddressOf StartSub)
thd.Start()

, затем следует Startsub:

 Public Sub StartSub()
    CheckForIllegalCrossThreadCalls = False
    txtExecution.Text = "Executing query..."
    Dim query As String = QueryBuilder()
    UpdateView(query)
End Sub

и затемupdateview обновляет сетку данных, которая у меня есть:

    Dim da As New SqlCeDataAdapter(query, connStr)
    Dim dt As New DataTable()
    Try
        da.Fill(dt)
        txtExecution.Text = "Query executed successfully."
        dgTickets.DataSource = dt
    Catch ex As Exception
        txtExecution.Text = "Query failed."
        tbGrid.BeginInvoke(Sub() tbGrid.SelectedTab = tbGrid.TabPages(1))
    End Try

2) Код падает в UpdateQuery в следующей строке (отладчик не говорит, что он падает здесь, я угадал его, выбрав все строки и пройдя по нему 11):

dgTickets.DataSource = dt

3) Что говорит отладчик: исключение NullReferenceException не обработано (...) используйте новое ключевое слово для создания экземпляра объекта

трассировка стека:

at System.Windows.Forms.DataGridViewCell.GetEditedFormattedValue(Object value, Int32 rowIndex, DataGridViewCellStyle& dataGridViewCellStyle, DataGridViewDataErrorContexts context)
   at System.Windows.Forms.DataGridViewCell.PaintWork(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, Int32 rowIndex, DataGridViewElementStates cellState, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
   at System.Windows.Forms.DataGridViewRow.PaintCells(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow, DataGridViewPaintParts paintParts)
   at System.Windows.Forms.DataGridViewRow.Paint(Graphics graphics, Rectangle clipBounds, Rectangle rowBounds, Int32 rowIndex, DataGridViewElementStates rowState, Boolean isFirstDisplayedRow, Boolean isLastVisibleRow)
   at System.Windows.Forms.DataGridView.PaintRows(Graphics g, Rectangle boundingRect, Rectangle clipRect, Boolean singleHorizontalBorderAdded)
   at System.Windows.Forms.DataGridView.PaintGrid(Graphics g, Rectangle gridBounds, Rectangle clipRect, Boolean singleVerticalBorderAdded, Boolean singleHorizontalBorderAdded)
   at System.Windows.Forms.DataGridView.OnPaint(PaintEventArgs e)
   at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   at System.Windows.Forms.Control.WmPaint(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.DataGridView.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(ApplicationContext context)
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
   at SQLquery.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 81 

Это довольно расплывчато на самом деле.Указанный выше файл не существует.Место, где он падает, обернуто Try-End Try.Более того, да, у меня настроено событие рисования, но оно не должно касаться его (или, может быть, это касается?).

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

Пит.

1 Ответ

3 голосов
/ 20 сентября 2011

Вы никогда не должны трогать / обновлять какие-либо элементы управления GUI внутри фоновых потоков. Так что строки вроде:

txtExecution.Text = "Executing query..."

и

dgTickets.DataSource = dt

внутри фонового потока обречены на провал. Это всегда должно быть сделано в главном потоке GUI, используя Control.BeginInvoke.

Единственное обновление графического интерфейса, которое вы, кажется, делаете правильно, это tbGrid в catch:

tbGrid.BeginInvoke(Sub() tbGrid.SelectedTab = tbGrid.TabPages(1))

Вы должны прочитать о UI WinForms вызывает поток .

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