Winforms 如何将表格数据粘贴到";新行“;AllowUserToAddress设置为true的DataGridView的?

Winforms 如何将表格数据粘贴到";新行“;AllowUserToAddress设置为true的DataGridView的?,winforms,datagridview,Winforms,Datagridview,我们在整个UI中使用DataGridView。。。大多数是绑定到某个支持表的数据。。。大多数都是通过BindingSource实现的 它们都支持Ctrl+C将表格数据复制出来(这样您就可以粘贴到Excel或Word表格中,等等)。那很容易。。。它是内置的。。。只需将MultiSelect true和ClipboardCopyMode设置为EnableWithAutoHeaderText(或其他启用…设置之一) 我们的用户要求我们同样支持Ctrl+V来粘贴从Excel等复制的表格数据。不幸的是,这

我们在整个UI中使用DataGridView。。。大多数是绑定到某个支持表的数据。。。大多数都是通过BindingSource实现的

它们都支持Ctrl+C将表格数据复制出来(这样您就可以粘贴到Excel或Word表格中,等等)。那很容易。。。它是内置的。。。只需将MultiSelect true和ClipboardCopyMode设置为EnableWithAutoHeaderText(或其他启用…设置之一)

我们的用户要求我们同样支持Ctrl+V来粘贴从Excel等复制的表格数据。不幸的是,这几乎不是那么容易。我创建了一个通用实用程序方法PasteStringTable(DataGridView),该方法将从剪贴板中提取表格数据,然后将其粘贴到参数DataGridView的选定单元格中。除了一个关键问题外,我一直在努力:

如果DataGridView将AllowUserToAddress设置为true,并且用户位于底部神奇的“新行”中,那么我希望为剪贴板上的每一行添加行。但问题是,我以编程方式所做的任何事情似乎都无法让它实际添加该行。。。我已经尝试了我能想到的一切(或者通过Bing或Google找到):

(1) 我尝试在DataGridView上执行BeginEdit/EndEdit

(2) 我尝试先将DataGridView.CurrentCell设置为我要编辑的单元格,然后将DataGridView.BeginEdit设置为true,然后通过设置单元格的Value属性编辑该单元格,然后设置DataGridView.EndEdit()

(3) 我试着做了#2,但我做的是SendKeys.Send(value)而不是.value=value

(4)我尝试在上面的中间做DATAGIDVIEW .NoTyjCurrnCurrue(True)。

(5) 我尝试先手动执行DataGridView.Rows.Insert(索引,1)来修改基础数据源,以便在粘贴到新行之前尝试强制插入新行。。。但这会引发一个异常,因为我的DataGridView是数据绑定的。(注意:我不想硬编码对底层数据的特定访问,因为我希望它像粘贴一样工作,其中复制的数据在视觉上与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;
                            }
                        }

我也尝试了很多解决方案,最后在我的案例中成功了

private void calculationGrid_KeyPress(object sender, KeyPressEventArgs e)
        {
            if ((int)e.KeyChar == 22 && Control.ModifierKeys == Keys.Control)
            {
                calculationGrid.CurrentCell.Value = Clipboard.GetText().Replace("\r", "").Replace("\n", "").Trim();                      
                calculationGrid.BeginEdit(true);
                calculationGrid.NotifyCurrentCellDirty(true);
                calculationGrid.EndEdit();
            }
        }

你可以上传一个小例子来帮助设置单元格值,试试这个:
cell.value=newValue;dgv.NotifyCurrentCellDirty(真);dgv.BeginEdit(真实);dgv.EndEdit()