如何让DataGridView立即提交编辑?

时间:2012-09-17 15:40:39

标签: c# datagridview master-detail undo

我有一个主 - 细节布局,其中包含一段弹出菜单(详细信息)和一个包含DataGridView的部分,用于保存行。

当DataGridView中的选定行发生更改时,弹出菜单状态会更新,并且当弹出菜单更改时,DGV所选行中的状态应更新。

所有这些工作除了当我更改弹出菜单的值时,DataGridView中的行不会立即更新。我必须选择不同的行才能看到我的编辑内容。

我假设这是因为在选择更改之前尚未提交编辑。

我的问题是:如何让弹出窗口的更改立即反映在DataGridView中?

我已尝试在弹出菜单的SelectionChangeCommitted处理程序中调用EndEdit(),但这没有任何效果。我对一种技术很感兴趣,这种技术可以让我创建一个DataGridView,就像没有Undo机制一样。理想情况下,解决方案是通用的,可移植到其他项目。

6 个答案:

答案 0 :(得分:4)

这是发生了什么。答案是在ComboBox个实例的属性中。我需要将DataSourceUpdateModeOnValidation更改为OnPropertyChanged。这是有道理的。 DataGridView很可能显示数据的当前状态。只是数据尚未编辑,因为焦点没有离开ComboBox,验证了输入。

感谢大家的回复。

答案 1 :(得分:4)

看起来现有答案适用于BindingSource。在我的情况下,DataTable被直接用作DataSource,但由于某种原因,它们无效。

// Other answers didn't work in my setup...
private DataGridView dgv;

private Form1()
{
   var table = new DataTable();
   // ... fill the table ...
   dgv.DataSource = table;
}

经过一些拉毛,我得到了它,但没有添加BindingSource间接:

// Add this event handler to the DataGridView
private void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    dgv.BindingContext[dgv.DataSource].EndCurrentEdit();
}

private Form1()
{
   dgv.CellEndEdit += dgv_CellEndEdit;
   // ...
}

答案 2 :(得分:1)

使用此扩展方法。它适用于所有列类型,而不仅仅是ComboBoxes:

        public static void ChangeEditModeToOnPropertyChanged(this DataGridView gv)
        {
            gv.CurrentCellDirtyStateChanged += (sender, args) =>
            {
                gv.CommitEdit(DataGridViewDataErrorContexts.Commit);
                if (gv.CurrentCell == null)
                    return;
                if (gv.CurrentCell.EditType != typeof(DataGridViewTextBoxEditingControl))
                    return;
                gv.BeginEdit(false);
                var textBox = (TextBox)gv.EditingControl;
                textBox.SelectionStart = textBox.Text.Length;
            };
        }

此方法在更改后立即提交每个更改。

当我们有一个文本列时,在键入一个字符后,它的值将提交给DataSource,并且该单元格的editmode将结束。

因此,当前单元格应返回编辑模式,并将光标位置设置为文本结尾,以便用户能够继续键入文本提醒。

答案 3 :(得分:1)

这对我很有用:

   std::string spacesToUnderscores(std:string const &nasty)

答案 4 :(得分:0)

调用DataGridView.EndEdit方法。

答案 5 :(得分:-1)

以下工作

ProductMapper
设置值后,

很好。