фиксация изменена в DataGridView при изменении выделения в ComboBox - PullRequest
4 голосов
/ 19 января 2011

Как я могу заставить событие DataGridView.CellValueChanged быть инициировано (и иметь ли измененное значение, зафиксированное для свойства DataGridViewCell.Value), как только элемент управления ComboBox в ячейке изменил свой выбор? По умолчанию событие возникает только после того, как ячейка с ComboBox теряет фокус.

Ответы [ 3 ]

6 голосов
/ 31 октября 2012

Я решил это следующим образом:

    myDataGridView.EditingControlShowing += new System.Windows.Forms.DataGridViewEditingControlShowingEventHandler(myDataGridView_EditingControlShowing);

    private void myDataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
        {
            ComboBox cmb = (ComboBox)e.Control;
            cmb.SelectionChangeCommitted -= new EventHandler(cmb_SelectionChangeCommitted);
            cmb.SelectionChangeCommitted += new EventHandler(cmb_SelectionChangeCommitted);
        }
    }

    void cmb_SelectionChangeCommitted(object sender, EventArgs e)
    {
        dgvPresupuesto.CurrentCell.Value = ((DataGridViewComboBoxEditingControl)sender).EditingControlFormattedValue;
    }
2 голосов
/ 20 января 2011

Я так и сделал. Я понятия не имею, является ли это «предпочтительным» способом или он даст какие-либо побочные эффекты позже, но сейчас он, кажется, работает:

this.gridView.EditingControlShowing += this.GridViewOnEditingControlShowing;

private void GridViewOnEditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    ComboBox cellComboBox = e.Control as ComboBox;
    if (cellComboBox != null)
    {
        // make sure the handler doen't get registered twice
        cellComboBox.SelectionChangeCommitted -= this.CellComboBoxOnelectionChangeCommitted;
        cellComboBox.SelectionChangeCommitted += this.CellComboBoxOnelectionChangeCommitted;
    }
}

private void CellComboBoxOnelectionChangeCommitted(object sender, EventArgs e)
{ 
    DataGridViewComboBoxEditingControl comboBox = sender as DataGridViewComboBoxEditingControl;
    if (sender == null)
    {
        return;
    }     
    if (comboBox.SelectedValue == null)
    {
        return;
    }    
    if (this.gridView.CurrentCell.Value == comboBox.SelectedValue)
    {
        return;
    }    
    this.gridView.CurrentCell.Value = comboBox.SelectedValue;        
}
0 голосов
/ 20 января 2011

Изменение значения в выпадающем списке на самом деле является элементом редактирования, связанным с сеткой.Таким образом, чтобы инициировать что-либо, вам нужно добавить их в Событие EditingControlShowing DataGrid для этого конкретного столбца

private void dg_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
  if (dg.CurrentCell.ColumnIndex == 0)
  {
    ComboBox cmbox = e.Control as ComboBox;
    cmbox.SelectedValueChanged += new EventHandler(cmbox_SelectedValueChanged);
  }
}

, вы можете вызвать событие изменения значения ячейки в выбранном событии изменения значения в комбинированном списке

...