这个想法是:当用户选择一个单元格或多个单元格然后单击删除按钮时,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,但这可能会发生相同的行索引要添加,这会导致错误的行被删除,并可能使代码更复杂。 请帮忙。
编辑:正如亚特里克斯推荐的那样,我使用这段代码(我认为我得到了他推荐的权利)
for (int i = dataGridView1.SelectedCells.Count -1; i >=0; i--)
{
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedCells[i].RowIndex);
}
但是当我选择Rows.Count以外的单元格时,会发生索引超出范围的异常。 另外,如果我在同一行中选择2个单元格,则会导致错误的行被删除(下一行)。这是我的主要问题。
Ps:我试图制作一个程序来重命名Windows中的多个文件。
答案 0 :(得分: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();
答案 1 :(得分:0)
你很亲密。向后遍历所选单元格的行索引,这样它们就不会改变。不要在列表中添加重复的行索引!如果从顶部删除,则行向上移动,新行将采用该旧索引。如果从底部删除,则只需向上移动,因为您已经移过该索引,所以新项目向上移动并不重要。
所以:
for (i = myRowIndexes.count - 1; i >= 0; i--) {
//delete your rows
}
答案 2 :(得分:0)
无论如何,我问我的老师,这是他对这段代码的最终答案:
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有点难以理解......
答案 3 :(得分:0)
for(int i=0;i<10;i++)
{
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[i].Index);
}