我们在整个 UI 中使用 DataGridView...大多数数据都绑定(bind)到某个支持表...其中大多数通过 BindingSource。
它们都支持 Ctrl+C 复制表格数据(这样您就可以粘贴到 Excel 或 Word 表格等中)。这很简单...它是内置的...只需将 MultiSelect 设置为 true 并将 ClipboardCopyMode 设置为 EnableWithAutoHeaderText(或其他启用...设置之一)。
我们的用户要求我们同样支持 Ctrl+V 来粘贴从 Excel 等复制的表格数据。不幸的是,这并不那么容易。我创建了一个通用实用程序方法 PasteStringTable(DataGridView) ,它将从剪贴板中提取表格数据,然后将其粘贴到参数 DataGridView 的选定单元格中。除了一个关键问题之外,我已经完成了这项工作:
如果 DataGridView 将 AllowUserToAddRows 设置为 true,并且用户位于底部的神奇“新行”中,那么我想为剪贴板上的每一行添加行。但问题是,我以编程方式所做的任何事情似乎都无法让它实际添加该行...我已经尝试了我能想到的一切(或通过 Bing 或 Google 找到):
(1) 我尝试在 DataGridView 上执行 BeginEdit/EndEdit。
(2) 我尝试首先将 DataGridView.CurrentCell 设置为我要编辑的单元格,然后设置 DataGridView.BeginEdit(true),然后通过设置其 Value 属性来编辑单元格,然后设置 DataGridView.EndEdit()。
(3) 我尝试执行#2,但我执行的是 SendKeys.Send(value) 而不是 .Value = value。
(4) 我尝试在上面的中间执行 DataGridView.NotifyCurrentCellDirty(true) 。
(5) 我尝试首先通过手动执行 DataGridView.Rows.Insert(index, 1) 来修改基础数据源,以尝试在粘贴到新行之前强制插入新行...但这会引发异常,因为我的DataGridView 是数据绑定(bind)的。 (注意:我不想硬编码对基础数据的特定访问,因为我希望它像粘贴一样工作,其中复制的数据与 DataGridView 的列在视觉上对齐。)
(6) 许多其他变体...
最后,大多数尝试都会导致相同的行为:您可以看到底行被修改...您可以看到您复制的数据的第一行显示在那个神奇的“新行”中,直到您单击行外,该行再次变为空白...除非您手动编辑它,否则它永远不会添加到基础数据中。即使我尝试执行 SendKeys.SendWait(...),它的行为仍然不像我输入该数据那样。
如何以编程方式获得神奇的“新行”,就像我输入粘贴的数据一样?
(当然,我不是第一个想要将表格数据粘贴到 DataGridView 中的人。)
最佳答案
经过多次尝试和错误,这是我想出的模式,在大多数情况下效果很好。不过,这纯粹是猜测,所以如果有人知道它是如何工作的,请告诉我们。无论如何,这就是我正在做的事情:
DataGridViewCell cell = dgv[colIndex, rowIndex];
if (!cell.ReadOnly) // && (evenIfNotSelected || cell.Selected)) // Selected is not stable in some cases
{
if (!cell.OwningRow.IsNewRow)
cell.Value = cellData;
else
{
dgv.CurrentCell = cell;
dgv.BeginEdit(true);
dgv.NotifyCurrentCellDirty(true);
//SendKeys.SendWait(cellData);
cell.Value = cellData;
//dgv.CommitEdit(???);
dgv.EndEdit();
//PSMUtility.DoMessages();
// Do it again to try to overwrite the default value that might get injected by EndEdit adding the row
cell.Value = cellData;
}
}
关于winforms - 如何在AllowUserToAddRows设置为true的情况下将表格数据粘贴到DataGridView的 "new row"中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18579470/