0

我不得不将一个 datagridview 复制到另一个,以便在后台工作线程中迭代它,创建一个 excel 导出。

制作该副本是为了允许用户在导出期间对原始 datagridview 进行一些更改。

因此,我创建了一个新的 DataGridView(以编程方式),并将原始 DataTable 的副本放入新 DataGridView 的 DataSource 属性中。但是,我发现如果我不在任何Form的Controls(列表)属性中添加datagridview,RowCount仍然等于0......

有人可以解释一下吗?

注意:DataTable 的副本只是一个带有 copy() 列的新 DataTable。

4

2 回答 2

2

这很简单。当您刚刚创建 DataGridView(或任何其他 WinForms 或 Wpf 控件)时,它仅在 .Net 中创建。例如,没有为它创建系统窗口。并且当控件处于这种状态时,它不会应用任何用于优化目的的绑定(为什么视觉控件应该做任何事情,而它是不可见的?:))。当您将控件添加到可见窗体中,控件将创建其系统窗口(即其 Handle 属性将被初始化)并且它将按预期开始工作。如果您想让任何可视控件按预期工作,但不真正显示它,您只需要阅读它的 Handle 属性。这将强制控制创建一个系统窗口并完全初始化。同样对于 WPF 来说,这有点困难,因为您只能获得 Window 控件的句柄,并且为了获得它,您必须使用以下代码:

public IntPtr GetWpfWindowHandle(Window w)
{
   var interopHelper = new WindowInteropHelper(w);
   return interopHelper.Handle;
}
于 2011-11-24T13:48:17.270 回答
0

请参阅此问题以获取答案。在那种情况下,仅仅读取 Handle 是行不通的——我需要将 BindingContext 分配给网格。

于 2011-12-02T10:49:13.110 回答