2012-12-03 3 views
2

아이디어는 다음과 같습니다. 사용자가 하나 이상의 셀을 선택한 다음 제거 버튼을 클릭하면 Datagridview가 선택한 셀의 전체 행을 제거합니다. 아무 것도 없으면 여러 개의 셀 행을 삭제하는 방법을 보여줄 때 내 마음이 날아갑니다. 선택한 행이나 단일 셀을 삭제하면 문제가 간단합니다. 그러나 여러 셀에 문제가선택한 셀의 행을 삭제합니다. windows 폼

일부 문제가 수도

가 발생합니다 ...입니다 : 인덱스가 경계에서,

가의가있는 gridview 내용이 열있는 gridview의 데이터가 DB에서 아니라고 가정하자 ... 전체의 gridview를 삭제합니다.

나는이 코드를 시도했다 :

while(dgv1.selectedCells.count>0){ 
dgv1.removeAt(dgv1.selectedCells[0].RowIndex); 
} 

그러나 이것은 전체 DataGridView를 삭제 gridview에 하나 개의 행을 제거 할 때, 그것은 첫 번째 셀 (첫번째 COL, 첫 번째 행) 선택을 얻을 수 있기 때문이다. 다음

나는이 시도 :

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; i--) { 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); 
     } 

그리고 ...

0
이 하나 좋은, 그러나 LINQ는 조금 이해하기 어렵습니다
for(int i=0;i<10;i++) 

{ 

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

} 
관련 문제