2010-10-26 85 views
3

直接驗證約束的DataGridViewComboBoxCell我有一個Windows窗體DataGridView包含一些DataGridViewComboBoxCell S中的綁定到使用DataSourceDisplayMemberValueMember性質的源集合。目前,組合框單元格提交更改(即提出DataGridView.CellValueChanged)後,我單擊另一個單元格,組合框單元失去焦點。應用,在選擇變化

如果在組合框中選擇新值後,我會如何直接提交更改。

回答

1

此行爲寫入到DataGridViewComboBoxEditingControl的實現中。謝天謝地,它可以被覆蓋。首先,你必須創建上述編輯控件的子類,重寫OnSelectedIndexChanged方法:

protected override void OnSelectedIndexChanged(EventArgs e) { 
    base.OnSelectedIndexChanged(e); 

    EditingControlValueChanged = true; 
    EditingControlDataGridView.NotifyCurrentCellDirty(true); 
    EditingControlDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit); 
} 

這將確保DataGridView正確通知在組合框中選擇項的變化,當它發生。

然後,您需要繼承DataGridViewComboBoxCell的子類並覆蓋EditType屬性以從上面返回編輯控件子類(例如return typeof(MyEditingControl);)。這將確保在單元進入編輯模式時創建正確的編輯控件。

最後,您可以將DataGridViewComboBoxColumnCellTemplate屬性設置爲單元子類的實例(例如myDataGridViewColumn.CellTemplate = new MyCell();)。這將確保爲網格中的每一行使用正確類型的單元格。

0

我試過使用Bradley's suggestion,但它對連接單元格模板時很敏感。看起來我不能讓設計視圖連接欄,我必須自己做。

相反,我使用綁定源的PositionChanged事件,並從中觸發更新。這有點奇怪,因爲控件仍然處於編輯模式,並且數據綁定對象還沒有得到選定的值。我只是自己更新綁定對象。

private void bindingSource_PositionChanged(object sender, EventArgs e) 
    { 
     (MyBoundType)bindingSource.Current.MyBoundProperty = 
      ((MyChoiceType)comboBindingSource.Current).MyChoiceProperty; 
    } 
0

一種更好的方式來實現這一點,我使用的成功,而不是子類或有些不雅綁定源上面的方法,是以下(抱歉這是VB,但如果你不能從VB轉換成C#你有更大的問題:)

Private _currentCombo As ComboBox 

Private Sub grdMain_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles grdMain.EditingControlShowing 
    If TypeOf e.Control Is ComboBox Then 
     _currentCombo = CType(e.Control, ComboBox) 
     AddHandler _currentCombo.SelectedIndexChanged, AddressOf SelectionChangedHandler 
    End If 
End Sub 

Private Sub grdMain_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles grdMain.CellEndEdit 
    If Not _currentCombo Is Nothing Then 
     RemoveHandler _currentCombo.SelectedIndexChanged, AddressOf SelectionChangedHandler 
     _currentCombo = Nothing 
    End If 
End Sub 

Private Sub SelectionChangedHandler(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim myCombo As ComboBox = CType(sender, ComboBox) 
    Dim newInd As Integer = myCombo.SelectedIndex 

    //do whatever you want with the new value 

    grdMain.NotifyCurrentCellDirty(True) 
    grdMain.CommitEdit(DataGridViewDataErrorContexts.Commit) 
End Sub 

就是這樣。