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

StackOverflow https://stackoverflow.com/questions/1230236

Вопрос

Обратите внимание на код этой небольшой программы 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 появляется окно сообщения со следующим текстом:«Для текущего местоположения нет исходного кода». Я хотел бы знать, как я могу сделать ячейку из DataGrid быть редактируемой?


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

System.InvalidoPerationException было нездоровым сообщением = "" edititem "не допускается для этой точки зрения».
Источник="ПрезентацияFramework"
Трассировки стека:at System.windows.controls.itemcollection.system.componentmodel.ieditablecollectionview.edititem (Object Item) на microsoft.windows.controls.datagrid.editrowitem (Object Rowitem) в C: dd wpf_1 src wpf src controlspac Wpftoolkit datagrid microsoft windows controls datagrid.cs: line 3396 на microsoft.windows.controls.datagrid.onexecutedbeginedit (celfedRoutedEventArgs e) в c: dd wpf_1 src wpf src controlspac Microsoft Windows Controls DataGrid.cs: строка 2208 на microsoft.windows.controls.datagrid.onexecutedbeginedit (Object Sender, celfedRoutedEventargs e) в C: dd wpf_1 src wpf src controdspac Windows controls datagrid.cs: line 2036 at system.windows.inpat.commandbinding.onexecated (отправитель объекта, celfedRoutedEventargs e) at system.windows.input.commandmanager.executecommandbinding (объект -отправитель, выполненный .Windows.input.commandmanager.findCommandBinding (CommandBindingCollection CommandBindings, отправитель объекта, RoutledEventargs E, команда iCommand, Boolean Execute) на System.Windows.input.commandmanager.findCommandbinding (Sender Sender, RoutedEventArgs E, icommand Executite). Windows.input.commandmanager.onexecated (отправитель объекта, celfedroutedeventargs e) at system.windows.ueelement.onexecutedthunk (отправитель объекта, выполненный размер. .RoutedEventargs.invokehandler (обработчик делегата, объект цели) в System.windows.routedEventhandlerInfo.invokehandler (объект цели, RoutledEventargs RoutedEventargs) на System.Windows.eventroute.invokehandlersImple .RiaseeVentiMpl (отправитель DevingObject, RoutedEventArgs args) в System.Windows.Uelement.Raiseevent (RoutedEventArgs Args, Boolean Trusted) в System.Windows.Input.RoutedCommand.executeImpl (объектный параметров, iinputelement, лобовое пользовательский пользователь. .RoutedCommand.execute (параметр объекта, iinputelement target) на microsoft.windows.controls.datagrid.beginedit (routedeventargs editingeventargs) в c: dd wpf_1 src wpf src controdspac DataGrid.cs: строка 3059 на microsoft.windows.controls.datagridcell.onanymouseleftbuttondondow :line 748 at Microsoft.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDownThunk(Object sender, MouseButtonEventArgs e) in C:ddWPF_1srcwpfsrcControlsPackWPFToolkitDataGridMicrosoftWindowsControlsDataGridCell.cs: Строка 726 at system.windows.input.mousebuttoneventargs.invokeeventhandler (делегат generichandler, object geneictarget) на system.windows.routedeventargs.invokehandler (делегат -обработчик, объект целевой) на routededeventeventeventevedevedev 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.CrackMouseButtonEventAndReRaiseEvent(DependencyObject sender, MouseButtonEventArgs e) at System.Windows.Uielement.onmouseDownthunk (отправитель объекта, mousebuttoneventargs e) at system.windows.input.mousebuttoneventargs.invokeeventhandler (делегат generichandler, object genestartearget) на System.windows.routedeventargs.invokehandler (Delegate Handler). Windows.routedeventhandlerinfo.invokehandler (объект цели, RoutedEventargs RoutedEventArgs) на System.Windows.eventroute.invokehandlersImpl (источник объекта, RoutedEventargs args, boolean rereraised) at systems.windows.weeleventempleventistempleventive atemendev argeDevente. 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, Mode Inputmode, Int32 TimeStamp, Rawmouseactions, Int32 X, Int32 Y, int32 Wheel) на System.Windows.Ingop.hwndmouseInputProvider.filtermessage (intptr hwndm, intptrdptr, intptrdptrtry, intptrdptrtrypryder.filtermessage. WPARAM, Intptr LPARAM, BOOLEAN & RADEND) в System.Windows.Interop.hwndsource.inputfiltermessage (Intptr hwnd, Int32 MSG, Intptr Wparam, Intptr Lparam, Boolean & Handled) At Ms.win32.hwndwrapper.wndprc (intptr hlyddtrtr WPARAM, Intptr LPARAM, BOOLEAN & RADENT) по адресу ms.win32.hwndsubclass.dispatchercallbackoperation (Object O) на System.Windows.Threading.ExceptionWrapper.InternalRealLcall (Delegate Callback, Object Args, Boolean issingleparameter) на System.Windows.TheRread. (Источник объекта, Callback Delegate, Object Args, Boolean IssingleParameter, Degegate Catchandler) на System.Windows.Threading.Dispatcher.WrappedInvoke (Callback Delegate, Object Args, Boolean Essingleparameter, Delegate CatchHandler) на System.Windows.Threading.Dispatcher.invoke, делегат CatchHandler) на системе. Приоритет DispatcherPriority, тайм -аут TimeSpan, метод делегирования, объект Args, Boolean IssingleParameter) в System.Windows.Threading.Dispatcher.invoke (Приоритет диспетчерпиора, метод делегата, объект arg) на ms.win32.hwndsubclass.subclasswndproc (intptr). Intptr Wparam, Intptr Lparam) в Ms.win32.unsafenativemethods.dispatchmessage (msg & msg) at system.windows.threading.dispatcher.pushframeimpl (дисплей -кадр) на системе. .Threading.Dispatcher.Run () at System.Windows.Application.Rundispatcher (объект игнорируется) at system.windows.application.runinternal (окно окна) в system.windows.application.run (окно окна) на system.windows.application .Run () at wpfdatagridtest.app.main () в c: users frank documents visual_studio_2008 projects wpfdatagridtest wpfdatagridtest obj debug app.gs: line 0 at system.appdomain._nexecuteasseasseasseassembly (сборка. Сборка, String [] args) at system.appdomain.executeaseSembly (String Assemblyfile, доказательства сборки, string [] args) на microsoft.visualstudio.hostingprocess.hostproc.runusersessassembly () at system.threading.threadhelper.threadsatr System.Threading.ExecutionContext.Run (executionContext executionContext, ContextCallback Callback, состояние объекта) на system.threading.threadhelper.threadstart () innerexception:

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top