2008-09-29 10 views
4

DataSource가 DataTable 인 DataGridView가 있습니다. 이 DataTable에는 DataGridView에서 확인란으로 해석되는 부울 열이 있습니다.DataGridView의 바인딩 된 테이블은 두 번 클릭 할 때 하나의 RowChanged 이벤트 만 생성합니다. 나는 그것을 어떻게 두 가지로 만들까요?

employeeSelectionTable.Columns.Add("IsSelected", typeof(bool)); 
... 
employeeSelectionTable.RowChanged += selectionTableRowChanged; 
dataGridViewSelectedEmployees.DataSource = employeeSelectionTable; 

... 

private void selectionTableRowChanged(object sender, DataRowChangeEventArgs e) 
{ 
    if ((bool)e.Row["IsSelected"]) 
    { 
     Console.Writeline("Is Selected"); 
    } 
    else 
    { 
     Console.Writeline("Is Not Selected"); 
    } 
    break; 
} 
체크 박스에 사용자가 단일 클릭, 그것은 확인됩니다

및 selectionTableRowChanged은 출력 "을 선택."합니다

마찬가지로 사용자가 다시 확인하면 상자가 지워지고 selectionTableRowChanged는 "선택되지 않음"을 출력합니다. 나는 문제가있는 경우 여기에

가있다 :

체크 박스에서 더블 클릭이 확인란이 선택됩니다 때의있는 rowChanged 이벤트 ("선택") 호출되는 다음 확인란이 해제되고 대응하는 RowChanged 이벤트는 불려 가지 않습니다. 이제 RowChanged 이벤트 구독자가 동기화되지 않습니다.

내 솔루션은 이제 DataGridView를 하위 클래스로 만들고 WM_LBUTTONDBLCLICK를 먹도록 WndProc를 재정 의하여 컨트롤에 대한 두 번 클릭이 무시됩니다. 더 좋은 솔루션이 있습니까?

답변

1

저수준을 수행해야하는 이유가 있습니까? DoubleClick 메서드를 먹는 빈 방법 일 수 있습니까?

1

DataGridView 하위 클래스에서 OnDoubleClick 메서드를 재정의하여 아무 일도하지 않고 이미 시도했지만 두 번째로 확인란을 계속 변경할 수있었습니다.

DataTable의 RowChanged 이벤트가 두 번 호출되는 것이 이상적이었습니다. 재정의 된 OnDoubleClick 메서드를 통해 기본 DataTable에 영향을주는 방법이 있습니까?

1

왜 IsSelected 열을 제한적으로 두지 않으십니까? CellContentClick 이벤트를 사용하여 데이터를 기본 데이터 테이블로 푸시하고 CellDoubleClick 또는 RowChange 이벤트 만 남겨 둡니다.

private void dgv_CellContentClick(object sender, DataGridViewCellEventArgs e) 
{ 
    if(e.ColumnIndex == <columnIndex of IsSelected>) 
    { 
     string value = dgv[e.ColumnIndex, e.RowIndex].EditedFormattedValue; 
     if(value == null || Convert.ToBoolean(value) == false) 
      { 
       //push false to employeeSelectionTable 
      } 
     else 
      { 
      //push true to employeeSelectionTable 
      } 

    } 
} 
2

빈 더블 클릭 이벤트 방법을 만드는 것은 그이 더블 클릭이 발생할 때 일어나는 다른 작업에 추가로 실행되는 것이 도움이되지 것이 그 이유.

Windows 생성 코드 또는 프로그래밍 방식으로 이벤트 처리기를 추가하는 예제를 보면 + =를 사용하여 이벤트 처리기를 할당합니다. 이는 이미 존재하는 다른 이벤트 핸들러와 함께 이벤트 핸들러를 추가한다는 것을 의미합니다. 저장 이벤트에서 여러 이벤트 핸들러가 트리거 될 수 있습니다.

본능적으로 DataGridView 클래스를 재정의 한 다음 OnDoubleClick 메서드를 재정의하고 기본 OnDoubleClick 메서드를 호출하지 않았을 것입니다.

그러나 나는이 사실을 빠르게 테스트하고 흥미로운 결과를보고 있습니다. 그런 다음 윈도우의 형태로이 삽입

using System; 
using System.Windows.Forms; 

namespace TestApp 
{ 
    class DGV : DataGridView 
    { 
     private string test = ""; 

     protected override void OnDoubleClick(EventArgs e) 
     { 
      MessageBox.Show(test + "OnDoubleClick"); 
     } 

     protected override void OnCellMouseDoubleClick(System.Windows.Forms.DataGridViewCellMouseEventArgs e) 
     { 
      MessageBox.Show(test + "OnCellMouseDoubleClick"); 
     } 

     protected override void OnCellMouseClick(System.Windows.Forms.DataGridViewCellMouseEventArgs e) 
     { 
      if (e.Clicks == 1) 
      { 
       // Had to do this with a variable as using a MessageBox 
       // here would block us from pulling off a double click 
       test = "1 click "; 
       base.OnCellMouseClick(e); 
      } 
      else 
      { 
       MessageBox.Show("OnCellMouseClick"); 
      } 
     } 
    } 
} 

체크 박스 열을 추가하고 프로그램을 실행 :

나는 다음 테스트 클래스를 함께 넣어.

새로 실행하면 확인란을 두 번 클릭하면 메시지 상자에 "1 Click OnDoubleClick"이라고 표시됩니다.

이것은 두 번 클릭시 첫 번째 부분에서 OnCellMouseClick이 실행 된 다음 두 번째 클릭에서 OnDoubleClick이 실행됨을 의미합니다.

또한 기본 메서드에 대한 호출을 제거해도 확인란이 전달 된 클릭을받지 못하는 것처럼 보이지 않습니다.

이 접근 방식을 사용하려면 더 많은 작업을 수행해야하며 두 번 클릭을 무시하는 DataGridViewCheckBoxColumn 및 DataGridViewCheckBoxCell을 재정의해야 할 수도 있습니다. 이 기능이 작동한다고 가정하면 확인란을 두 번 클릭하는 것을 중지 할 수 있지만 다른 열 컨트롤에서는 계속 허용 할 수 있습니다.

here에 사용자 지정 DataGridView 열과 셀을 만드는 것에 대한 다른 질문에 대한 답변을 게시했습니다.

1

왜 내가해야만하는지 모르겠지만 두 번째 클릭 후 dgv를 새로 고친 datagridview 새로 고침에 연결된 타이머 틱 이벤트를 넣을 수있었습니다.

DataGridViewCheckBoxCell checkBoxCell = new MyDataGridViewCheckBoxCell(); 
... 
DataGridViewColumn col = new DataGridViewColumn(checkBoxCell); 
... 
col.Name = "colCheckBox"; 
... 
this.dgItems.Columns.Add(col); 

dgItems이 DataGridView를 예입니다 : 셀 클릭 이벤트에서

는 경우

**   _RefreshTimer = new Timer(); 
       _RefreshTimer.Tick += new EventHandler(RefreshTimer_Tick); 
       _RefreshTimer.Interval = 100; 
       _RefreshTimer.Start(); 

      } 
     } 

    } 

    void RefreshTimer_Tick(object sender, EventArgs e) 
    { 
     dgv.Refresh(); 
     _RefreshTimer.Stop(); 
     _RefreshTimer = null; 
    }** 
2

당신은 DataGridView를 내부 확인란 열이 같은 무언가를 창조합니다.

알다시피, DataGridViewCheckBoxCell 클래스의 하위 클래스 인 MyDataGridViewCheckBoxCell 클래스가 있습니다. 이 서브 클래스에서 나는 정의

protected override void OnContentDoubleClick(DataGridViewCellEventArgs e) 
{ 
    //This the trick to keep the checkbox in sync with other actions. 
    //base.OnContentDoubleClick(e); 
} 

때 클릭 한 것처럼 사용자가 이제 더블 클릭이 체크 박스 열에서 체크 박스가 체크 박스가 작동합니다. 이렇게하면 동기화 문제가 해결됩니다.

2

이것은 정확하게 우아한 해결책은 아니지만 단순히 다음을 수행하지 않는 이유는 무엇입니까?

private void dgv_CellDoubleClick(object sender, DataGridViewCellEventArgs e) 
{ 
    dgv_CellClick(sender, e); 
} 

이렇게하면 두 번째 CellClick 이벤트가 강제로 발생하고 동기화되지 않게됩니다.