Arunkumar Murugesan Ответов: 1

Исключение в редактировании ячеек WPF datagrid


Привет,

Я с помощью WPF DataGrid и у меня привязка к ItemsSource в качестве объекта DataTable.

Я часто редактирую детали ячейки и копирую значение ячейки из одной в другую. Во время этого процесса я получаю следующую ошибку при редактировании события ячейки в WPF DataGrid.


Приведенный ниже код я использовал для редактирования значения ячейки
Код Редактирования Ячейки :

<pre>private void AutoBook_Datagrid_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
        {
            try
            {
                if (e.EditAction == DataGridEditAction.Commit)
                {
                    int primaryKey = 0;
                    DataRowView editedRow = (DataRowView)mainWindow.autoBook_Datagrid.SelectedItems[0];
                    if (editedRow != null && !string.IsNullOrEmpty(editedRow.Row["ID"].ToString()))
                    {
                        primaryKey = Convert.ToInt32(editedRow.Row["ID"]);
                    }
                    if (e.EditingElement.ToString().Contains("TextBox"))
                    {
                        if (e.EditingElement != null)
                        {
                            UpdateTextBoxValue(e.EditingElement as TextBox, e.Column.Header.ToString(), primaryKey);
                        }
                    }
                    else if (e.EditingElement.ToString().Contains("CheckBox"))
                    {
                        if (e.EditingElement != null)
                        {
                            UpdateCheckBoxValue(e.EditingElement as CheckBox, e.Column.Header.ToString(), primaryKey);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


Привязка XAML :

<pre><DataGrid
                        x:Name="autoBook_Datagrid"
                        HorizontalScrollBarVisibility="Auto"
                        VerticalScrollBarVisibility="Auto"
                        ScrollViewer.CanContentScroll="True"
                        BorderBrush="{StaticResource GreenBrush}"
                        HorizontalAlignment="Left"
                        VerticalAlignment="Top"
                        RowHeight="25"
                        GridLinesVisibility="All"
                        ClipboardCopyMode="IncludeHeader"
                        ItemsSource="{Binding DynamicBindingTable, UpdateSourceTrigger=PropertyChanged}"
                        CanUserAddRows="{Binding CanAddNewRows, UpdateSourceTrigger=PropertyChanged}"
                        VirtualizingPanel.VirtualizationMode="Recycling"
                        VirtualizingPanel.ScrollUnit="Pixel"
                        EnableColumnVirtualization="True"
                        EnableRowVirtualization="True"
                        FocusVisualStyle="{StaticResource ButtonFocusVisual}"
                            CanUserDeleteRows="False"
                        >


сообщение об ошибке :

Необработанное Исключение: Система.ArgumentNullException: значение не может быть null.
Имя параметра: элемент
в системе.Окна.Автоматизация.Сверстники.UIElementAutomationPeer.FromElement(элемент UIElement)
в системе.Окна.Управления.компонента DataGrid.CellAutomationValueHolder.TrackValue()
в системе.Окна.Управления.Элемент управления DataGrid.ReleaseCellAutomationValueHolders()
в системе.Окна.Управления.компонента DataGrid.OnExecutedCommitEdit(ExecutedRoutedEventArgs e)
в системе.Окна.Управления.компонента DataGrid.OnExecutedCommitEdit(отправитель объекта, ExecutedRoutedEventArgs e)


Не могли бы вы помочь мне решить этот вопрос?

С уважением,
Arunkumar Murugesan

Что я уже пробовал:

Я не мог найти решение. Не могли бы вы помочь мне выйти из этого вопроса?

Richard Deeming

catch (Exception ex)
{
    throw ex;
}

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

Если вам действительно нужно повторно создать исключение, просто используйте throw; вместо throw ex;:
catch (Exception)
{
    throw;
}

Но в этом случае, поскольку вы ничего не делаете с исключением, просто не ловите его. Снимите крышку try..catch блокируйте, и пусть исключения распространяются нормально.

Richard Deeming

Ошибка выглядит как ошибка WPF. Кто-то из StackOverflow получал ту же ошибку еще в 2018 году, но там нет реального решения:
c# - вход в режим прерывания на событии DataGrid CellEditEnding - переполнение стека[^]

1 Ответов

Рейтинг:
0

Richard MacCutchan

Ошибка очевидна: System.ArgumentNullException: Value cannot be null., вы передаете нулевое значение в одном из аргументов вызова метода. Нет простого решения такой проблемы, как нужно выяснить, какое значение равно нулю. Единственный способ-использовать отладчик для пошагового выполнения кода до тех пор, пока он не вызовет исключение. Затем вы можете изучить все переменные, чтобы найти нарушителя.


Arunkumar Murugesan

Привет, Ричард, Спасибо за ответ.

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

У меня есть нулевая проверка для элементов. Но все равно это становится исключением. Исключение также не выбрасывается в блок catch.

сведения об ошибке


Система.ArgumentNullException
HResult=0x80004003
Message=Value не может быть null.
Имя параметра: элемент
Источник=PresentationCore
Трассировка стека:
в системе.Окна.Автоматизация.Сверстники.UIElementAutomationPeer.FromElement(элемент UIElement)
в системе.Окна.Управления.компонента DataGrid.CellAutomationValueHolder.TrackValue()
в системе.Окна.Управления.Элемент управления DataGrid.ReleaseCellAutomationValueHolders()
в системе.Окна.Управления.компонента DataGrid.OnExecutedCommitEdit(ExecutedRoutedEventArgs e)
в системе.Окна.Управления.компонента DataGrid.OnExecutedCommitEdit(отправитель объекта, ExecutedRoutedEventArgs e)
в системе.Окна.Ввод.Связывание команд.OnExecuted(отправитель объекта, ExecutedRoutedEventArgs e)
в системе.Окна.Ввод.Диспетчер команд.ExecuteCommandBinding(отправитель объекта, ExecutedRoutedEventArgs e, CommandBinding commandBinding)
в системе.Окна.Ввод.Диспетчер команд.FindCommandBinding(Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
в системе.Окна.Ввод.Диспетчер команд.OnExecuted(отправитель объекта, ExecutedRoutedEventArgs e)
в системе.Окна.UIElement.OnExecutedThunk(отправитель объекта, ExecutedRoutedEventArgs e)
в системе.Окна.Ввод.ExecutedRoutedEventArgs.InvokeEventHandler(делегат genericHandler, объект target)
в системе.Окна.RoutedEventArgs.InvokeHandler(обработчик делегата, объект target)
в системе.Окна.RoutedEventHandlerInfo.InvokeHandler(объект target, RoutedEventArgs routedEventArgs)
в системе.Окна.Контейнер маршрута eventroute.InvokeHandlersImpl(источник, объект, RoutedEventArgs аргументы, логические ответил ререйзом)
в системе.Окна.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
в системе.Окна.UIElement.Метод raiseevent(RoutedEventArgs аргументы, логические доверять)
в системе.Окна.Ввод.RoutedCommand.ExecuteImpl(Object parameter, IInputElement target, Boolean userInitiated)
в системе.Окна.Ввод.RoutedCommand.Execute(параметр объекта, цель IInputElement)
в системе.Окна.Управления.компонента DataGrid.EndEdit(команда RoutedCommand, DataGridCell cellContainer, DataGridEditingUnit editingUnit, Boolean exitEditMode)
в системе.Окна.Управления.компонента DataGrid.OnCurrentCellChanged(класс DependencyObject, Д, Е DependencyPropertyChangedEventArgs)
в системе.Окна.объект DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
в системе.Окна.Класс FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs e)
в системе.Окна.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs args)
в системе.Окна.Класса DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex, типа DependencyProperty ДП, PropertyMetadata метаданных, EffectiveValueEntry oldEntry, EffectiveValueEntry&амп; newEntry, логическое coerceWithDeferredReference, логическое coerceWithCurrentValue, какой-либо сделке возникло какой-либо сделке возникло)
в системе.Окна.Класса DependencyObject.SetValueCommon(DependencyProperty в ДП, объект, значение, PropertyMetadata метаданных, логических coerceWithDeferredReference, логическое coerceWithCurrentValue, какой-либо сделке возникло какой-либо сделке возникло, логическое isInternal)
в системе.Окна.объект DependencyObject.SetCurrentValueInternal(DependencyProperty dp, значение объекта)
в системе.Окна.Управления.DataGrid.set_CurrentCellContainer(значение DataGridCell)
в системе.Окна.Управления.DataGrid.set_FocusedCell(значение DataGridCell)
в системе.Окна.Управления.DataGridCell.OnAnyGotFocus(отправитель объекта, RoutedEventArgs e)
в системе.Окна.RoutedEventHandlerInfo.InvokeHandler(объект target, RoutedEventArgs routedEventArgs)
в системе.Окна.Контейнер маршрута eventroute.InvokeHandlersImpl(источник, объект, RoutedEventArgs аргументы, логические ответил ререйзом)
в системе.Окна.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
в System.Win

Richard MacCutchan

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