2011-08-02 53 views
0

DataGridView에서 선택한 여러 행을 삭제하려고합니다. 아래 코드를 실행하면 선택한 행 중 일부만 삭제됩니다. 예를 들어 7 개의 행이 있고 5 개의 연속 행을 선택하고 삭제를 누르면 3 개만 삭제됩니다. DataGridView에서 여러 행을 삭제하는 방법

IEnumerable<DataGridViewRow> dgvrs = from dgvrws in dgvChemicalInv.Rows.Cast<DataGridViewRow>() 
               where dgvrws.Selected.Equals(true) 
               select dgvrws; 

      foreach (DataGridViewRow dgr in dgvrs) 
      { 
       dctchemri = dgr.Cells["DCT_CHEMRI"].Value.ToString(); 
       index = dgvChemicalInv.CurrentRow.Index; 

       var chemObj = (from chmObj in DCTProjectNodeObj.Chemicals 
           where chmObj.DCTChemRI.Equals(dctchemri) 
           select chmObj).Single(); 

       if (sqlCmd.Delete_Chems(this.projID, (csDCTChemicalObj)chemObj)) 
       { 
        dgvChemicalInv.Rows.Remove(dgr); 
       } 
       if (dgvChemicalInv.RowCount > 0) 
       { 
        DCTProjectNodeObj.Chemicals.Remove((csDCTChemicalObj)chemObj); 
       } 
       else 
       { 
        DCTProjectNodeObj.Chemicals = new List<csDCTChemicalObj>(); 
        DO_BtnSaveClickEvent(); 
       } 
      } 

답변

0

코드를 읽기가 약간 어렵지만,이 코드는 너무 복잡하다고 생각합니다. BindingSource 개체를 사용하는 것이 좋습니다. 테이블 관리가 훨씬 쉬워집니다. BindingSourcedatasource을 표로, datasourceDataGridViewBindingSource 개체로 설정하면 SubmitChanges()을 호출 한 후 표의 변경 사항이 DataContext에 반영됩니다.

예 :

MyDataContext dataContext = new MyDataContext(); 
BindingSource bindingSource = new BindingSource(); 

bindingSource.DataSource = dataContext.MyTable; 
dataContext.DataSource = bindingSource; 

내가 이런 짓을 한 이후 오랜만이야,하지만 난이 그것을 할 수있는 가장 쉬운 방법이라고 생각합니다. 이것은 지저분한 조작을 피하지만, 외래 키 관계로 인해 복잡해질 수 있습니다.

단순한 방법 일 수 있습니다.

+0

이 가능성을 조사해 왔지만 SqlCE 데이터베이스에서 작동하지 않는 것 같습니다. –

+0

SqlCE를 사용하고 있는지 몰랐습니다. 별로 경험이 없지만 SqlCE에서 정확히 작동하지 않는 것은 무엇입니까? – krs1

+0

dataContext 클래스의 연결 및 설정. 나는이 블로그 [링크] (http://blogs.msdn.com/b/charlie/archive/2007/12/10/understanding-the-datacontext.aspx)와 함께 따라 갔다. –

2

코드를 읽기가 매우 어렵습니다,

빌 O. 감사합니다. 어쨌든 foreach에 문제가 있다고 확신합니다. 일반적으로 루프가 실행되는 컬렉션에서 foreach 루프 내의 항목을 삭제할 수 없습니다. 어쨌든 최선의 선택은 데이터 소스에서 항목을 제거하고 (아마도 리피터에서 ID를 가져 오는 것일 것입니다) DataBind repeater에서 다시

+0

내가 선택한 모든 행의 DataGridview에 대해 Linq 쿼리를 수행하고 foreach 루프에서 삭제하려고합니다. 디버그에서 단계를 통해 Enumerable dgvrs의 결과보기에서 인덱스 변경을 볼 수 있으며이 인덱스는 행이 제거 될 때 행 인덱스에 해당합니다. 내가 이제는 마지막 행을 제외하고 모두 삭제할 수 있습니다. –

+0

여기에 코드'code'의 다양한 기초가 있습니다. IEnumerable dgvrs = dgvChemicalInv.Rows.Cast () 여기서 dgvrws.Selected.Equals (true) dgvrws를 선택하십시오. foreach (DataGridViewRow dgr in dgvrs) { dgvChemicalInv.Rows.Remove (dgr); } –

0

@Massimiliano Peluso와 동의합니다. 일반적으로 모든 ID를 한 번에 가져오고 하나의 데이터베이스 호출을 쉼표로 구분 된 ID 목록을 전달하여 행당 하나씩 호출하는 대신 삭제해야합니다. 물론 수행하지 않는 다른 유효한 이유가 있습니다 하지만 DB를 200 번 호출하면 한 번 호출하여 완료 할 수있을 때 불필요한 것처럼 보입니다. 그런 다음 데이터를 리 바인드하고이를 완료합니다.

관련 문제