Frage

Beachten Sie den Code für dieses kleinen WPF C # Programm gemacht mit Microsoft Visual Studio 2008:

XAML

<Window x:Class="WpfDatagridTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfToolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <WpfToolkit:DataGrid 
        x:Name="DataGrid_" ItemsSource="{Binding}"
        SelectionMode="Extended"
        CanUserAddRows="False" CanUserDeleteRows="False"
        CanUserResizeRows="False" CanUserSortColumns="False"
        AutoGenerateColumns="False"
        RowHeaderWidth="17" RowHeight="25" />
    </Grid>
</Window>

.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Windows.Controls;

namespace WpfDatagridTest
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            const int MAX = 10;

            for(int i = 0; i < MAX; ++i)
                DataGrid_.Columns.Add(new DataGridTextColumn()
                {
                    Header = i
                });
            DataGrid_.Items.Add("");
        }
    }
}

Dieses Programm zeigt einfach einen WPF-Toolkit Datagrid mit 10 Spalten mit Kopf- und einer leeren Zeile.

Es Problem ist, dass, wenn eine bestimmte Zelle der leeren Zeile auftritt, ausgewählt und angeklickt dann bearbeitet werden: das Programm abstürzt. Ein Meldungsfeld zeigt in Visual Studio auf diese sagen: „Es gibt keinen Quellcode für den aktuellen Standort zur Verfügung steht.“ Ich würde gerne wissen, wie kann ich eine Zelle aus einem Datagrid machen sein editierbar?


Hier ist die Ausnahme und Stacktrace:

  

System.InvalidOperationException war   nicht behandelte Message = "‚EditItem‘nicht   für diese Ansicht erlaubt. "
  Source = "PresentationFramework"
  Stacktrace:          bei System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem (Object   Artikel)          bei Microsoft.Windows.Controls.DataGrid.EditRowItem (Object   rowItem) in   C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ Datagrid \ Microsoft \ Windows \ Steuerelemente DataGrid.cs \: line   3396          bei Microsoft.Windows.Controls.DataGrid.OnExecutedBeginEdit (ExecutedRoutedEventArgs   e) in   C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ Datagrid \ Microsoft \ Windows \ Steuerelemente DataGrid.cs \: line   2208          bei Microsoft.Windows.Controls.DataGrid.OnExecutedBeginEdit (Object   sender, ExecutedRoutedEventArgs e) in   C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ Datagrid \ Microsoft \ Windows \ Steuerelemente DataGrid.cs \: line   2036          bei System.Windows.Input.CommandBinding.OnExecuted (Object   Absender, ExecutedRoutedEventArgs e)          bei System.Windows.Input.CommandManager.ExecuteCommandBinding (Object   Absender, ExecutedRoutedEventArgs e,   Commandcommand)          bei System.Windows.Input.CommandManager.FindCommandBinding (CommandBindingCollection   Commandbindings, Object sender,   RoutedEventArgs e, ICommand Befehl,   Boolean execute)          bei System.Windows.Input.CommandManager.FindCommandBinding (Object   Absender, RoutedEventArgs e, ICommand   Befehl, boolean execute)          bei System.Windows.Input.CommandManager.OnExecuted (Object   Absender, ExecutedRoutedEventArgs e)          bei System.Windows.UIElement.OnExecutedThunk (Object   Absender, ExecutedRoutedEventArgs e)          bei System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler (Delegieren   genericHandler, Zielobjekt)          bei System.Windows.RoutedEventArgs.InvokeHandler (Delegieren   Handler, Zielobjekt)          bei System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object   Ziel, RoutedEventArgs   RoutedEventArgs)          bei System.Windows.EventRoute.InvokeHandlersImpl (Object   Quelle, RoutedEventArgs args, Boolean   reraiste)          bei System.Windows.UIElement.RaiseEventImpl (DependencyObject   sender, RoutedEventArgs args)          bei System.Windows.UIElement.RaiseEvent (RoutedEventArgs   args, Boolean trusted)          bei System.Windows.Input.RoutedCommand.ExecuteImpl (Object   Parameter, IInputElement Ziel,   Boolean userInitiated)          bei System.Windows.Input.RoutedCommand.Execute (Object   Parameter, IInputElement Ziel)          bei Microsoft.Windows.Controls.DataGrid.BeginEdit (RoutedEventArgs   editingEventArgs) in   C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ Datagrid \ Microsoft \ Windows \ Steuerelemente DataGrid.cs \: line   3059          bei Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDown (MouseButtonEventArgs   e) in   C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ Datagrid \ Microsoft \ Windows \ Steuerelemente DataGridCell.cs \: line   748          bei Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDownThunk (Object   sender, MouseButtonEventArgs e) in   C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ Datagrid \ Microsoft \ Windows \ \ DataGridCell.cs Kontrollen: line   726          bei System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (Delegieren   genericHandler, Object genericTarget)          bei System.Windows.RoutedEventArgs.InvokeHandler (Delegieren   Handler, Zielobjekt)          bei System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object   Ziel, RoutedEventArgs   RoutedEventArgs)          bei System.Windows.EventRoute.InvokeHandlersImpl (Object   Quelle, RoutedEventArgs args, Boolean   reraiste)          bei System.Windows.UIElement.ReRaiseEventAs (DependencyObject   Absender, RoutedEventArgs args,   RoutedEvent newEvent)          bei System.Windows.UIElement.CrackMouseButtonEventAndReRaiseEvent (DependencyObject   Absender, MouseButtonEventArgs e)          bei System.Windows.UIElement.OnMouseDownThunk (Object   Absender, MouseButtonEventArgs e)          bei System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (Delegieren   genericHandler, Object genericTarget)          bei System.Windows.RoutedEventArgs.InvokeHandler (Delegieren   Handler, Zielobjekt)          bei System.Windows.RoutedEventHandlerInfo.InvokeHandler (Object   Ziel, RoutedEventArgs   RoutedEventArgs)          bei System.Windows.EventRoute.InvokeHandlersImpl (Object   Quelle, RoutedEventArgs args, Boolean   reraiste)          bei System.Windows.UIElement.RaiseEventImpl (DependencyObject   sender, RoutedEventArgs args)          bei System.Windows.UIElement.RaiseEvent (RoutedEventArgs   args, Boolean trusted)          bei System.Windows.Input.InputManager.ProcessStagingArea ()          bei System.Windows.Input.InputManager.ProcessInput (InputEventArgs   Eingang)          bei System.Windows.Input.InputProviderSite.ReportInput (InputReport   inputReport)          bei System.Windows.Interop.HwndMouseInputProvider.ReportInput (IntPtr   hwnd, Inputmode-Modus, Int32 Zeitstempel,   RawMouseActions Aktionen, Int32 x,   Int32 y, int32 Rad)          bei System.Windows.Interop.HwndMouseInputProvider.FilterMessage (IntPtr   hwnd, Int32 msg, IntPtr WParam, IntPtr   lParam, Boolean & behandelt)          bei System.Windows.Interop.HwndSource.InputFilterMessage (IntPtr   hwnd, Int32 msg, IntPtr WParam, IntPtr   lParam, Boolean & behandelt)          bei MS.Win32.HwndWrapper.WndProc (IntPtr   hwnd, Int32 msg, IntPtr WParam, IntPtr   lParam, Boolean & behandelt)          bei MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object   O)          bei System.Windows.Threading.ExceptionWrapper.InternalRealCall (Delegieren   Rückruf, Objekt args, Boolean   isSingleParameter)          bei System.Windows.Threading.ExceptionWrapper.TryCatchWhen (Object   Quelle, Delegierter Rückruf, Object   args, Boolean isSingleParameter,   Delegieren catchHandler)          bei System.Windows.Threading.Dispatcher.WrappedInvoke (Delegieren   Rückruf, Objekt args, Boolean   isSingleParameter, Delegierter   catchHandler)          bei System.Windows.Threading.Dispatcher.InvokeImpl (DispatcherPriority   Priorität, Timespan-Timeout, Delegieren   Verfahren, Objekt args, Boolean   isSingleParameter)          bei System.Windows.Threading.Dispatcher.Invoke (DispatcherPriority   Priorität, Delegatmethode, Object arg)          bei MS.Win32.HwndSubclass.SubclassWndProc (IntPtr HWND, Int32 msg, IntPtr WParam, IntPtr   lParam)          bei MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG &   Nachricht)          bei System.Windows.Threading.Dispatcher.PushFrameImpl (DispatcherFrame   Rahmen)          bei System.Windows.Threading.Dispatcher.PushFrame (DispatcherFrame   Rahmen)          bei System.Windows.Threading.Dispatcher.Run ()          bei System.Windows.Application.RunDispatcher (Object   ignorieren)          bei System.Windows.Application.RunInternal (Fenster   Fenster)          bei System.Windows.Application.Run (Fenster   Fenster)          bei System.Windows.Application.Run ()          bei WpfDatagridTest.App.Main () in   C: \ Benutzer \ Frank \ Dokumente \ Visual_Studio_2008 \ Projects \ WpfDatagridTest \ WpfDatagridTest \ obj \ Debug \ App.g.cs: line   0          bei System.AppDomain._nExecuteAssembly (Assembly   Baugruppe, String [] args)          bei System.AppDomain.ExecuteAssembly (String   assembly, Evidence   assemblySecurity, String [] args)          bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()          bei System.Threading.ThreadHelper.ThreadStart_Context (Object   Zustand)          bei System.Threading.ExecutionContext.Run (ExecutionContext   ExecutionContext, Context   Rückruf, Objektzustand)          bei System.Threading.ThreadHelper.ThreadStart ()   Innerexception:

War es hilfreich?

Lösung

Sie setzen Ihre Itemssource auf Die Bindung , aber es gibt keine Datacontext so diese Bindung ist nutzlos. Dann erzeugen Sie die Spalten in dem Code-behind und mit temporären Daten zu füllen. Von dem, was ich über das Datagrid zu verstehen, wird die Bearbeitung nur unterstützt, wenn es Daten gibt, die das Gitter gebunden ist. Andernfalls welche Daten sind Sie mit der Bearbeitung?

Außerdem glaube ich, es ist ein IsReadOnly Eigenschaft (überprüfen Sie die Datagrid-Dokumentation), die auf false gesetzt werden muss (aber ich denke, es ist standardmäßig falsch ist).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top