【问题标题】:WPF DataGrid Remove SelectedItemsWPF DataGrid 删除 SelectedItems
【发布时间】:2011-09-17 21:20:42
【问题描述】:

最近我一直在从事一个项目,该项目将数据以编程方式导入 WPF DataGrid。

我几乎完成了这个项目,但我遗漏了一个用于删除选定单元格的按钮,这就是我卡住的地方!

我使用 DataGrids 的基本知识编写了这段代码:

var grid = dataGrid1;
if (grid.SelectedIndex >= 0)
 {
   for (int i = 0; i <= grid.SelectedItems.Count; i++)
   {
      grid.Items.Remove(grid.SelectedItems[i]);
   };
 }

像 CurrentItem 一样仅删除选定的项目时效果很好,但它不会删除超过 2 个选定的项目!

我拥有的 DataGrid 至少应包含 100 个项目。我添加了一个全部删除选项,但这也是必要的。

如果有人给我解决方案,我将不胜感激。

【问题讨论】:

    标签: c# wpf datagrid selecteditem


    【解决方案1】:

    通过删除选定的项目,您正在更改 SelectedItems 集合。您应该先复制它,然后再开始删除。

    【讨论】:

      【解决方案2】:

      这对我也很有效。

      while (dataGrid1.SelectedItems.Count > 0){
        dataGrid1_item_source.Rows.RemoveAt(dataGrid1.SelectedIndex);
      }
      

      【讨论】:

        【解决方案3】:

        你在这里做的错误是在循环期间删除项目,这会弄乱循环计数,所以制作一个复制网格并从中删除选定的项目,然后用原始项目均衡它。 看看这个

        var grid = dataGrid1;
        var mygrid = dataGrid1
        if (grid.SelectedIndex >= 0)
        {
          for (int i = 0; i <= grid.SelectedItems.Count; i++)
          {
            mygrid .Items.Remove(grid.SelectedItems[i]);  
           };
        }
        
        grid = mygrid;
        

        【讨论】:

        • Tnx!我将 SelectedItem 对象复制到一个新对象中并添加到循环中。
        • 这不起作用,因为gridmygrid 是相同的DataGrid
        【解决方案4】:

        这对我有用...

        while (dataGrid1.SelectedItems.Count > 0){
          dataGrid1_item_source.Rows.RemoveAt(dataGrid1.SelectedIndex);
        }
        

        【讨论】:

        • 如果您对 DataGrid 进行了排序,他的索引不起作用,因为索引与基础项目源不同。此外,它将是 dataGrid1_item_source.RemoveAt(dataGrid1.SelectedIndex); Rows 不在 ObservableCollection 中。
        【解决方案5】:

        这对我有用...

        if (DataGrid1.SelectedItem != null)
                {
                    ((DataRowView)(DataGrid1.SelectedItem)).Row.Delete();
                }
        

        【讨论】:

          【解决方案6】:

          使用 SelectedItem 而不是 SelectedIndex 的 while 循环

          while (dataGrid1.SelectedItems.Count > 0){
            if (dataGrid1.SelectedItem == CollectionView.NewItemPlaceholder)
                dataGrid1.SelectedItems.Remove(grid.SelectedItem);
            else
                dataGrid1.Items.Remove(dataGrid1.SelectedItem);
          }
          

          【讨论】:

            【解决方案7】:

            我和作者有同样的问题。并找到了相当漂亮(我认为)的解决方案。

            所以主要问题是SelectedItems 是动态的,当你删除一行时,它会重新计算。

            所以我的代码如下所示:

            for (int i = -datagrid1.SelectedItems.Count; i < datagrid1.SelectedItems.Count; i++)
                    {
                        datagrid1.SelectedItems.RemoveAt(datagrid1.SelectedIndex);
                    }
            

            所以,每次 for 循环执行第 1 步时,datagrid1.SelectedItems.Count 减 1,变量 i 增加。

            【讨论】:

              【解决方案8】:
              Do While dgData.SelectedItems.Count > 0
               dgData.SelectedItem.Row.Delete()
              Loop
              

              【讨论】:

              • 虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。
              【解决方案9】:

              我的解决方案(如果您使用带有 autogeneratecolumns=true 的 adonet);

              for (int i = dgv.SelectedItems.Count-1; i >= 0; i--)
              {
                   DataRowView dataRow = (DataRowView)dgv.SelectedItems[i];
                   dataRow.Delete();
              }
              

              【讨论】:

                猜你喜欢
                • 2011-09-18
                • 1970-01-01
                • 2019-09-07
                • 1970-01-01
                • 2010-12-07
                • 1970-01-01
                • 2012-05-20
                • 2019-06-22
                • 2014-08-22
                相关资源
                最近更新 更多