如何“完成”新行

Posted

技术标签:

【中文标题】如何“完成”新行【英文标题】:How to "finalize" a new row 【发布时间】:2013-05-28 03:38:39 【问题描述】:

所以今晚我的 c# windows 窗体应用程序遇到了一些麻烦。当当前选定的新行仍为其默认值时,是否可以向 datagridview 插入新行?或者,如果我想以编程方式更改值,如何模拟用户编辑文本框以完成行?

澄清一下,当一行是新行时(并且使用 isNewRow 属性显示为 true),我无法弄清楚如何更改 isNewRow = true 状态以在下面生成一个新的空行。

我试过dataGridView.EndEdit()dataGridView.CurrentRow.DataGridView.EndEdit()bindingSource.EndEdit(),但这些都没有真正奏效。 (另外,使用dataGridView.BeginEdit() 将文本框放入editmode,这并不方便,因为在那之后我似乎无法以编程方式编辑单元格)

理想情况下,我希望能够在新行上继续按 Enter 键,同时使用自定义控件更改其值,或者不使用自定义控件,并在下方显示新行。

有没有人可以解决这个问题?

【问题讨论】:

更好地显示您尝试过的代码.. 此数据网格视图是否绑定到任何背景数据对象? 您尝试过验证吗? msdn.microsoft.com/en-us/library/… "要以编程方式提交行更改,请调用表单的 Validate 方法。如果您的数据源是 BindingSource,您也可以调用 BindingSource.EndEdit。" msdn.microsoft.com/en-us/library/… 是的,我正在使用绑定源。使用 validate 方法似乎只清除单元格,而 BindingSource.EndEdit 没有做任何事情 我还想补充一点,问题仅在于添加新行时。使用相同的代码,我目前可以很好地更改旧行。问题似乎是我无法将新行提交到绑定源。 【参考方案1】:

好的,所以我想出了如何使这项工作。 使用自定义控件修改值时,我不得不使用

bindingSource.EndEdit();
dataGridView.NotifyCurrentCellDirty(true);
dataGridView.EndEdit();
dataGridView.NotifyCurrentCellDirty(false);

因此,每当对新行进行更改时,它都会强制提交该行并在 datagridview 的末尾添加一个新的空白行空间。

不过,我不必使用 Validate()。

【讨论】:

我发现自己只需要dataGridView.NotifyCurrentCellDirty(true); dataGridView.EndEdit();。任何少的东西都会使该行处于可取消的新状态。我将这些行放在BindingSource.AddingNew 处理程序中的BeginInvoke() 调用中(因为在我的情况下,我通过设置AddingNewEventArgs.NewObject 填充新事物的默认值)。 其实我错了,这些行都是必须的。否则DataGridView 进入无效状态并使进程崩溃。笏。 看来正确的顺序应该是:dataGridView.EndEdit(); dataGridView.NotifyCurrentCellDirty(true); bindingSource.EndEdit(); dataGridView.NotifyCurrentCellDirty(false);

以上是关于如何“完成”新行的主要内容,如果未能解决你的问题,请参考以下文章

我如何模仿新行的拖动功能,例如在 Excel 中,但在 R 中?

如何在ubuntu中的bashrc文件中添加新行?

如何在控制台中向已打印的表中添加新行?

POST完成后如何从MySQL获取数据

如何调用包含完成处理程序的函数?

如何使用 fast-csv npm 将新行或新行的数据(新行)附加到现有的 csv 文件