【问题标题】:Delete selected cells' rows windows form删除选定单元格的行窗口窗体
【发布时间】:2012-11-20 15:10:27
【问题描述】:

这个想法是:当用户选择一个或多个单元格然后单击删除按钮时,Datagridview 将删除这些选定单元格的整行。当没有任何内容显示如何删除多个单元格行时,我的思绪被炸毁了。如果删除选定的行或单个单元格,问题很简单。但是多细胞问题是......

可能会出现一些问题:索引越界,删除整个gridview...

假设gridview内容2列,gridview中的数据不是来自db。

我试过这段代码:

while(dgv1.selectedCells.count>0){
dgv1.removeAt(dgv1.selectedCells[0].RowIndex);
}

但是这个删除了整个datagridview,因为当gridview删除一行时,它会选择第一个单元格(第一列,第一行)。

然后我试试这个:

List<int> rowToDelete = new List<int>();
foreach(DataGridViewCell cell in dgv1.selectedCells){
  rowToDelete.add(cell.RowIndex);
}

然后从列表中删除gridview Rows,但这可能会出现相同的rows索引被添加,导致错误的行被删除,并且可能使代码更复杂。 请帮忙。

已编辑:按照 yatrix 的建议,我使用了这段代码(我想我得到了他的建议)

for (int i = dataGridView1.SelectedCells.Count -1; i >=0; i--)
        {
            dataGridView1.Rows.RemoveAt(dataGridView1.SelectedCells[i].RowIndex);
        }

但是当我选择的单元格超过 Rows.Count 时,会发生索引超出范围异常。 另外,如果我在同一行中选择 2 个单元格,则会导致删除错误的行(下一行)。这是我的主要问题。

Ps:我正在尝试制作一个程序来重命名 Windows 中的多个文件。

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

    它完成了所需的工作,试试吧。

    List<int> rowsToDelete = new List<int>();
    
     foreach (DataGridViewCell cell in this.dgv1.SelectedCells)
    {
       if (rowsToDelete.Contains(cell.RowIndex) == false)
           rowsToDelete.Add(cell.RowIndex);
    } 
    

    //用户可以使用 ctrl 键选择单元格/行,因此请确保按降序对行索引进行排序。

    rowsToDelete=rowsToDelete.OrderByDescending(rowIndex => rowIndex).ToList();          
    foreach (Int32 rowIndex in rowsToDelete)
    {
       this.dgv1.Rows.RemoveAt(rowIndex);
    }
    
    rowsToDelete.Clear();
    

    【讨论】:

    • 巧合:)。
    【解决方案2】:

    你很亲密。向后遍历选定单元格的行索引,这样它们就不会改变。不要将重复的行索引添加到您的列表中!如果从顶部删除,行会向上移动,新行会占用旧索引。如果你从底部删除,你只是向上移动,一个新项目向上移动并不重要,因为你已经超过了那个索引。

    所以:

    for (i = myRowIndexes.count - 1; i >= 0; i--) {
        //delete your rows
    }
    

    【讨论】:

    • 它以某种方式有所帮助,但是,当我选择多个单元格时,仍然发生索引超出范围异常,单元格数大于行数。 for (int i = dataGridView1.SelectedCells.Count -1; i >=0; i--) { dataGridView1.Rows.RemoveAt(dataGridView1.SelectedCells[i].RowIndex); }
    • @Eddie 这就是为什么我说要确保你没有循环重复的行索引。因此,您不会尝试多次索引同一行。
    • 是的,但你只是给出了想法,我明白了,但不知道如何管理它。不过问题还是解决了,谢谢。
    【解决方案3】:

    无论如何,我问过我的老师,这是他对这段代码的最终答案:

            var q = from c in dataGridView1.SelectedCells.Cast<DataGridViewCell>()
                    orderby c.RowIndex descending
                    select c.RowIndex;
    
            int[] arr = q.Distinct().ToArray();
    
            foreach (int rowindex in arr)
            {
                dataGridView1.Rows.RemoveAt(rowindex);
            }
    

    而且这个不错,就是linq有点难懂……

    【讨论】:

      【解决方案4】:
      for(int i=0;i<10;i++)
      
      {
      
      dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i].Index);
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-17
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多