/ / Problémy s odovzdaním odkazu na súkromné ​​DataGridView triedy - vb.net, winforms

Problémy s odkazom na súkromný

Otázka: Prečo je to tak, že holdDate v rámci funkcie Check () zobrazuje počas ladenia "Nič", prešiel som referenciou. Čo mi chýba?

Popis problému:

Mám triedu s názvom Peňaženka, vytvoril som inštanciutejto triedy v mojom hlavnom kóde odovzdaním troch parametrov (Objekty, ktoré sú už v mojom formulári, ktoré budú naplnené údajmi od používateľa neskôr, nie hneď):

Dim myWallet As New Wallet(DataGridView1, DateTimePicker1, "StatementsLog.dat")

Za behu dostanem toto: tu zadajte popis obrázku

Ako vidíte, objekt, ktorý mal byťodkaz na pôvodný objekt z formulára je prázdny? Myslel som si, že ak som prešiel odkazom (ako je uvedené nižšie), že objekt bude vždy zobrazovať údaje, a to by mi umožnilo ich prečítať, ako je to znázornené na obrázku vyššie:

Public Sub New(ByRef Data As DataGridView, ByRef _Date As DateTimePicker, Optional ByVal StatementsFileName As String = "defaultLog.txt")
"This constructor takes in references to use in class as private
holdPath = StatementsFileName
holdData = Data
holdDate = _Date
End Sub

Tu je to, čo som sa doteraz do triedy Wallet dostal:

Option Strict On
Imports System
Imports System.IO

Public Class Wallet

Private lcheckNumber As Integer = Nothing
Private lcheckAmount As Decimal = Nothing
Private ldepositAmount As Decimal = Nothing
Private lfee As Decimal = Nothing
Private lDescription As String = Nothing

Private holdDate As New DateTimePicker
Private holdData As New DataGridView
Private holdPath As String = vbNullString

"Default Constructor
Public Sub New()
holdPath = "defaultLog.txt"
End Sub

Public Sub New(ByRef _Data As DataGridView, ByRef _Date As DateTimePicker, Optional ByVal StatementsFileName As String = "defaultLog.txt")
"This constructor takes in references to use in class as private
holdPath = StatementsFileName
holdData = _Data
holdDate = _Date
End Sub

"Function Check - Deduct the amount from account and returns current balance.
Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal, ByVal Description As String) As Decimal
Try
lcheckNumber = CheckNumber
lcheckAmount = CheckAmount
lDescription = Description
lfee = 0D

Dim _file As New FileStream(holdPath, FileMode.Append, FileAccess.Write)
Using file As New StreamWriter(_file)
file.WriteLine(holdDate.Value.ToString & "," & lDescription.ToString & "," & lcheckNumber.ToString & "," & lfee.ToString & "," & lcheckAmount.ToString)
End Using
Catch e As IOException
MessageBox.Show(e.ToString)
End Try

Return 0D
End Function

Kód Form1

Option Strict On
Imports WalletProgram.Wallet

Public Class Form1
Dim myWallet As New Wallet(DataGridView1, DateTimePicker1, "StatementsLog.dat")


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

optCheck.Checked = True

"Just test data for DataGridView1
DataGridView1.Rows.Add(New String() {"12/21/1986", "Test", "44554", "44.22", "45.12"})
End Sub

Private Sub cmdAddTransaction_Click(sender As System.Object, e As System.EventArgs) Handles cmdAddTransaction.Click
If optCheck.Checked Then
lblAvailableFunds.Text = FormatCurrency(myWallet.Check(CInt(Trim(txtCheck.Text)), CDec(Trim(txtMoney.Text)), txtDescription.Text))
End If
End Sub
End Class

odpovede:

1 pre odpoveď č. 1

Problém je s najväčšou pravdepodobnosťou tu:

Public Class Form1
Dim myWallet As New Wallet(DataGridView1, DateTimePicker1, "StatementsLog.dat")

To sa skompiluje, ale tieto objekty ešte neboli vytvorené, odkedy sa to stane pred formulár InitializeComponent rutina sa volá.

Skúste zmeniť vyhlásenie na toto:

Public Class Form1
Dim myWallet As Wallet

Protected Overrides Sub OnLoad(e As System.EventArgs)
_Wallet = New Wallet(DataGridView1, DateTimePicker1)
MyBase.OnLoad(e)
End Sub

End Class

kde sa trieda Peňaženky vytvorí po vytvorení ovládacích prvkov.