2013-04-23 5 views
2

사용자가 콤보 상자 (DataGridViewComboBoxColumn)에서 값을 선택할 수있는 DataGridView 열이 있습니다. 우리는 선택을위한 검증 로직을 가지고 있습니다 (오버라이드 된 OnCellValidating).사용자가 새 값으로 변경하면 DataGridViewComboBoxCell 유효성 검사

귀찮은 것은 사용자가 콤보 상자에서 드롭 다운 선택을 한 후에 다른 곳을 클릭해야만 해당 셀에 대한 유효성 검사가 수행된다는 것입니다. 선택한 색인이 변경되면 바로 편집을 시도했지만 (아래 참조) 셀이 포커스를 잃을 때까지 유효성 검사가 실행되지 않습니다. 또한 CommitEdit() 대신 EndEdit()을 사용해 보았습니다.

사용자가 콤보 상자에서 항목을 선택하자마자 유효성 검사를 수행 할 수있는 방법이 있습니까?

protected override void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e) 
    { 
     // Validate selection as soon as user clicks combo box item. 
     ComboBox combo = e.Control as ComboBox; 
     if (combo != null) 
     { 
      combo.SelectedIndexChanged -= combo_SelectedIndexChanged; 
      combo.SelectedIndexChanged += new EventHandler(combo_SelectedIndexChanged); 
     } 

     base.OnEditingControlShowing(e); 
    } 

    void combo_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     this.NotifyCurrentCellDirty(true); 
     this.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 

    protected override void OnCellValidating(DataGridViewCellValidatingEventArgs e) 
    { 
     // (our validation logic) ... 
    } 
+0

. 유효성 검사는 일반적으로 행을 나갈 때 발생합니다. 이렇게하면 하나의 '트랜잭션'에서 여러 변경 사항을 커밋 할 수 있습니다. 즉각적인 유효성 검사가 필요한 경우 데이터 양식을 만들고 거기서 원하는 모든 사용자 지정 유효성 검사를 수행하십시오. – Neolisk

+0

그러나이 경우 행을 "입력"또는 "떠나는"개념이 없습니다. 콤보 상자와 관련 항목 만 있습니다. 콤보 상자에서 항목을 클릭 할뿐만 아니라 입력을 확인하기 위해 셀을 "끕니다"를 클릭해야한다는 것이 이상하게 느껴집니다. 사용자가 선택하고 오류가 없으면 다른 사용자가 놀랄 수 있습니다. 그런 다음 다른 콤보 상자의 행을 클릭하고 _then_ 가져옵니다. 사용자가 항목을 클릭 할 때 편집을 커밋하고 끝낼 수 있다면,이 룩앤필과의 일관성을 위해 유효성을 검사하지 않는 것이 어떻겠습니까? –

+0

'그냥 콤보 상자와 관련 항목이 있어요'이 부분을 설명해주세요. – Neolisk

답변

0

당신은 초점을 잃고 셀을 강제로 탭 키를 시뮬레이션 할 수 있습니다 : 당신이 가지하고 싶은 것은 UI 검증 가이드 라인에 위배

private void combo_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     //I expect to get the validation to fire as soon as the user 
     //selects an item in the combo box but the validation 
     //is not firing until the cell loses focus 
     //simulate tab key to force the cell to lose focus 
     SendKeys.Send("{TAB}"); 
     SendKeys.Send("+{TAB}"); 
    } 
+0

이 이벤트 핸들러를'DataGridViewComboBoxCell' 또는'DataGridViewComboBoxCell'에 어떻게 가입합니까? –

+0

DataGridView의'EditingControlShowing' 이벤트를 처리하십시오. –

+0

그러면 그걸 얻은 후에 바로 초점을 잃게 될 것입니다. 맞습니까? 어쨌든, 아주 간단한 해결책이 있습니다 [여기] (http://stackoverflow.com/a/9609103/60067). –

관련 문제