Ошибка / ошибка сетки данных wpf - PullRequest
4 голосов
/ 26 мая 2010

У меня проблема с WPF DataGrid.

Я использую WPF DataGrid & DataGridTemplateColumn (текстовые поля)

Иногда я получаю следующую ошибку. При вставке данных я получаю ошибку время от времени. Нет шаблона для воспроизведения этой ошибки. Это происходит случайно.

System.NullReferenceException: объект Ссылка не установлена ​​для экземпляра объект.

Подробное сообщение:

System.NullReferenceException was unhandled by user code
  Message="Object reference not set to an instance of an object."
  Source="PresentationFramework"
  StackTrace:
       at System.Windows.Controls.VirtualizingStackPanel.InsertContainer(Int32 childIndex, UIElement container, Boolean isRecycled)
       at System.Windows.Controls.VirtualizingStackPanel.AddContainerFromGenerator(Int32 childIndex, UIElement child, Boolean newlyRealized)
       at System.Windows.Controls.VirtualizingStackPanel.BringIndexIntoView(Int32 index)
       at Microsoft.Windows.Controls.Primitives.DataGridRowsPresenter.InternalBringIndexIntoView(Int32 index) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\DataGrid\Microsoft\Windows\Controls\Primitives\DataGridRowsPresenter.cs:line 48
       at Microsoft.Windows.Controls.DataGrid.ScrollRowIntoView(Object item) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\DataGrid\Microsoft\Windows\Controls\DataGrid.cs:line 1617
       at Microsoft.Windows.Controls.DataGrid.ScrollCellIntoView(Object item, DataGridColumn column) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\DataGrid\Microsoft\Windows\Controls\DataGrid.cs:line 1638
       at Microsoft.Windows.Controls.DataGrid.ScrollIntoView(Object item, DataGridColumn column) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\DataGrid\Microsoft\Windows\Controls\DataGrid.cs:line 1544
       at Microsoft.Windows.Controls.DataGrid.OnEnterKeyDown(KeyEventArgs e) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\DataGrid\Microsoft\Windows\Controls\DataGrid.cs:line 5473
       at Microsoft.Windows.Controls.DataGrid.OnKeyDown(KeyEventArgs e) in C:\dd\WPF_1\src\wpf\src\ControlsPack\WPFToolkit\DataGrid\Microsoft\Windows\Controls\DataGrid.cs:line 5101
       at System.Windows.UIElement.OnKeyDownThunk(Object sender, KeyEventArgs e)
       at System.Windows.Input.KeyEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
       at System.Windows.Input.InputManager.ProcessStagingArea()
       at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
       at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
       at System.Windows.Interop.HwndKeyboardInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawKeyboardActions actions, Int32 scanCode, Boolean isExtendedKey, Boolean isSystemKey, Int32 virtualKey)
       at System.Windows.Interop.HwndKeyboardInputProvider.ProcessKeyAction(MSG& msg, Boolean& handled)
       at System.Windows.Interop.HwndSource.CriticalTranslateAccelerator(MSG& msg, ModifierKeys modifiers)
       at System.Windows.Interop.HwndSource.OnPreprocessMessage(Object param)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
       at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
  InnerException:

Но если для Virtualization установлено значение False, то оно работает абсолютно нормально.

Есть ли что-то, что я пропускаю? Нужно решение.

Заранее спасибо.

1 Ответ

3 голосов
/ 21 июля 2010

Вы вводите данные вручную или с помощью кода?

Если от руки то:

1) В какой момент появляется исключение, когда отредактированный текстовый бокс теряет фокус?

2) кажется, вы используете версию набора данных "toolkit". Это актуально (10 февраля, самое последнее, я думаю)? Вы опробовали встроенную сетку данных в .NET 4?

Если в коде, то:

Если вы, например, пытаетесь вызвать ScrollIntoView для отредактированного элемента, этому вызову должен предшествовать datagrid.UpdateLayout (). И если вы затем попытаетесь сгенерировать контейнер DataGridRow для вашего элемента, то после получения DataGridRow вы должны также вызвать UpdateLayout () для него, прежде чем устанавливать какие-либо свойства или пытаться вызывать методы для него. Это все благодаря необычному способу виртуализации (по крайней мере, в сетке данных). Если вы не вызовете UpdateLayout, как я уже упоминал, вы получите (пустые ссылки) исключения в некоторых сценариях, но не в других.

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