Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从窗体中删除选定单元格的行_C#_Datagridview - Fatal编程技术网

C# 从窗体中删除选定单元格的行

C# 从窗体中删除选定单元格的行,c#,datagridview,C#,Datagridview,其思想是:当用户选择一个或多个单元格,然后单击删除按钮时,Datagridview将删除这些选定单元格的整行。当没有任何东西显示如何删除多个单元格行时,我的头脑就要崩溃了。若删除选定的行或单个单元格,问题很简单。但多细胞问题是 rowsToDelete=rowsToDelete.OrderByDescending(rowIndex => rowIndex).ToList(); foreach (Int32 rowIndex in rowsToDelete) { t

其思想是:当用户选择一个或多个单元格,然后单击删除按钮时,Datagridview将删除这些选定单元格的整行。当没有任何东西显示如何删除多个单元格行时,我的头脑就要崩溃了。若删除选定的行或单个单元格,问题很简单。但多细胞问题是

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

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

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

rowsToDelete.Clear();
假设gridview内容为2列,gridview中的数据不是来自db

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

rowsToDelete.Clear();
我尝试过以下代码:

while(dgv1.selectedCells.count>0){
dgv1.removeAt(dgv1.selectedCells[0].RowIndex);
}
rowsToDelete=rowsToDelete.OrderByDescending(rowIndex => rowIndex).ToList();          
foreach (Int32 rowIndex in rowsToDelete)
{
   this.dgv1.Rows.RemoveAt(rowIndex);
}

rowsToDelete.Clear();
但是这一个删除了整个datagridview,因为当gridview删除一行时,它会得到第一个单元格,第一个列,第一个选中的行

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

rowsToDelete.Clear();
然后我试试这个:

List<int> rowToDelete = new List<int>();
foreach(DataGridViewCell cell in dgv1.selectedCells){
  rowToDelete.add(cell.RowIndex);
}
rowsToDelete=rowsToDelete.OrderByDescending(rowIndex => rowIndex).ToList();          
foreach (Int32 rowIndex in rowsToDelete)
{
   this.dgv1.Rows.RemoveAt(rowIndex);
}

rowsToDelete.Clear();
但当我选择的单元格多于Rows.Count时,就会出现索引越界异常。 此外,如果在同一行中选择2个单元格,则会导致下一行删除错误的行。这是我的主要问题

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

rowsToDelete.Clear();

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

您已经接近了。向后遍历选定单元格的行索引,这样它们就不会更改。不要向列表中添加重复的行索引!如果从顶部删除,行将向上移动,新行将采用旧索引。如果从底部删除,则只需向上移动,新项目向上移动并不重要,因为您已经移动过该索引

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

rowsToDelete.Clear();
因此:

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

rowsToDelete.Clear();

它完成了要求的工作,试试看

List<int> rowsToDelete = new List<int>();

 foreach (DataGridViewCell cell in this.dgv1.SelectedCells)
{
   if (rowsToDelete.Contains(cell.RowIndex) == false)
       rowsToDelete.Add(cell.RowIndex);
} 
rowsToDelete=rowsToDelete.OrderByDescending(rowIndex => rowIndex).ToList();          
foreach (Int32 rowIndex in rowsToDelete)
{
   this.dgv1.Rows.RemoveAt(rowIndex);
}

rowsToDelete.Clear();

不管怎样,我问了我的老师,下面是他对这个代码的最终答案:

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

rowsToDelete.Clear();
        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有点难理解…

它在某种程度上有所帮助,但是,当我选择多个单元格时,仍然会出现索引越界异常,单元格数大于行数。对于int i=dataGridView1.SelectedCells.Count-1;i>=0;i-{dataGridView1.Rows.RemoveAtdataGridView1.SelectedCells[i].RowIndex;}@Eddie这就是为什么我说要确保不循环重复的行索引。所以你不会多次尝试索引同一行。是的,但你只是给出了想法,我知道了,但不知道如何管理它。但问题还是解决了,谢谢。巧合:。
rowsToDelete=rowsToDelete.OrderByDescending(rowIndex => rowIndex).ToList();          
foreach (Int32 rowIndex in rowsToDelete)
{
   this.dgv1.Rows.RemoveAt(rowIndex);
}

rowsToDelete.Clear();
for(int i=0;i<10;i++)

{

dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i].Index);

}