/ / Помилка передачі посилання на приватну DataGridView класу - vb.net, winforms

Помилка передачі посилання на приватну DataGridView класу - vb.net, winforms

Питання: Чому це, що 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 після створення елементів керування.