2012-12-03 10 views
2

這個想法是:當用戶選擇一個或多個單元格,然後單擊刪除按鈕,Datagridview將刪除這些選定單元格的整個行。當沒有任何東西顯示如何刪除多個單元格行時,我的思維爆炸了。如果刪除選定的行或單個單元格,問題很簡單。但是,多個單元問題是...刪除選中的單元格的行窗口

有些問題可能會發生:索引超出界限,刪除整個gridview的...

讓我們假設在GridView內容2列,在GridView的數據是不是從分貝。

我試過這段代碼:

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的行,但是這可能會出現相同的行指數以復加,導致錯誤的行被刪除,可以使代碼更復雜。 請幫忙。

編輯:作爲yatrix推薦,我用這個代碼(我想我得到了他的建議權)

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

但是當我選擇單元格比Rows.Count多,出現指數外邊界異常。 另外,如果我在同一行中選擇2個單元格,則會導致刪除錯誤的行(下一行)。這是我的主要問題。

ps:我正在試圖製作一個程序來重命名Windows中的多個文件。

回答

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(); 
+0

謝謝,這個很好! – Eddie

0

你很近。向後遍歷選定單元格的行索引,這樣它們就不會改變。不要將重複行索引添加到列表中!如果從頂部刪除,行將向上移動,並且新行將採用該舊索引。如果從底部刪除,則只需向上移動即可,因爲您已移過該索引而移動了新項目並不重要。

所以:

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

它在某種程度上有所幫助,但仍然會出現索引超出限制的異常,當我選擇多個單元格時,單元格數大於行數。 for(int i = dataGridView1.SelectedCells。計數-1; i> = 0;我 - ) { dataGridView1.Rows.RemoveAt(dataGridView1.SelectedCells [i] .RowIndex); } – Eddie

+0

@Eddie這就是爲什麼我說確保你沒有循環重複行索引。所以你不會嘗試多次索引同一行。 – Yatrix

+0

是的,但你只是提出了這個想法,而我明白了,但卻無法想象如何管理它。但無論如何,這個問題解決了,謝謝。 – Eddie

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是有點費解......

0
for(int i=0;i<10;i++) 

{ 

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

} 
相關問題