【问题标题】:Why must I add a DataGridView to a Form in order to get the data?为什么我必须将 DataGridView 添加到表单才能获取数据?
【发布时间】:2012-01-05 14:31:34
【问题描述】:

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

制作副本是为了允许用户在导出期间对原始数据网格视图进行一些更改。

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

谁能解释一下?

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

【问题讨论】:

  • 您能否展示定义新DataGridView 的代码,设置DataSource 以及检查RowCount 的位置。
  • 我这里没有代码,但是是这样的:
  • DataGridView 在读取 DataTable 之前可能正在等待一些窗口消息,我对此不确定。出于这样的原因,.Net 中有两个计时器,一个用于窗口窗体,一个用于独立使用......您需要在 DataGridView 中执行哪些您无法使用 DataTable(或它的视图)执行的操作?
  • 为什么在这里使用 UI 组件?你为什么要DataGridView中的数据根本
  • 我这里没有代码,但它是这样的: public DataGridView void Copy(DataTable dt) { DataGridView newGV = new DataGridView(); newGV.DataSource = dt.Copy();返回新GV;当我监视返回的对象时,我总是得到一个等于 0 的 RowCount 值。我只需要输入: Form ghostForm = new Form(); ghostForm.Controls.Add(newGV);在 DataSource 设置之前有行。请注意,这里的问题不是“行数”而是没有加载的数据,除非我把前面的代码...

标签: c# forms datagridview datasource rowcount


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    public IntPtr GetWpfWindowHandle(Window w)
    {
       var interopHelper = new WindowInteropHelper(w);
       return interopHelper.Handle;
    }
    

    【讨论】:

    • 谢谢 :) 我看到当我将 DGC 附加到表单时设置了 BindingContext 属性,所以我期待这样的事情。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    相关资源
    最近更新 更多