4

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

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

除了DataGridView 中的行在我更改弹出菜单的值时不会立即更新之外,所有这些都有效。我必须选择不同的行才能看到我的编辑。

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

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

我已经尝试在弹出菜单的 SelectionChangeCommitted 处理程序中调用 EndEdit() ,但这没有效果。我对一种允许我创建 DataGridView 的技术感兴趣,该技术的行为就像一开始就没有撤消机制一样。理想情况下,该解决方案将是通用的并且可移植到其他项目。

4

6 回答 6

7

看起来现有答案适用于BindingSource. 就我而言, whereDataTable直接用作 a 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;
   // ...
}
于 2017-02-09T02:18:30.967 回答
4

这就是发生的事情。答案在于ComboBox实例的属性。我需要将它们DataSourceUpdateMode从更改OnValidationOnPropertyChanged。这是有道理的。DataGridView很可能显示数据的当前状态。只是数据还没有被编辑,因为焦点没有离开ComboBox,验证输入。

感谢大家的回复。

于 2012-09-17T19:14:30.090 回答
3

这对我很有效:

private void CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    var dgw = (DataGridView) sender;
    dgw.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
于 2017-01-05T00:38:50.127 回答
2

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

        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 并且单元格的编辑模式将结束。

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

于 2013-07-31T07:39:49.327 回答
0

调用DataGridView.EndEdit方法。

于 2012-09-17T17:30:30.740 回答
-1

以下将起作用

_dataGrid.EndEdit()

设置值后就可以了。

于 2017-02-09T11:41:09.923 回答