如何将表格数据粘贴到DataGridView的“新行”,并将AllowUserToAddRows设置为true?

时间:2013-09-02 19:10:44

标签: winforms datagridview

我们在整个UI中使用DataGridViews ...大多数数据绑定到某些支持表...大多数通过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()来编辑单元格。 p>

(3)我尝试做#2,但我做了SendKeys.Send(value)而不是.Value = value。

(4)我尝试在上面的中间做DataGridView.NotifyCurrentCellDirty(true)。

(5)我尝试首先通过手动执行DataGridView.Rows.Insert(index,1)来修改底层数据源,以便在我粘贴到它之前尝试强制进入新行...但是因为我的操作会引发异常DataGridViews是数据绑定的。 (注意:我不想硬编码对底层数据的特定访问,因为我希望它像粘贴一样工作,其中复制的数据在视觉上与DataGridView的列对齐。)

(6)许多其他变化...

最后,大多数尝试都会导致相同的行为:您可以看到底行被修改...您可以看到您复制的数据的第一行显示在该神奇的“新行”中,直到您单击该行,该行再次变为空白...除非您手动编辑它,它永远不会添加到基础数据。即使我尝试使用SendKeys.SendWait(...),它仍然不会像我输入那些数据那样。

如何以编程方式获取神奇的“新行”,就像我输入粘贴的数据一样?

(当然我不是第一个想要将表格数据粘贴到DataGridViews中的人。)

2 个答案:

答案 0 :(得分:1)

经过多次试验和错误,这是我提出的模式,在大多数情况下效果很好。这是纯粹的猜测,所以如果有人知道它应该如何工作,请告诉我们。无论如何,这就是我的工作:

                        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;
                            }
                        }

答案 1 :(得分:0)

我也尝试了许多解决方案,最终以我的情况起作用。

15