-1

程序执行后,FileStream 使用的扩展名是 Class 标头中提供的默认扩展名,而不是我通过“set property”指定的扩展名。

怎么一直没变?

Form1.vb 代码

Option Strict On

    Imports S3_BalanceBook_Dayan.Wallet

    Public Class Form1
        Dim myWallet As New Wallet(DataGridView1, DateTimePicker1)

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


            'Make default selection when program starts.
            optCheck.Checked = True
            myWallet.StatementsFileName = "statements.dat"
            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))))
            End If
        End Sub



        Private Sub optDeposit_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles optDeposit.CheckedChanged
            'Disable un-needed fields when Deposit Radio button is selected!
            txtCheck.Enabled = False
            txtMoney.Enabled = False
            txtDeposit.Enabled = True
            txtFee.Enabled = False
            txtDescription.Enabled = True
        End Sub
        Private Sub optCheck_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles optCheck.CheckedChanged
            'Disable un-needed fields when Check Radio button is selected!
            txtCheck.Enabled = True
            txtMoney.Enabled = True
            txtDeposit.Enabled = False
            txtFee.Enabled = False
            txtDescription.Enabled = True

        End Sub
        Private Sub optServiceFee_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles optServiceFee.CheckedChanged
            'Disable un-needed fields when Fee Radio button is selected!
            txtCheck.Enabled = False
            txtMoney.Enabled = False
            txtDeposit.Enabled = False
            txtFee.Enabled = True
            txtDescription.Enabled = True

        End Sub


    End Class

Wallet.vb 代码

Option Strict On
Imports System
Imports System.IO


Public Class Wallet

    Private lcheckNumber As Integer = Nothing
    Private lcheckmoney As Decimal = Nothing
    Private ldepositAmount As Decimal = Nothing
    Private lfee As Decimal = Nothing

    Private holdInstance As DataGridView
    Private holdDate As DateTimePicker
    Private holdPath As String = "default.txt"
    Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
    Private file As New StreamWriter(_file)

    'Default Constructor
    Public Sub New()

    End Sub

    Public Sub New(ByRef Data As DataGridView, ByRef StatementDate As DateTimePicker)
        'This constructor takes in references to use in class as private
        holdInstance = Data
        holdDate = StatementDate
    End Sub


    ''' <summary>
    ''' Property allows the change of file path for the statements log.
    ''' </summary>
    Public WriteOnly Property StatementsFileName() As String
        Set(ByVal Value As String)
            holdPath = Value
        End Set
    End Property


    ''' <summary>
    ''' Enter Deposit amount as Decimal, returns remainding account balance as Decimal.
    ''' </summary>
    Public Function Deposit(ByVal Amount As Decimal) As Decimal

        Return 0D
    End Function
    'Function Check - Deduct the amount and returns current balance.
    Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal) As Decimal
        Try

            file.WriteLine(CheckNumber & " - " & CheckAmount)

        Catch e As IOException
            MessageBox.Show(e.ToString)
        End Try

        Return 0D
    End Function
    'Function Fee - Deduct the fee from balance and returns current balance.
    Public Function Fee(ByVal FeeAmount As Decimal) As Decimal

        Return 0D
    End Function



End Class
4

1 回答 1

4

是的 - 问题就在这里:

Private holdPath As String = "default.txt"
Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
Private file As New StreamWriter(_file)

这将在创建实例时使用,_file的值进行初始化。与其将and作为成员字段,为什么不在内部将它们设为局部变量呢?这样,当它们被构建时,它们将使用 的值,就像当时一样。holdPathWallet_filefileCheckholdPath


您可能还应该将它们放在Using语句中,或者以其他方式确保它们在适当的点关闭 - 否则,您写入文件的内容可能不会出现,直到您的程序关闭。


所以,我们有:

Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal) As Decimal
    Try
        Using _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
            Using file As New StreamWriter(_file)
                file.WriteLine(CheckNumber & " - " & CheckAmount)
            End Using
        End Using

    Catch e As IOException
        MessageBox.Show(e.ToString)
    End Try

    Return 0D
End Function
于 2012-07-04T12:11:21.203 回答