Инструментарий C # WPF: как сделать ячейку из таблицы данных доступной для редактирования?

Обратите внимание на код этой небольшой программы WPF C #, созданной с помощью 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("");
        }
    }
}

Эта программа просто показывает сетку данных набора инструментов WPF с 10 столбцами с заголовками и пустой строкой.

Проблема возникает, когда определенная ячейка пустой строки выбирается, а затем щелкается для редактирования: программа вылетает. В Visual Studio появляется окно с сообщением: «Для текущего местоположения нет исходного кода». Я хотел бы знать, как сделать ячейку из таблицы данных доступной для редактирования?


Вот исключение и трассировка стека:

Вы устанавливаете свой ItemsSource на Binding, но нет DataContext, поэтому эта привязка бесполезна. Затем вы создаете столбцы в коде программной части и заполняете их временными данными. Насколько я понимаю о DataGrid, редактирование поддерживается только в том случае, если есть данные, к которым привязана сетка. Иначе какие данные вы редактируете?


person Partial    schedule 04.08.2009    source источник
comment
Я создаю пустые столбцы и даю этим столбцам заголовок. Данные, которые я редактирую, - это пустые ячейки.   -  person Partial    schedule 31.01.2010


Ответы (1)


Кроме того, я считаю, что есть свойство IsReadOnly (проверьте документацию DataGrid), для которого необходимо установить значение false (но я думаю, что по умолчанию оно неверно).

1,3 тыс. Просмотров и без голосов lol: D

person Charlie    schedule 04.08.2009
comment
Можно ли связать сетку данных с каким-то пустым списком, который при редактировании ячеек сетки данных добавляет текст из этой ячейки в список? - person Partial; 05.08.2009
comment
Определенно. Создайте новый класс, представляющий данные, которые вы храните в сетке данных. Затем вы можете привязаться к ObservableCollection этих данных. Подобно этому: msdn.microsoft.com/en-us/library/ms748365. aspx - person Partial; 05.08.2009
comment
Я пробовал использовать ItemsSource и ArrayList. Это плохая идея? - person Charlie; 05.08.2009
comment
ArrayList не будет предоставлять автоматическое уведомление об изменении, такое как ObservableCollection. Если вам не нужно никаких уведомлений об изменениях, тогда ArrayList будет в порядке. Вы также можете реализовать INotifyPropertyChanged в своем собственном классе ArrayList. - person Partial; 06.08.2009
comment
System.InvalidOperationException был необработан. Сообщение = "'EditItem' не разрешен для этого представления."
Source = "PresentationFramework"
StackTrace: в System.Windows.Controls.ItemCollection.System.ComponentModel.IEditableCollectionView.EditItem (Object item) в Microsoft.Windows.Controls.DataGrid.EditRowItem (объект rowItem) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: строка 3396 в Microsoft .Windows.Controls.DataGrid.OnExecutedBeginEdit (ExecutedRoutedEventArgs e) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: строка 2208 в Microsoft.Windows. .DataGrid.OnExecutedBeginEdit (отправитель объекта, ExecutedRoutedEventArgs e) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ Windows \ Controls \ DataGrid.cs: строка 2036 в System.Windows.Input. CommandBinding.OnExecuted (отправитель объекта, ExecutedRoutedEven tArgs e) в System.Windows.Input.CommandManager.ExecuteCommandBinding (отправитель объекта, ExecutedRoutedEventArgs e, CommandBinding commandBinding) в System.Windows.Input.CommandManager.FindCommandBinding (CommandBindingCollection commandBindings, в Object Senderrgs, команда RoutedEvent, команда RoutedEvent System.Windows.Input.CommandManager.FindCommandBinding (отправитель объекта, RoutedEventArgs e, команда ICommand, логическое выполнение) в System.Windows.Input.CommandManager.OnExecuted (отправитель объекта, ExecutedRoutedEventArgs e) в System.Windows.UIElementThunk.On , ExecutedRoutedEventArgs e) в System.Windows.Input.ExecutedRoutedEventArgs.InvokeEventHandler (делегат genericHandler, цель объекта) в System.Windows.RoutedEventArgs.InvokeHandler (обработчик делегата, цель объекта) в System.Windows.VokeHandler (обработчик делегата, цель объекта), ObjectEventEventHandler (цель объекта), ObjectEventEventHandler (цель), ObjectEventEventEventHandler (цель объекта), ObjectEventEventHandler (цель объекта), RouketedEventHandler (цель), ObjectEvent), объект Rouketed Args) в System.Windows.EventRoute.InvokeHandlersImpl (источник объекта, аргументы RoutedEventArgs, Boolean reRaised) в System.Windows.UIElement.RaiseEventImpl (DependencyObject sender, RoutedEventArgs args) в System.Windows.UIEleventArgs в System.Windows.Input.RoutedCommand.ExecuteImpl (параметр объекта, цель IInputElement, логическое значение userInitiated) в System.Windows.Input. RoutedCommand.Execute (параметр объекта, цель IInputElement) в Microsoft.Windows.Controls.DataGrid.BeginEdit (RoutedEventArgs editEventArgs) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrids \ Microsoft. DataGrid.cs: строка 3059 в Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDown (MouseButtonEventArgs e) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ WindowsC \ Controls. строка 748 в Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDownThunk (отправитель объекта, MouseButtonEventArgs e) в C: \ dd \ WPF_1 \ src \ wpf \ src \ ControlsPack \ WPFToolkit \ DataGrid \ Microsoft \ WindowsC line \ Controls. 726 в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler (делегат genericHandler, объект genericTarget) в System.Windows.RoutedEventArgs.InvokeHandler (обработчик делегата, цель объекта) в System.Windows.RoutedEventHandlerHandlerInfo.Info.Info. andler (цель объекта, RoutedEventArgs routedEventArgs) в System.Windows.EventRoute.InvokeHandlersImpl (источник объекта, аргументы RoutedEventArgs, Boolean reRaised) в System.Windows.UIElement.ReRaiseEventAs (DependencyObject sendergs, RoutedEventEventArt, RoutedEventArt, отправитель System.EventEvent, RoutedEventArt, RoutedEvent, новый объект, RoutedEvent) .CrackMouseButtonEventAndReRaiseEvent (отправитель объекта DependencyObject, MouseButtonEventArgs e) в System.Windows.UIElement.OnMouseDownThunk (отправитель объекта, MouseButtonEventArgs e) в System.Windows.Input.MouseButtonEventArgs e) в System.Windows.Input.MouseButtonEventAventArgs.Input.MouseButtonEventArget. Обработчик делегата, цель объекта) в System.Windows.RoutedEventHandlerInfo.InvokeHandler (цель объекта, RoutedEventArgs routedEventArgs) в System.Windows.EventRoute.InvokeHandlersImpl (источник объекта, аргументы RoutedEventArgs, логическое преобразование Windows) в System.UlemeRaised. nt.RaiseEventImpl (отправитель DependencyObject, аргументы RoutedEventArgs) в System.Windows.UIElement.RaiseEvent (аргументы RoutedEventArgs, логическое доверие) в System.Windows.Input.InputManager.ProcessStagingArea () в System.Windows.Input.InputEventArea () ) в System.Windows.Input.InputProviderSite.ReportInput (InputReport inputReport) в System.Windows.Interop.HwndMouseInputProvider.ReportInput (IntPtr hwnd, режим InputMode, временная метка Int32, действия RawMouseActions, Int32 x, Int32 y, колесо Int32) в System. Windows.Interop.HwndMouseInputProvider. MS.Win32.HwndWrapper.WndProc (IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean & handled) в MS.Win32.HwndSubclass.DispatcherCallbackOperation (Object o) в System.Windows.Threading.Exception args, Boolean isSingleParameter) в System.Windows.Threading.ExceptionWrapper.TryCatchWhen (источник объекта, обратный вызов делегата, аргументы объекта, логическое значение isSingleParameter, делегат catchHandler) в System.Windows.Threading.Dispatcher.WrappedInvoke (обратный вызов аргумента isSingmeter, обратный вызов объекта , Делегировать catchHandler) в System.Windows.Threading.Dispatcher.InvokeImpl (DispatcherPriority до ity, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter) в System.Windows.Threading.Dispatcher.Invoke (DispatcherPriority priority, Delegate method, Object arg) в MS.Win32.HwndSubclass.SubclassWndProc (IntPtr hgt, IntPtr hwnd, IntPtr, msgwnd, IntPtr wParam, IntPtr lParam) в MS.Win32.UnsafeNativeMethods.DispatchMessage (MSG и msg) в System.Windows.Threading.Dispatcher.PushFrameImpl (кадр DispatcherFrame) в System.Windows.Threading.Dispatcher.PushFrame (в кадре DispatcherFrame). Threading.Dispatcher.Run () в System.Windows.Application.RunDispatcher (игнорирование объекта) в System.Windows.Application.RunInternal (окно окна) в System.Windows.Application.Run (окно окна) в System.Windows.Application. Run () в WpfDatagridTest.App.Main () в C: \ Users \ Frank \ Documents \ Visual_Studio_2008 \ Projects \ WpfDatagridTest \ WpfDatagridTest \ obj \ Debug \ App.g.cs: строка 0 в System.AppDomain._nExecuteAssembly (сборка сборки, String [] args) в System.AppDomain.ExecuteAssembly (String AssemblyFile, Evidence assemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading. ThreadHelper.ThreadStart_Context (состояние объекта) в System.Threading.ExecutionContext.Run (контекст выполнения ExecutionContext, обратный вызов ContextCallback, состояние объекта) в System. Threading.ThreadHelper.ThreadStart () InnerException: - person Charlie; 06.08.2009