C # WPF-Toolkit: Wie kann ich eine Zelle von einem Datenraster bearbeitet werden?
-
22-07-2019 - |
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:
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).