Примените и подтвердите привязку DataGridViewComboBoxCell непосредственно при изменении выбора - PullRequest
3 голосов
/ 27 октября 2010

У меня есть формы Windows DataGridView, которые содержат DataGridViewComboBoxCell s, которые связаны с исходной коллекцией, используя свойства DataSource, DisplayMember и ValueMember. В настоящее время ячейка выпадающего списка фиксирует изменения (т. Е. DataGridView.CellValueChanged повышается) только после того, как я нажму на другую ячейку, и ячейка выпадающего списка теряет фокус.

Как в идеале я бы зафиксировал изменение сразу после того, как в выпадающем списке было выбрано новое значение.

Ответы [ 3 ]

1 голос
/ 27 октября 2010

Это поведение записано в реализации 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);). Это обеспечит создание правильного элемента управления для редактирования, когда ячейка переходит в режим редактирования.

Наконец, вы можете установить свойство CellTemplate вашего DataGridViewComboBoxColumn для экземпляра подкласса ячейки (например, myDataGridViewColumn.CellTemplate = new MyCell();). Это обеспечит использование правильного типа ячейки для каждой строки в сетке.

0 голосов
/ 17 апреля 2012

Лучший способ добиться этого, который я использую успешно, а не на основе подклассов или несколько неэффективного метода источника привязки, описанного выше, заключается в следующем (извините, это 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

Вот и все.

0 голосов
/ 09 марта 2012

Я пытался использовать предложение Брэдли , но оно чувствительно к тому, когда вы прикрепили шаблон ячейки. Казалось, что я не мог позволить представлению проекта подключить колонку, я должен был сделать это сам.

Вместо этого я использовал событие PositionChanged источника привязки и инициировал его обновления. Это немного странно, потому что элемент управления все еще находится в режиме редактирования, а объект, связанный с данными, еще не получает выбранного значения. Я только что обновил связанный объект сам.

    private void bindingSource_PositionChanged(object sender, EventArgs e)
    {
        (MyBoundType)bindingSource.Current.MyBoundProperty = 
            ((MyChoiceType)comboBindingSource.Current).MyChoiceProperty;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...