-1

我正在使用 c#.NET 制作一个非常基本的在线 ATM 应用程序。基本上,我创建了一个名为 account 的类,并使用构造函数来存储客户的帐户,使它们成为该类的对象。这些客户需要输入密码才能登录。客户的 pin 是客户对象的参数之一,我一直在尝试创建一个循环,该循环将遍历所有单个客户并确定 pin 属于哪个帐户。

 class Account
 {
    public string customerName;
    public string pin;
    public int balance;

    public Account(string accCustomerName, string accPin, int accBalance)
    {
        customerName = accCustomerName;
        pin = accPin;
        balance = accBalance;
    }
}

private void Form1_Load(object sender, EventArgs e)
{
    Account acc1 = new Account("Henry_Adobe", "2316", 10000);
    Account acc2 = new Account("Patrick_Boka", "3198", 15000);
    Account acc3 = new Account("Fred_Simp", "8768", 20000);
    Account acc4 = new Account("Derek_Black", "7645", 25000);

    if (txtInput.Text == acc1.pin)
    {
        MessageBox.Show("Login Succesful!");
    }
}

我已经设法通过说明每个对象的特定名称(acc1.pin)的名称来访问引脚,但这效率不高,因为它需要我输入非常对象的名称。有没有一种方法可以让我轻松访问所有帐户的参数?

4

1 回答 1

1

我会更进一步,因为每次运行时都会忘记最后余额的 ATM 应用程序并不是很有用。

让我们从Account类开始:

class Account
{
    public string CustomerName {get;set;};
    public string PIN {get;set;};
    public decimal Balance {get;set;};

    public Account(string customerName, string Pin, decimal balance)
    {
        CustomerName = customerName;
        PIN = Pin;
        Balance = balance;
    }

    public static IList<Account> Accounts {get;private set;} = new List<Account>();

    public static void ReadAccounts(string fileName)
    {
        using var rdr = new Microsoft.VisualBasic.FileIO.TextFieldParser(AccountsFileName))
        {
            rdr.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
            rdr.Delimiters = new string[] {','};
            Accounts.Clear();
            string[] row = null;
            while( (row = rdr.ReadFields()) != null)
            {
                Accounts.Add(new Account(row[3], row[0], Decimal.Parse(row[1])));
            }
        }
    }

    public static void WriteAccounts(string fileName)
    {
        using (var writer = new StreamWriter(fileName, false))
        {
            writer.WriteLine("PIN,Balance,CustomerName");
            foreach(var acct in Accounts)
            {
                writer.WriteLine($"{acct.PIN},{acct.Balance},\"{acct.CustomerName}\"");
            }
        }
    }
}

我们将字段更新为具有有意义的数据类型的属性,添加了一个静态位置来保存帐户列表,并添加了从文件读取和写入的方法。稍后,您将用某种数据库替换 csv 文件,但这将帮助您入门。

现在让我们继续加载表单:

private string AccountsFileName = "AccountsFile.csv";

private void Form1_Load(object sender, EventArgs e)
{
    Account.ReadFile(AccountsFileName);
}

但我们需要停在那里。在加载表单时,用户还没有机会输入任何文本!除了文本框之外,您还需要一个按钮,用户可以在输入 pin 后单击该按钮登录:

private Account currentAccount = null;

private void btnLogin_Click(object sender, EventArgs e)
{
    currentAccount = Account.Accounts.FirstOrDefault(a => a.PIN == txtInput.Text);
    if (currentAccount != null) 
    {
        MessageBox.Show("Login successful!");
        return;
    }
    MessageBox.Show("Login failed");
}   

最后,您需要一种在程序结束时保存文件的方法。现在我将只使用 Form1_Closing 事件,但稍后您可能需要一些不同的东西:

private void Form1_Closing(object sender, EventArgs e)
{
    Account.WriteAccounts(AccountsFileName);
}

您仍然缺少向用户显示余额并允许他们进行存款和取款的能力。此外,任何值得使用的 ATM 都需要显示单个交易,通常存储为两个抵消的分类帐条目。

于 2021-09-22T20:19:56.997 回答