2014-02-06 5 views
1

DataGridview에서 상위 1000 개의 행을 삭제해야합니다.DataGridview에서 여러 행 삭제

delegate void DeleteRowsCallback(); 
    private static void Delete1KRows() 
    { 
     JSONTest form = (JSONTest)Application.OpenForms["JSONTest"]; 
     if (form.GridTestReport.InvokeRequired) 
     { 
      DeleteRowsCallback d = new DeleteRowsCallback(Delete1KRows); 
      form.GridTestReport.Invoke(d); 

     } 
     else 
     { 
      for (int i = 0; i < 1000; i++) 
      { 
       form.GridTestReport.Rows.RemoveAt(0); 

      } 
     } 

    } 

이렇게하면 행이 삭제되지만 시간이 많이 걸립니다. 또한 삭제가 진행 중일 때 UI는 응답하지 않습니다. 여러 행을 삭제하는 더 좋은 방법.

감사

+0

'가상'모드에서'DataGridView'를 사용하고 있습니까? 그리드에 데이터를 어떻게 묶었습니까? – Junaith

+0

gridview에 데이터 소스가 있습니까? 왜 그것의 데이터 소스에서 원하는 모든 레코드를 삭제하지 마십시오 그리고 당신은 수동으로 gridview 행을 제거하지 않아도 그 UI를 새로 고치려면 gridview.databind()를 호출 할 수 있습니다. – NomNomNom

+0

gridview를 바인딩하지 않았습니다. form.GridTestReport.Rows.Add()를 호출합니다. 가상 모드를 사용하지 않습니다. –

답변

0

당신이 매번 당신이 행을 제거, 어떤 바인딩 또는 가상 모드를 사용하지 않을 때, 전체 그리드가 새로 고쳐집니다. 고통스럽게 느려질 것입니다.

대용량 데이터를 처리 할 때는 Virtual Mode을 사용하여 효율적으로 그리드를 업데이트하십시오.

this 자세한 내용은 MSDN 링크를 참조하십시오. 사용할 수있는 Walkhrough이 있습니다. 설치하는 데 약간의 시간이 걸리지 만 일단 완료되면 훨씬 빠른 ane이 삶을 편하게 만듭니다.

최대 값을 얻으려면 Best Practices for Scaling the Windows Forms DataGridView Control을 참조하십시오. DataGridView.

0

제 해결책이 있습니다. 먼저 데이터베이스에서 행을 삭제 한 다음 datagridview를 다시 채 웁니다. 참고 : 데이터베이스 액세스 (oledbcommand, oledbconnection, etc ...)를 사용하여 연결을 변경합니다.

try 
{ 
    //connectDB is the procedure to connect to database: 
    connectDB(); 
    //this delete first the selected rows in database, and then update datagrid 
    int countRows = dataGridView1.SelectedRows.Count; 
    for (int i = 0; i < countRows; i++) 
    { 
     int currentRow = dataGridView1.SelectedRows[0].Index; 
     //con.oledbcon is the conecction is the OleDbConnection procedure, miTable = name of your table 
     OleDbCommand com = new OleDbCommand("DELETE FROM miTable WHERE Id=" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString(), con.oledbcon); 
     // delete from database 
     com.ExecuteNonQuery(); 
     // THIS IS THE KEY!!! deselect the last row selected to be able to delete the next row in the next loop 
     dataGridView1.Rows[currentRow].Selected = false; 
    } 
    // all OK 
    MessageBox.Show("Rows deleted!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information); 
} 
catch (Exception ex) 
{ 
    //in case of error 
    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
} 
finally 
{ 
    //disconnectDB is the procedure to disconnect to database: 
    disconnectDB(); 
    // and finally, refill datagrid again 
    loaddatagrid(); 
}