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