【问题标题】:Using one dataset in many forms以多种形式使用一个数据集
【发布时间】:2014-03-18 08:51:13
【问题描述】:

我正在使用 vb.net 从 sql server 数据库加载数据。我在我的模块中定义了一个数据集 并想以多种形式使用它Public dsDataset As DataSet。当我加载主表单时,我会加载所有表单(如部门和部分)中可能相同的选项,这样我就不必在所有表单中再次加载它们。当从主窗体导航到另一个窗体时,我在窗体构造函数中传递了这个数据集。

在主窗体中,我正在加载这些选项:

Sub loadOptions()
        Dim da As SqlDataAdapter
        Dim sql As String

        Try
            sqlConn = New SqlConnection(connString)
            sqlConn.Open()

            sql = " select depId, name from DEPARTMENT "
            da = New SqlDataAdapter(sql, sqlConn)
            da.Fill(dsDataset, "department")


            sql = " select select depId, sectionId, name from SECTION "
            da = New SqlDataAdapter(sql, sqlConn)
            da.Fill(dsDataset, "section")

            '----------------------------------------------------------------------

            sqlConn.Close()
        Catch ex As Exception
            sqlConn.Close()
            MsgBox(Err.Description)
        End Try
    End Sub

然后假设我有打印机表单,我从数据库加载数据并使用 dsDataset 中的选项而不是再次加载它们。我按如下方式传递数据集:

Dim printers As frmPrinters = New frmPrinters(dsDataset)
printers.ShowDialog()

在打印机表单中,我有一个构造函数,如下所示:

Sub New(ByRef dsDataset As DataSet)
        InitializeComponent()

        cmbDepartment.DataSource = dsDataset.Tables("department")
        cmbDepartment.DisplayMember = "name"
        cmbDepartment.ValueMember = "depId"

        cmbSection.DataSource = dsDataset.Tables("section")
        cmbSection.DisplayMember = "name"
        cmbSection.ValueMember = "sectionId"

    End Sub

并将所有打印机毫无问题地加载到数据集:

 sql = "select * from printer where printerId=" & printerId
 daPrinter = New SqlDataAdapter(sql, sqlConn)
 daPrinter.Fill(dsDataset, "printer")
 dgvPrinters.DataSource = dsDataset.Tables("printers")

现在,当我双击任何打印机时,我会转到另一个表单来加载该特定打印机的详细信息,如下所示:

printerId = dgvPrinters.Rows(dgvPrinters.CurrentRow.Index).Cells(0).Value
printerMode = "modify"
Dim printer As New frmPrinter(dsDataset)
printer.ShowDialog()

在新表单中,我使用上面相同的构造函数,但问题发生在那里。出现以下错误:

Value cannot be null.
Parameter name: dataSet

我做错了什么?

【问题讨论】:

  • 您是否尝试过调试代码以查看哪个变量恰好是null
  • 一件事,dsDataset 的值是 Nothing

标签: vb.net forms dataset


【解决方案1】:

您似乎没有将 dsDataset 保存在构造函数中的任何位置。例如在私有变量中。我的猜测是,在 frmPrinters 内部,您将拥有一个从未设置为任何内容的公共 dsDataSet 变量。

所以你应该做的是:

在 frmPrinter 中创建一个名为 _dsDataset 的私有 dsDataSet 变量:

Private _dsDataset As DataSet

在构造函数中这样做:

_dsDataset = dsDataset

最后在双击事件中发送私有变量:

Dim printer As New frmPrinter(_dsDataset)

然后你应该没问题。

【讨论】:

  • 明白了,我在打印机表单中创建了一个公共数据集 _dsDataset,然后将其设置为从主表单发送的 dsDataset。但它说同样的问题
  • 可能是您填写了“打印机”表,但将 DataGridView 设置为将“打印机”表作为源?
  • 好的,知道了。正如您在解决方案中所说:“我的猜测是,在 frmPrinters 内部,您将拥有一个从未设置为任何内容的公共 dsDataSet 变量”。没错。一些我忘记删除我的 frmPrinters 中的私有 daDataset 的原因,从逻辑上讲,该数据集将优先在 frmPrinters 中使用。我删除了它,一切都很好。谢谢
  • 是否需要重新绑定控件?
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
  • 2011-02-17
  • 2023-03-31
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多