2012-11-13 87 views
2

我有一個dataGridView,我填充了一個文件列表。我希望能夠通過選擇條目(通過點擊它)然後按下刪除鍵來刪除其中的一些條目。這裏是我到目前爲止的代碼:刪除dataGridView中選定的行

private void DataGrid_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Delete) 
    { 
      foreach (DataGridViewRow r in DataGrid.SelectedRows) 
      { 
       if (!r.IsNewRow) 
       { 
        DataGrid.Rows.RemoveAt(r.Index);       
       } 
      } 
    } 
} 

問題是它將選定的行定義爲一次點擊過的所有行。我想刪除所有突出顯示的行。換句話說,如果一行沒有被突出顯示,它就沒有被選中。

+0

您是否嘗試過檢查該行是否被選中? –

+0

我假設DataGrid.Selected行中的所有行都被選中。就像我說的那樣,有一種模式;它取得了某個點被點擊的所有行,只是在其他地方點擊不會取消選擇它。 –

+0

選中的行和突出顯示的行之間有什麼區別? – nawfal

回答

3

這應該工作

private void DataGrid_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Delete) 
    { 
    Int32 selectedRowCount = DataGrid.Rows.GetRowCount(DataGridViewElementStates.Selected); 
    if (selectedRowCount > 0) 
    { 
     for (int i = 0; i < selectedRowCount; i++) 
     { 
      DataGrid.Rows.RemoveAt(DataGrid.SelectedRows[0].Index); 
     } 
    } 
    } 
} 
+0

請詳細說明。爲什麼這個工作? _爲什麼原始代碼不工作? –

+0

兩者都應該工作,我不知道爲什麼原始版本不起作用 這可能是因爲「DataGrid.SelectedRows」包含選擇引用時的只讀快照。 – Benjamin

1

既然不能直接評論(點聲望),約翰·桑德斯問了一個問題,爲什麼確定應該工作的解決方案和原來的職位沒有 - 因爲它們是非常相似的。
兩者之間的區別在於,在原始a For Each語句中,正在使用迭代哪個強制對象引用迭代對象,因此,如果刪除了一個對象,則被引用的對象會被搞亂(因爲它是一個集合,即改變你引用的集合)。第二個作爲命名解決方案用於(int i = 0;我選擇了,它僅僅是獲取個人位置(如果您願意)在郵箱[i]中發信),因此它是唯一正在處理的對象而不是集合如
一個整體,不能更改的集合,而對於Eaching你有什麼 - 參考已經向它提出的,因此被「鎖定」 ..

0

    private: System::Void DeleteRow_Click(System::Object^ sender, System::EventArgs^ e) 
{   
      /*Int32 rowToDelete = this->dataGridView1->Rows->GetFirstRow(DataGridViewElementStates::Selected); 
      do { 
       try{ 
        if (this->dataGridView1->Rows[rowToDelete]->IsNewRow){ 
         this->dataGridView1->Rows[rowToDelete]->Selected = false; 
         rowToDelete = this->dataGridView1->Rows->GetFirstRow(DataGridViewElementStates::Selected); 
        } 

        this->dataGridView1->Rows->RemoveAt(rowToDelete); 

       } 
       catch (Exception^ e){ 

       } 
      } while ((rowToDelete = this->dataGridView1->Rows->GetNextRow(rowToDelete, DataGridViewElementStates::Selected)) != -1); 
      */ 

      Int32 selectedRowCount = this->dataGridView1->Rows->GetRowCount(DataGridViewElementStates::Selected); 
      for (int i = 0; i dataGridView1->Rows[this->dataGridView1->SelectedRows[0]->Index]->IsNewRow){ 
        this->dataGridView1->Rows[this->dataGridView1->SelectedRows[0]->Index]->Selected = false; 
        selectedRowCount = this->dataGridView1->Rows->GetRowCount(DataGridViewElementStates::Selected); 
        i = -1; 
       } 
       else { 
        this->dataGridView1->Rows->RemoveAt(this->dataGridView1->SelectedRows[0]->Index); 
       } 
      } 

      this->dataGridView1->ClearSelection(); 
} 

 
+3

你能否請[編輯]解釋爲什麼這段代碼回答這個問題?僅限代碼答案[阻止](http://meta.stackexchange.com/q/148272/274165),因爲他們沒有教導解決方案。 (另外,那裏的註釋代碼是什麼?) –

1

在第一個例子中,你使用DataGrid .SelectedRows作爲迭代的元素,並且在每次迭代後重新讀取它。...

該集合在每次迭代後都會下降一個......所選行c在您刪除一個之後,ollection會減少。

只需避免在迭代刪除時修改集合。例如:

List<DataGridViewRow> toBeDeleted = new List<DataGridViewRow>(); 
    try 
    { 
     foreach (DataGridViewRow row in DataGrid.SelectedRows) 
      toBeDeleted.Add(row); 
     foreach (DataGridViewRow row in toBeDeleted) 
      DataGrid.Rows.Remove(row); 
    } 
    catch (Exception) { }