Питання: Чому це, що holdDate під функцією Check (), показує "Нічого" при налагодженні, я проходив через посилання. Що мені не вистачає хлопців ??
Опис проблеми:
У мене є клас з іменем "Гаманець", я створив екземплярцього класу в моєму основному коді, пропустіть три параметри (Об'єкти вже в моїй формі, які будуть заповнені даними з користувача пізніше, а не відразу):
Dim myWallet As New Wallet(DataGridView1, DateTimePicker1, "StatementsLog.dat")
Під час запуску я отримую це:
Як ви бачите, об'єкт, який мав припуститипосилання вихідний об'єкт з форми порожній? Я думав, що якщо я передам посиланням (як показано нижче), то об'єкт завжди буде показувати дані, і це дозволить мені прочитати його, як показано на знімку екрана вище:
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
Ось що я отримав на сьогоднішній день для Class Wallet:
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
Форма1 Код
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
Відповіді:
1 для відповіді № 1Найчастіше проблема тут:
Public Class Form1
Dim myWallet As New Wallet(DataGridView1, DateTimePicker1, "StatementsLog.dat")
Це буде компілювати, але ці об'єкти ще не створені, оскільки це відбувається раніше форма "с InitializeComponent
рутина отримує назву.
Спробуйте змінити декларацію на це:
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
де створюється клас Wallet після створення елементів керування.