2012-11-13 8 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 문에서 iterate를 사용하여 개체 참조가 반복 된 개체에 강제로 적용되므로 해당 개체가 제거되면 참조 된 개체가 엉망이 될 것이라는 점입니다 참조한 컬렉션). 두 번째는 'int i = 0; i <'을 선택하여 사서함 [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

을 첫 번째 예에서는 사용자가 데이터 그리드를 사용 .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) { } 
관련 문제