我会更进一步,因为每次运行时都会忘记最后余额的 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 都需要显示单个交易,通常存储为两个抵消的分类帐条目。