0

という名前のフォームがありFrmDrvouchersます。これには、いくつかのパブリック サブプロシージャが含まれています。FrmDrVouchers からダイアログとして開かれたフォームから開く別のフォームから、これらのサブルーチンを呼び出します。

FrmDrvouchers を直接開くと、すべてが機能します。しかし、このソリューションの一部でもある別のプロジェクトから FrmDrvouchers を呼び出すと、別の (ダイアログ) フォームから呼び出すと、パブリック サブサブが機能しません。

FrmDrvouchers を開くボタン クリックのコードは次のとおりです。

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

これは機能しますが、これらの公開サブスクは機能しません。なんで?


返信ありがとうございます。

やりたいことをスキップするだけで、例外はスローされません。今、コードを投稿しています。、、plzはそれを見てください、、

これが私のメインフォームのMenuStrip Button Clickコードです:

 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です。

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

Public Subs を呼び出す別の DrVouchersRecord フォームを次に示します。

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 Open on menustripButtonclick

その後、DebitVouchersRecord は DrmDebitVouchers からのダイアログとして開かれ、これらの Public Subs から呼び出されます

Refrenceも追加しました

あなたの答えを待って、

4

1 に答える 1

1

この問題は、VB6 から VB.NET に移行する多くのプログラマーを襲っています。

DataGridView_DoubleCellClick イベントで、FrmDebitVouchersの新しいインスタンスを作成します。
次に、コードは、CashPaymentToolStripMenuItem_Click によって作成された元のインスタンスではなく、この新しいインスタンスのプロパティ/メソッド/オブジェクトを参照します。(また、この新しいインスタンスは画面に表示されないことに注意してください。そのため、非表示のフォーム インスタンスへの変更を送信/要求しています)

もちろん、この INSTANCE (FrmDrVouchers として参照) のDrBodyDGV.Rows.Countはゼロです。おそらく、この INSTANCE は最初のインスタンスのように初期化されていないからです。

作成後に FrmDrVouchers.Show() を追加すると、フォーム クラス FrmDebitVouchers の非表示の 2 番目のインスタンスが表示されます。

問題を解決するには、最初の FrmDebitVouchers インスタンスの参照を DrVouchersRecord フォームに渡し (たとえば、コンストラクターまたはパブリック プロパティを介して)、FrmDrVouchers を作成する代わりにその参照を使用する必要があります。

于 2012-06-03T08:24:35.010 に答える