我不得不将datagridview复制到另一个,以便在backgroundworker线程中迭代它,创建一个excel导出。
复制的目的是允许用户在导出期间对原始datagridview进行一些更改。
所以我创建了一个新的DataGridView(以编程方式),并将原始DataTable的副本放入新DataGridView的DataSource属性中。 但是,我发现如果我不在任何Form的Controls(list)属性中添加datagridview,RowCount仍然等于0 ......
有人可以解释一下吗?
注意:DataTable的副本只是一个带有列的副本()的新DataTable。
答案 0 :(得分:2)
这很简单。当您刚刚创建DataGridView(或任何其他WinForms或Wpf控件)时,它仅在.Net中创建。例如。没有为它创建系统窗口。虽然控制处于这种状态,但它不会为了优化目的而应用任何绑定(为什么视觉控制会做任何事情,而它是不可见的?:))。当您将控件添加到可见表单时,控件将创建其系统窗口(即其Handle属性将被初始化),并且它将按预期开始工作。 如果你想让任何视觉控制按照预期的方式工作,但没有真正显示它,你只需要阅读它的Handle属性。这将强制控制创建系统窗口并完全初始化。 另外对于WPF来说,它有点困难,因为你只能获得Window控件的句柄,为了获得它,你必须使用以下代码:
public IntPtr GetWpfWindowHandle(Window w)
{
var interopHelper = new WindowInteropHelper(w);
return interopHelper.Handle;
}
答案 1 :(得分:0)
请参阅this question获取答案。在那个例子中,只是阅读Handle不起作用 - 我需要为网格分配一个BindingContext。