【问题标题】:commit changed in DataGridView when selection changed in ComboBox当 ComboBox 中的选择更改时,DataGridView 中的提交更改
【发布时间】:2011-01-19 16:12:03
【问题描述】:

一旦单元格中的ComboBox 编辑控件更改其选择,我如何强制引发DataGridView.CellValueChanged 事件(并将更改实际提交给DataGridViewCell.Value 属性)?默认情况下,只有在具有 ComboBox 的单元格失去焦点后才会引发该事件。

【问题讨论】:

    标签: datagridview combobox focus


    【解决方案1】:

    我解决了这个问题:

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

    【讨论】:

    • 尽管我没有尝试过这种方法(使用EditingControlFormattedValue 属性)并且无法确认它确实有效,但它看起来确实比我的方法正确且噪音更少。所以我接受这个作为答案。
    • 虽然我将 EditingControlFormattedValue 更改为 SelectedValue,但为我工作。
    【解决方案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;        
    }
    

    【讨论】:

    • combox值第一次选择一个item需要选择两次
    【解决方案3】:

    combobox值的变化实际上是一个与Grid关联的Editing控件。 因此,要启动任何内容,您必须在 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);
      }
    }
    

    可以在Combobox的选中的cvalue改变事件中调用单元格值改变事件

    【讨论】:

    • 这种方法不起作用,因为该值尚未提交给底层DataGridViewCell.Value,并且在DataGridView.CellValueChanged 的EventHandler 中我无法找出新值是什么。我需要找到一种方法来强制数据网格本身将更改提交到单元格并引发CellValueChanged 事件。
    • 在这种情况下,您可以使用 SendKeys.Send("{TAB}"); 触发 TAB 事件在组合框事件处理程序中强制单元格失去焦点,最终触发网格的 CellValueChanged
    • 这也不理想,因为当前单元格将失去焦点。这不应该发生在我的场景中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2021-04-29
    相关资源
    最近更新 更多