實例題目:對輸入的賬號、姓、名、餘額信息保存到文件,並可以讀取到界面。
演示:
創建三個項目文件:
設計思路:
由於讀和寫的界面差不多,就是按鈕button不一樣,這樣的話,可以做一個父親窗體,讓讀和寫兩個窗體繼承父窗體即可(關鍵操作)。
對於數據的操作,可以將數據封裝起來,這樣更符合面向對象的編程,下面創建了Record類。
一個關鍵操作:
不在同一個項目的類不能直接繼承!!!
需要如下操作:
- 將BankUIForm項目右擊屬性,設置它的輸出類型爲類庫;
- 右擊BankUIForm項目點生成(每次修改都要重新生成);
- 將BankUIForm類庫分別引用到ReaderForm和WriterForm項目中(打開項目,右擊引用);
一、BankUIForm項目
Record 類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 文件與流
{
public class Record // 這裏需要設置訪問屬性問public 不然後面會訪問不了
{
// 四個紀錄屬性
public int Account { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public decimal Balance { get; set; }
// 構造函數
public Record()
:this(0,string.Empty,string.Empty,0m)
{ }
// 構造函數
public Record(int account,string firstName,string lastName,decimal balance)
{
Account = account;
FirstName = firstName;
LastName = lastName;
Balance = balance;
}
}
}
BankUIForm窗體(父親)的代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 文件與流
{
public partial class BankUIForm : Form
{
public BankUIForm()
{
InitializeComponent();
}
public void Form1_Load(object sender, EventArgs e)
{}
// 獲取 窗體Textbox控件內容,保存在record返回
public Record GetTextBoxText()
{
Record record = new Record(Int32.Parse(accountTextBox.Text), firstnameTextBox.Text, lastnameTextBox.Text, Decimal.Parse(balanceTextBox.Text));
return record;
}
// 設置 窗體Textbox控件內容
public void SetTextBoxText(Record record)
{
accountTextBox.Text = record.Account.ToString();
firstnameTextBox.Text = record.FirstName;
lastnameTextBox.Text = record.LastName;
balanceTextBox.Text = record.Balance.ToString();
}
// 清空 窗體Textbox控件內容
public void ClearTextBox()
{
foreach (Control control in Controls)
{
if(control is TextBox)
{
((TextBox)control).Clear();
}
}
}
}
}
二、WriterForm項目:繼承BankUIForm窗體,寫文本
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using 文件與流;
using System.IO;
namespace WriterForm
{
public partial class writerForm : 文件與流.BankUIForm
{
public writerForm()
{
InitializeComponent();
}
FileStream filestream; // 文件流對象:水池
StreamWriter streamwriter; // 寫入流:水管
// 打開文件
private void button1_Click(object sender, EventArgs e)
{
DialogResult result; // 紀錄窗體返回值
string fileName; //紀錄文件名
// 創建打開文件保存窗體
using (SaveFileDialog saveFile = new SaveFileDialog())
{
saveFile.CheckFileExists = false;
result = saveFile.ShowDialog();
fileName = saveFile.FileName;
}
// 判斷是否點了確定,如果是則進入
if(result== DialogResult.OK)
{
if (fileName == null)
{
MessageBox.Show("文件名不能爲空!");
}
// 文件名不爲空
else
{
try
{
// 創建文件流
filestream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
// 寫流連接池塘
streamwriter = new StreamWriter(filestream);
enterButton.Enabled = true;
saveButton.Enabled = false;
}
catch (Exception exp)
{
MessageBox.Show("文件寫入出錯!",exp.Message);
}
}
}
}
// 寫入數據
private void enterButton_Click(object sender, EventArgs e)
{
try
{
// 將窗體正確數據寫入文本
Record record=GetTextBoxText();
streamwriter.WriteLine("{0},{1},{2},{3}", record.Account, record.FirstName, record.LastName, record.Balance);
}
catch (Exception)
{
MessageBox.Show("填寫格式錯誤!"); ;
}
ClearTextBox(); // 清空textbox控件內容
}
// 結束輸入,關閉文件流,程序退出
private void exitButton_Click(object sender, EventArgs e)
{
streamwriter.Close();
Application.Exit();
}
}
}
三、ReaderForm項目:繼承BankUIForm窗體,讀文件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using 文件與流;
namespace ReadForm
{
public partial class ReaderFoem : 文件與流.BankUIForm
{
public ReaderFoem()
{
InitializeComponent();
}
FileStream filestream; // 文件流對象 :水池
StreamReader streamreader; // 文件讀對象:水管
// 打開文件
private void readButton_Click(object sender, EventArgs e)
{
DialogResult result; // 紀錄按鈕結果
string fileName; // 文件名
// 創建文件打開窗體
using (OpenFileDialog openfile=new OpenFileDialog())
{
result = openfile.ShowDialog(); // 返回結果
fileName = openfile.FileName; //紀錄文件名
}
// 如果按了確定按鈕
if(result== DialogResult.OK)
{
try
{
if (fileName == null)
{
MessageBox.Show("文件名不能爲空!");
}
// 文件名不爲空時,開始讀文件
else
{
// 創建文件流對象,池塘
filestream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
// 創建讀對象,連接池塘
streamreader = new StreamReader(filestream);
nextButton.Enabled = true;
readButton.Enabled = false;
}
}
catch (Exception) // 捕獲異常
{
MessageBox.Show("打開文件失敗!");
}
}
}
// 點擊下一條按鈕
private void nextButton_Click(object sender, EventArgs e)
{
string str; // 保存所讀取的一行數據字符串
string[] values; // 保存4項數據
try
{
str = streamreader.ReadLine(); // 讀數據
// 文件讀完,關閉流對象
if(str==null)
{
streamreader.Close();
readButton.Enabled = true; // 此文件讀取完成,可以繼續讀取下一個文件
nextButton.Enabled = false;
ClearTextBox();
MessageBox.Show("文件讀完 !");
}
else
{
// 將數據顯示在窗體上
values = str.Split(',');
Record record = new Record(Int32.Parse(values[0]), values[1], values[2], Decimal.Parse(values[3]));
SetTextBoxText(record);
}
}
catch (Exception)
{
MessageBox.Show("文件讀寫錯誤!");
}
}
// 退出按鈕
private void exitButton_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
}
螢火蟲的光點雖然微弱,但亮着便是向黑暗挑戰
關注微信公衆號:碼農雲庫
進步需要交流 !!!