【问题标题】:DataGrid 'EditItem' is not allowed for this view when dragging multiple items拖动多个项目时,此视图不允许 DataGrid 'EditItem'
【发布时间】:2011-10-20 09:53:40
【问题描述】:

我有一个数据网格,它可以像这样获取数据:

    public struct MyData
    {
        public string name { set; get; }
        public string artist { set; get; }
        public string location { set; get; }
    }

    DataGridTextColumn col1 = new DataGridTextColumn();
    col4.Binding = new Binding("name");
    dataGrid1.Columns.Add(col1);
    dataGrid1.Items.Add((new MyData() { name = "Song1", artist = "MyName", location =     "loc"}));
    dataGrid1.Items.Add((new MyData() { name = "Song2", artist = "MyName", location =     "loc2"}));

问题是 - 每当用户尝试编辑一个单元格或拖动多个单元格时 - 应用程序都会引发异常:

System.InvalidOperationException 未处理
消息:此视图不允许使用“EditItem”。

这是为什么?是因为输入数据的方式吗?
有什么想法吗?
谢谢!

【问题讨论】:

    标签: wpf datagrid invalidoperationexception


    【解决方案1】:

    我在将 ItemsSource 分配给 IEnumerable 时遇到了这个问题。

    我通过将 IEnumberable 转换为 List 然后将其分配给 ItemsSource 来修复它。

    我不确定为什么使用 IEnumerable 会导致该问题,但此更改为我解决了问题。

    【讨论】:

    • 因为List<T>支持Add()Remove()
    • 同意 Jack Frost。
    【解决方案2】:

    不要使用struct,而是使用class

    更新答案:尝试将您的 MyData 实例添加到列表中,然后将该列表分配给 DataGrid.ItemsSource

    【讨论】:

    • 我把 'struct' 改成了 'class',但还是抛出了异常。
    • @amitarios:尝试将您的MyData 实例添加到List<MyData>,然后将该列表分配给DataGrid.ItemsSource
    • 将其放入列表中编辑了列表,但没有编辑源对象。我错过了什么吗?
    【解决方案3】:

    如果你使用datagrid DataGridCheckBoxColumn 你需要设置<Setter Property="IsEditing" Value="true" /> 在复选框列上。看到这个:https://stackoverflow.com/a/12244451/1643201

    【讨论】:

      【解决方案4】:

      这个答案不是我自己的,只是 AnthonyWJones 建议的工作代码示例。

      public class MyData //Use class instead of struct
      {
          public string name { set; get; }
          public string artist { set; get; }
          public string location { set; get; }
      }
      
      DataGridTextColumn col1 = new DataGridTextColumn();
      col4.Binding = new Binding("name");
      dataGrid1.Columns.Add(col1);
      dataGrid1.Items.Add((new MyData() { name = "Song1", artist = "MyName", location =     "loc"}));
      dataGrid1.Items.Add((new MyData() { name = "Song2", artist = "MyName", location =     "loc2"}));
      
      //Create a list of MyData instances
      List<MyData> myDataItems = new List<MyData>(); 
      myDataItems.Add(new MyData() { name = "Song1", artist = "MyName", location =     "loc"});
      myDataItems.Add(new MyData() { name = "Song2", artist = "MyName", location =     "loc2"});
      
      //Assign the list to the datagrid's ItemsSource
      dataGrid1.ItemsSource = items;
      

      【讨论】:

        【解决方案5】:

        就我而言,

        processLimits.OrderBy(c => c.Parameter);
        

        返回一个

        IOrderedEnumerable<ProcessLimits> 
        

        不是

        List<ProcessLimits>
        

        因此,当我将事件设置器的样式分配给数据网格中的复选框列时

        style.Setters.Add(new EventSetter(System.Windows.Controls.Primitives.ToggleButton.CheckedEvent, new RoutedEventHandler(ServiceActiveChecked)));
        

        ServiceActiveChecked 从未被调用,我得到了

        'EditItem' is not allowed for this view.
        

        对于在数据网格列中进行复选框的其他任何人,我在此构造函数中使用带有列数据的列对象来添加我在添加上述样式时使用的数据网格。

        datagridName.Columns.Add(new DataGridCheckBoxColumn()
                                    {
                                        Header = column.HeaderText.Trim(),
                                        Binding = new System.Windows.Data.Binding(column.BindingDataName.Trim()) { StringFormat = column.StringFormat != null ? column.StringFormat.Trim().ToString() : "" },
                                        IsReadOnly = column.IsReadOnlyColumn,
                                        Width = new DataGridLength(column.DataGridWidth, DataGridLengthUnitType.Star),
                                        CellStyle = style,
                                    });
        

        【讨论】:

          【解决方案6】:

          我通过在 InitializeComponent 之后设置数据网格的源解决了这个问题:

              public MainWindow()
              {
                  InitializeComponent();
                  FilterGrid.ItemsSource = ScrapeFilter;
              }
          

          【讨论】:

            猜你喜欢
            • 2018-03-25
            • 2013-09-05
            • 2013-11-30
            • 2017-04-26
            • 2011-09-13
            • 1970-01-01
            • 2013-10-20
            • 2011-03-01
            相关资源
            最近更新 更多