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:
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ď č. 1Problé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.