首页 > 解决方案 > DataGridView 在单元格退出时提交对数据源的更改,而不仅仅是在 Enter 按键上

问题描述

我的情况类似于以下代码段:

        static BindingSource dataTableBindingSource = new BindingSource();
        static DataGridView dataGridView = new DataGridView();

        private void Form1_Load(object sender, EventArgs e)
        {
            dataTable.Columns.Add(new DataColumn("Col. 1", typeof(string)));
            dataTable.Columns.Add(new DataColumn("Col. 2", typeof(string)));
            dataTable.Columns.Add(new DataColumn("Col. 3", typeof(string)));
            dataTable.Columns.Add(new DataColumn("Col. 4 (int)", typeof(int)));

            dataGridView.AllowUserToAddRows = true;
            dataTable.AcceptChanges();

            dataTableBindingSource.DataSource = dataTable;
            dataGridView.DataSource = dataTableBindingSource;

            dataTable.RowChanged += DataTableRowChanged;
        }

        private static void DataTableRowChanged(object sender, DataRowChangeEventArgs e)
        {
            dataTable.RowChanged -= DataTableRowChanged;

            // Calculations are performed (e.g. autofilling table values)

            dataTable.AcceptChanges();
            dataTable.RowChanged +=DataTableRowChanged;
        }

当用户在编辑单元格后按 Enter 键时,我的代码可以正常工作,但是我需要dataTable.RowChanged在用户离开单元格后随时发生该事件。

我尝试向 中添加一个事件处理程序dataGridView.CellValueChanged,它在我需要的任何时候都会被调用。但是,如果用户添加了新行并且dataTable.RowChanged事件尚未发生(例如,用户按下了 Tab 而不是 Enter),则新行将不会出现在DataTable. 似乎当用户在DataGridView控件中创建新行时,整行都保存在某个内部“临时”变量中,直到用户按下回车键或制表符进入新行。理想情况下,我可以告诉在事件DataGridView中将“临时”新行应用于 DataTable dataGridView.CellValueChanged,但我找不到实现此目的的方法。我尝试从dataGridView.CellValueChanged事件中调用以下各项,但均未成功:

faultDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
faultDataGridView.Update();
faultDataGridView.EndEdit();

这个答案提到了 property DataSourceUpdateMode,这似乎与我的要求相似。不幸的是,我找不到任何解释我将如何设置这个值的来源,或者任何与我正在使用的控件类似的东西

DataTable我宁愿将我的所有自动填充逻辑保留在一个位置,仅指DataTable.

标签: c#winformsdatatabledatagridview

解决方案


推荐阅读