【问题标题】:Public subs don't work in this scenario公共潜艇在这种情况下不起作用
【发布时间】:2012-06-06 09:52:08
【问题描述】:

我有一个名为FrmDrvouchers 的表单。它包含一些公共子过程。 我从另一个表单中调用这些 subs,该表单从 FrmDrVouchers 作为对话框打开的表单打开。

当我直接打开 FrmDrvouchers 时,一切正常。但是,当我从另一个项目(也是该解决方案的一部分)调用 FrmDrvouchers 时,当我从另一个(对话框)表单调用它们时,它的公共子程序不起作用。

这是我打开 FrmDrvouchers 的按钮单击的代码:

Dim FrmDrv As FrmDrVouchers = New FrmDrVouchers()    
FrmDrv.Show()

这行得通,但那些公共潜艇不行。为什么?


感谢您的回复,

它只是跳过我想做的事情,但不会抛出任何异常, 现在我发布我的代码,,,请看一下,,,

这是我的主窗体的 MenuStrip 按钮点击代码:

 Private Sub CashPaymentToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CashPaymentToolStripMenuItem.Click
    Dim DrVouchers As Transactions.FrmDebitVouchers = Transactions.New FrmDebitVouchers()
    DrVouchers.Show()
End Sub

这是不工作的 FrmDebitVouchers 的公共订阅,从某种意义上说,它们跳过了我编写的函数但没有抛出任何异常,

Public Sub DrVoucherOPen(ByVal VoucherNo As Integer)

    'Filling the Dataset with selected Voucher No to OPen the record
    DebitVouchersTableAdapter.FillByVoucher(Flr12131DataSet.DebitVouchers, VoucherNo)
    VoucherDateDateTimePicker.Enabled = False
End Sub

Public Sub DrVoucherBodyOPen(ByVal VoucherNo As Integer)

    '---------Procedure to Open DrVouchersBody And to OPen it in Datagridview-------------'
    'Getting the User No, and if it is admin then load fill dataset and allow user to edit the record
    If GetUserNumber() = 1 Then
        'Filling the dataset
        DebitVouchersBodyTableAdapter.FillByVoucher(Flr12131DataSet.DebitVouchersBody, VoucherNo)

        DrBodyDGV.DataSource = Nothing
        Dim Sum As New Decimal

        'Initializing the SerialNumbers variable
        SerialNumbers = New List(Of Integer)

        'Setting datagridview to opend record
        For i = 0 To Flr12131DataSet.DebitVouchersBody.Rows.Count - 1

            DrBodyDGV.Rows.Add()
            DrBodyDGV.Rows(i).Cells(0).Value = Flr12131DataSet.DebitVouchersBody.Rows(i).Item("SerialNo")
            DrBodyDGV.Rows(i).Cells(3).Value = Flr12131DataSet.DebitVouchersBody.Rows(i).Item("AccountNo")
            DrBodyDGV.Rows(i).Cells(6).Value = Flr12131DataSet.DebitVouchersBody.Rows(i).Item("Debit")
            DrBodyDGV.Rows(i).Cells(7).Value = Flr12131DataSet.DebitVouchersBody.Rows(i).Item("Narration")
            'Getting serial No into List
            SerialNumbers.Add(Flr12131DataSet.DebitVouchersBody.Rows(i).Item("SerialNo"))

            'Getting Account Name into Datagridview
            If Not Not IsNumeric(DrBodyDGV.Rows(i).Cells(3).Value) Then
                Dim Qa As New Flr12131DataSetTableAdapters.QueriesTableAdapter
                Dim StrAccountName = Qa.GetAccountName(DrBodyDGV.Rows(i).Cells(3).Value)
                DrBodyDGV.Rows(i).Cells(5).Value = StrAccountName

            Else
            End If

            Sum += DrBodyDGV.Rows(i).Cells(6).Value

        Next


        TxtTotal.Text = Sum

        'Setting the controls properties for admin

        DrBodyDGV.AllowUserToAddRows = True
        DrBodyDGV.AllowUserToDeleteRows = True

        DrBodyDGV.ReadOnly = False
        BtnSave.Enabled = True
        BtnDelete.Enabled = True
        BtnPrint.Enabled = True
        ToUpdate = True
    Else


        'If user is not admin then load all record and not allow user to modify it or delete
        ' Bounding the datagridview

        Dim Sum As Decimal = 0
        BtnSave.Enabled = False
        DebitVouchersBodyTableAdapter.FillByVoucher(Flr12131DataSet.DebitVouchersBody, VoucherNo)
        DrBodyDGV.DataSource = Flr12131DataSet.DebitVouchersBody

        For i = 0 To DrBodyDGV.Rows.Count - 1
            If Not Not IsNumeric(DrBodyDGV.Rows(i).Cells(3).Value) Then
                Dim Qa As New Flr12131DataSetTableAdapters.QueriesTableAdapter
                Dim StrAccountName = Qa.GetAccountName(DrBodyDGV.Rows(i).Cells(3).Value)
                DrBodyDGV.Rows(i).Cells(5).Value = StrAccountName
            Else
            End If

            Sum += DrBodyDGV.Rows(i).Cells(6).Value

        Next

        TxtTotal.Text = Sum

        DrBodyDGV.AllowUserToAddRows = False
        DrBodyDGV.AllowUserToDeleteRows = False
        ' DrBodyDGV.edit()
        DrBodyDGV.ReadOnly = True
        BtnSave.Enabled = False
        BtnDelete.Enabled = False
        BtnPrint.Enabled = True

    End If


End Sub

这是另一个 DrVouchersRecord 表格,我将其称为 Public Subs:

Private Sub DrVouchersRecordDataGridView_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DrVouchersRecordDataGridView.CellDoubleClick


Dim FrmDrVouchers As FrmDebitVouchers = New FrmDebitVouchers()

    If FrmDrVouchers.DrBodyDGV.Rows.Count > 1 Then

        Dim Ans As Integer
        Ans = MsgBox("Unsaved changes will be lost, want to proceed", vbYesNo + vbInformation, "Alert")
        If Ans = vbYes Then
            Dim VoucherNo As New Integer

            VoucherNo = DrVouchersRecordDataGridView.CurrentRow.Cells(0).Value


            FrmDrVouchers.DrVoucherOPen(VoucherNo)
            FrmDrVouchers.DrVoucherBodyOPen(VoucherNo)
            Me.Close()
        End If

    Else

        Dim VoucherNo As New Integer

        VoucherNo = DrVouchersRecordDataGridView.CurrentRow.Cells(0).Value

        FrmDrVouchers.DrVoucherOPen(VoucherNo)
        FrmDrVouchers.DrVoucherBodyOPen(VoucherNo)
        Me.Close()

    End If

结束子

我的表单顺序是:

FrmMain 是我的主要启动表单

之后 FrmDebitVouchers 在 menustripButtonclick 上打开

之后 DebitVouchersRecord 以对话框的形式从 DrmDebitVouchers 中打开,并且从这些 Public Subs 中调用

我也添加了参考

等待你的答案,

【问题讨论】:

  • 你能显示你的代码吗?没有看到它,就不可能告诉你为什么“它不起作用”。
  • 是的。请显示其中一个不起作用的公共潜艇以及尝试调用它的代码。此外,它不起作用怎么办?它只是跳过你期望它做的事情,还是抛出异常,还是编译失败?
  • 确保您有一个项目引用,以便能够调用其他项目中的方法。

标签: vb.net


【解决方案1】:

这个问题困扰着许多从 VB6 转向 VB.NET 的程序员。

在您的 DataGridView_DoubleCellClick 事件中,您创建一个新的 FrmDebitVouchers 实例。
然后你的代码引用这个新实例的属性/方法/对象,而不是通过 CashPaymentToolStripMenuItem_Click 创建的原始实例。 (另请注意,这个新实例永远不会显示在屏幕上,因此您正在向隐藏的表单实例发送/请求更改)

当然,DrBodyDGV.Rows.Count 在此实例(称为 FrmDrVouchers)上为零,因为可能此实例从未像第一个实例那样初始化。

尝试在创建后添加一个 FrmDrVouchers.Show(),你会看到表单类 FrmDebitVouchers 隐藏的 SECOND INSTANCE。

要解决您的问题,您需要将第一个 FrmDebitVouchers 实例的引用传递给 DrVouchersRecord 表单(例如在构造函数中或通过公共属性),然后使用该引用而不是创建 FrmDrVouchers

【讨论】:

  • 我很高兴这行得通,但你真的应该像以前一样发布 DataGridView_DoubleCellClick 的代码(作为问题的一部分),因为没有它,我的回答对其他读者来说是无法理解的。
  • @Malik,看看第一条评论的支持率如何上升?请发布您已删除答案中的那段代码。
  • 这里我有另一个问题,实际上 FrmDebitVouchers 已经打开,并且它有一个按钮,它打开另一个对话框表单(DrVouchersRecord),其中包含所有已保存的借记凭证记录,,及其datagridview 单元格单击事件在 FrmDebitVouchers 中运行 Subs,,,,现在的问题是,当我使用你的技术时,它会打开一个已打开的带有填充数据的表单的副本,但以前的表单仍然是空的,请告诉我如何克服这个问题,,,
  • 现在我明白了,,,谢谢你们,,,
  • 如果您觉得我的回答有帮助,请mark it as accepted
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 2021-11-15
  • 2012-07-26
  • 2017-11-26
  • 2010-12-29
  • 1970-01-01
  • 2021-08-05
  • 2011-11-14
相关资源
最近更新 更多