此视图不允许使用“EditItem” - WPF数据编辑问题

时间:2011-12-30 08:54:39

标签: wpf datagrid

我有一个树视图学生。我在树视图中的项目是班级中学生的名字。在TreeView中选择项目时,我的DataGrid“StudentDetails”中的数据应该更改。我的DataGrid有两列'Parameter_Details'和'Details'。第二列详细信息应该是可编辑的。行可能会有所不同,具体取决于TreeViewItem的选择。

例如,My TreeView有两个项目,比如
杰克
吉尔

当我单击/选择Jack时,我的DataGrid“学生详细信息”显示包含两列的1行 'Parameter_Details'列下的字符串'Address'和'Details'列下的string.Empty

地址|

当我单击/选择Jill时,我的DataGrid'StudentDetails'显示2行,包含两列 第一排: 'Parameter_Details'列下的字符串'Last Name'和'Details'列下的string.Empty 第二排: 'Parameter_Details'列下的字符串'Address'和'Details'列下的string.Empty 姓氏| 地址|

我使用foreach循环向数据网格添加数据。我从DB获取'ParameterDetails',其中每一行都有与TreeviewItem对应的Parameter

每当我选择TreeviewItem时,我都会附上一段代码:

dgStudentDetails.Items.Clear();

foreach (Parameter_Details entry in ParameterDetails)
{
    if(entry.ID == SelectedTVItem.ID)
    {
        dgKeywordParameters.Items.Add(new Parameter_dgInput() { name = entry.Name, input = "" });
    }
}

数据被绑定到数据网格,但是当我尝试使用

编辑第二列时
private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    DataGridCell cell = sender as DataGridCell;

    if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
    {
        // enables editing on single click
        if (!cell.IsFocused)
        cell.Focus();

        DataGrid dataGrid = UIHelpers.TryFindParent<DataGrid>(cell);

       if (dataGrid != null)
        {
             if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
             {
                 if (!cell.IsSelected)
                      cell.IsSelected = true;
             }
             else
             {
                  DataGridRow row = UIHelpers.TryFindParent<DataGridRow>(cell);
                  if (row != null && !row.IsSelected)
                  {
                      row.IsSelected = true;
                  }
             }
        }
    }
}

我收到以下错误:

System.InvalidOperationException was unhandled
  Message='EditItem' is not allowed for this view.
  Source=PresentationFramework
  StackTrace:
       at System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem(Object item)
       at System.Windows.Controls.DataGrid.EditRowItem(Object rowItem)
       at System.Windows.Controls.DataGrid.OnExecutedBeginEdit(ExecutedRoutedEventArgs e)
       at System.Windows.Controls.DataGrid.OnExecutedBeginEdit(Object sender, ExecutedRoutedEventArgs e)
       at System.Windows.Input.CommandBinding.OnExecuted(Object sender, ExecutedRoutedEventArgs e)
       at System.Windows.Input.CommandManager.ExecuteCommandBinding(Object sender, ExecutedRoutedEventArgs e, CommandBinding commandBinding)
       at System.Windows.Input.CommandManager.FindCommandBinding(CommandBindingCollection commandBindings, Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
       at System.Windows.Input.CommandManager.FindCommandBinding(Object sender, RoutedEventArgs e, ICommand command, Boolean execute)
       at System.Windows.Input.CommandManager.OnExecuted(Object sender, ExecutedRoutedEventArgs e)
       at System.Windows.UIElement.OnExecutedThunk(Object sender, ExecutedRoutedEventArgs e)
       at System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler(Delegate genericHandler, Object target)
       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.RoutedCommand.ExecuteImpl(Object parameter, IInputElement target, Boolean userInitiated)
       at System.Windows.Input.RoutedCommand.Execute(Object parameter, IInputElement target)
       at System.Windows.Controls.DataGrid.BeginEdit(RoutedEventArgs editingEventArgs)
       at System.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDown(MouseButtonEventArgs e)
       at System.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDownThunk(Object sender, MouseButtonEventArgs e)
       at System.Windows.Input.MouseButtonEventArgs.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.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
       at System.Windows.UIElement.OnMouseDownThunk(Object sender, MouseButtonEventArgs e)
       at System.Windows.Input.MouseButtonEventArgs.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.RaiseTrustedEvent(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.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
       at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
       at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
       at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
       at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
       at System.Windows.Application.RunDispatcher(Object ignore)
       at System.Windows.Application.RunInternal(Window window)
       at System.Windows.Application.Run(Window window)
       at System.Windows.Application.Run()
       at EBS.App.Main() in C:\projects\EBS\EBS\obj\x86\Debug\App.g.cs:line 0
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException:

2 个答案:

答案 0 :(得分:4)

我也遇到过这个错误。似乎有许多可能的原因导致相同的错误消息。

我认为在你的情况下,我可以做我做的事情。我认为问题在于,如果绑定数据不是允许编辑的类型之一,DataGrid将在编辑数据时抛出此错误。

对我来说似乎运行良好的是,如果我创建一个新的List我想要显示的内容(也许是我为此目的而创建的类,我在网格中定义每一列),然后将DataGrid绑定到那份清单。

您可以在以下位置查看我的问答: Why does one of MY WPF DataGrids give the "'EditItem' is not allowed for this view" exception?

答案 1 :(得分:1)

我对Why does one of MY WPF DataGrids give the "'EditItem' is not allowed for this view" exception?的回答归结为使用ObservableCollection作为绑定项:https://stackoverflow.com/a/36924136/4504897(链接以避免重复答案;不确定礼仪是什么;也许SO需要一种添加方式现有的问题答案?)