2011-01-19 90 views

回答

6

我解决了它这样做:

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; 
    } 
0

组合框的值的变化实际上是与网格关联的编辑控件。 因此,要启动什么,你将不得不添加这些在DataGrid的EditingControlShowing事件为特定列

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); 
    } 
} 

你可以调用在下拉列表中选择cvalue改变事件的单元格的值更改事件

+0

这方法不起作用,因为该值尚未提交给底层DataGridViewCell.Value和DataGridView.CellValueChanged的EventHandler,我无法确定新值是什么。我需要找到一种方法来强制datagrid本身将更改提交给单元格并引发`CellValueChanged`事件。 – bitbonk 2011-01-20 08:51:41

+0

在这种情况下,您可以使用SendKeys.Send(“{TAB}”)触发TAB事件;在组合框事件处理程序中强制单元失去焦点,最终触发网格的CellValueChanged – V4Vendetta 2011-01-20 10:32:08

+0

这也不理想,因为当前单元格将失去焦点。这不应该发生在我的情况。 – bitbonk 2011-01-20 13:02:16

2

我最终这样做了。我不知道如果是这样的“首选”的方式或是否会产生任何副作用以后,但现在它似乎工作:

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;   
} 
相关问题