又到項目階段了,總是感覺有點興奮,每次著手到一個項目時,總是很激動,想馬上把這個項目完成,終歸夢想是美好的,現實是殘酷的,
還是老套路,先來看看這個項目主要完成哪些功能。
一.主要功能:
1.實現租車功能。
選中一輛租車信息,輸入租車者姓名,即可租車成功!在未租列表中點擊刷新該車輛顯示,在租車列表中會出現對應的租車信息將會消失。

2.實現還車功能。
選中一輛還車信息,輸入使用天數,進行結算。點擊租車列表中的刷新按鈕該車輛信息會顯示,在未租列表中該車輛會消失。

3.實現新車入庫功能。
選擇入庫的汽車類型,填寫對應車輛的信息,進行汽車入庫,在未租列表中點擊刷新按鈕就會顯示剛才添加的車輛信息。

2.思路:
根據日常生活中的租車案例,咋們都知道租車是分種類的,在這裡呢,轎車和卡車屬於一種交通工具的,所以要在我們的程序中就要抽象出一個交通工具類(Vechile)作為父類,
抽象出對應的子類就是轎車類(Car)和卡車類(Truck),到了這裡,還別忘還有一個工廠類(VechileFactory),是用來示例化子類的對象,在這裡需要注意的是,簡單工廠類裡的方法是靜態的,
返回值是父類類型,也就是Vechile類,需要傳入參數,在方法體中,通過switch選擇結構進行選擇,到底實例化哪個子類對象。
首先有這麼幾個類:

01.Vehicle類:
是一個交通工具類(抽象類,也是父類),在他的底層統領著兩個子類,分別是Car類,和Truck類,在這個類中有一個計算價格的方法。
//父類:交通工具類
public abstract class Vehicle
{
public string Color { get; set; }//汽車顏色
public int DailyRent { get; set; }//每日租金
public string LicenseNo { get; set; }//車牌號
public string Name { get; set; }//車名
public int RentDate { get; set; }//還車日期
public string Rentuser { get; set; }//還車人
public int YearsOfService{ get; set; }//使用時間
//無參構造
public Vehicle() { }
//帶參構造用於給屬性賦值
public Vehicle(string color, int dailyrent, string licenseno, string name, int YearsOfService)
{
this.Color = color;
this.DailyRent = dailyrent;
this.LicenseNo = licenseno;
this.Name = name;
this.YearsOfService = YearsOfService;
}
//計算價格的方法
public abstract double CalculatePrice();
}
02.Car類(轎車):Vechile的子類。
//小汽車類繼承自交通工具類
public class Car:Vehicle
{
//無參構造
public Car() { }
//帶參構造
public Car(string color, int dailyrent, string licenseno, string name, int YearsOfService) :
base( color,dailyrent,licenseno,name,YearsOfService)
{
}
//重寫計算價格的方法
public override double CalculatePrice()
{
//定義變量保存價格
double SumPrice = this.DailyRent * RentDate;
return SumPrice;
}
}
03.Truck類(卡車):Vechile的子類
//卡車類繼承自交通工具類
public class Truck:Vehicle
{
public int weight { get; set; }//卡車的重量
public Truck() { }
public Truck(string color, int dailyrent, string licenseno, string name, int YearsOfService,int weight):
base( color,dailyrent,licenseno,name,YearsOfService)
{
this.weight = weight;
}
//計算價格的方法
public override double CalculatePrice()
{
//定義變量保存價格
double SumPrice = this.DailyRent * RentDate;
return SumPrice;
}
04.工廠類VechileFactory
//工廠
public class VehicleFactory
{
//第一一個靜態方法,返回值類型是父類類型,傳入參數
public static Vehicle CreateVehicle(string color, int dailyrent, string licenseno, string name, int YearsOfService, int weight,string type)
{
//給對象賦null值
Vehicle vehicle = null;
switch (type)
{
case"轎車":
vehicle = new Car( color, dailyrent, licenseno, name, YearsOfService);
break;
case"卡車":
vehicle = new Truck(color, dailyrent, licenseno, name, YearsOfService, weight);
break;
}
return vehicle;
}
}
FrmMain窗體:
//定義一個字典集合保存租車(還未租出的車輛)信息k:車牌號,V父類對象
public Dictionary<string, Vehicle> dic = new Dictionary<string, Vehicle>();
//第一一個集合保存已租車輛的信息
public Dictionary<string, Vehicle> outdic = new Dictionary<string, Vehicle>();
//點擊退出觸發的事件
private void btnrefurbish_Click(object sender, EventArgs e)
{
Application.Exit();
}
//load事件
private void FrmMain_Load(object sender, EventArgs e)
{
//01.初始化泛型集合(添加數據到集合中去)
Car car = new Car("紅色", 500, "京P-34566", "奔馳", 3);
Car car1 = new Car("白色", 1000, "京Q-XH456", "保時捷", 2);
Truck truck = new Truck("藍色", 200, "貴-B300掛", "變形金剛",5,100);
dic.Add(car.LicenseNo, car);
dic.Add(car1.LicenseNo, car1);
dic.Add(truck.LicenseNo, truck);
//02寫一個方法顯示到窗體的listview空間中
dictolvlist(dic,lvlist);
//03,給新車入庫的顏色下拉框綁定值
comcolor.Items.Add("紅色");
comcolor.Items.Add("藍色");
comcolor.Items.Add("白色");
comcolor.Items.Add("黑色");
comcolor.Items.Add("灰色");
}
public void dictolvlist(Dictionary<string,Vehicle> dic,ListView lv)
{
//創建一個listviewitem對象,賦值為null
ListViewItem item = null;
//顯示數據之前,清除數據
lv.Items.Clear();
foreach (Vehicle itemdic in dic.Values)
{
if (itemdic is Car)
{
//實例化對象
item = new ListViewItem();
item.Text = itemdic.LicenseNo;
item.SubItems.Add(itemdic.Name);
item.SubItems.Add(itemdic.Color);
item.SubItems.Add(itemdic.YearsOfService.ToString());
item.SubItems.Add(itemdic.DailyRent.ToString());
}
else
{
//實例化對象
item = new ListViewItem();
item.Text = itemdic.LicenseNo;
item.SubItems.Add(itemdic.Name);
item.SubItems.Add(itemdic.Color);
item.SubItems.Add(itemdic.YearsOfService.ToString());
item.SubItems.Add(itemdic.DailyRent.ToString());
//as等同於類型轉換
item.SubItems.Add((itemdic as Truck).weight.ToString());
}
//讓游離得Listviewitem對象和lvlsiit空間產生關系
lv.Items.Add(item);
}
}
//點擊租車觸發的事件
private void btnrentcar_Click(object sender, EventArgs e)
{
//01確保選中了一個車倆
if(lvlist.SelectedItems.Count==0)
{
MessageBox.Show("請選中你要租的車輛!");
return;
}
//02確保填寫了租用值名字
if (txtrent.Text=="")
{
MessageBox.Show("請填寫姓名!");
return;
}
//03驗證信息完成!開始租車過程
//獲取lvlist第一項的值車號
string carnum = lvlist.SelectedItems[0].Text;
//通過dic集合的key獲取整個汽車對象
Vehicle vehicle= dic[carnum];
//在集合中刪除該項記錄
dic.Remove(carnum);
//重新綁定數據,調用方法dictolvlist即可
dictolvlist(dic,lvlist);
//將已租車輛放入到已租集合中
outdic.Add(carnum, vehicle);
MessageBox.Show("租車成功!");
//清空文本框中的值
txtrent.Text = "";
}
//在還車界面點擊刷新觸發的事件
private void btnrefurbish11_Click(object sender, EventArgs e)
{
dictolvlist(outdic,lvlisttwo);
}
//點擊選擇結算觸發的事件
private void btnselectsettleaccounts_Click(object sender, EventArgs e)
{
if(lvlisttwo.SelectedItems.Count==0)
{
MessageBox.Show("請選擇要退還的車輛!");
return;
}
//確保用戶填寫了租用天數
if (txtrentday.Text=="")
{
MessageBox.Show("請填寫租用天數!");
return;
}
//執行還車步驟
//獲取listviewtow中的選中項的車牌號
string carnum = lvlisttwo.SelectedItems[0].Text;
//從已租集合中通過key值找到汽車完整對象
Vehicle vehicle= outdic[carnum];
//給還車日期屬性賦值
vehicle.RentDate = Convert.ToInt32(txtrentday.Text);
//計算價格
double summoney=vehicle.CalculatePrice();
//添加到未租車輛中
dic.Add(carnum, vehicle);
//刪除已租車輛的該車輛信息
outdic.Remove(carnum);
//重新綁定數據
dictolvlist(outdic, lvlisttwo);
MessageBox.Show("需支付金額"+summoney.ToString());
//清空文本框中的值
txtrentday.Text = "";
}
//點擊刷新觸發的事件
private void btnrefurbish_Click_1(object sender, EventArgs e)
{
dictolvlist(dic, lvlist);
}
//點擊入庫觸發的事件
private void btnok_Click(object sender, EventArgs e)
{
try
{
//01獲取對應文本框中的值,
string carnum = txt.Text;//車號
string cartype = txtcartype.Text;//車型
string color = comcolor.Text;//顏色
int endtime = Convert.ToInt32(txttime.Text);//使用時間
int money = Convert.ToInt32(txtdaymoney.Text);//每日租金
int weight = 0;
if (rbcar.Checked == true)
{
//01寫一個方法判斷用戶信息填寫是否填寫完整
if (isnulltwo() == true)
{
//執行到這證明信息已經驗證完成
//調用工廠類,傳入對應類型汽車,獲取對應子類對象
//獲取對應子類對象
Vehicle vehicle = VehicleFactory.CreateVehicle(color, money, carnum, cartype, endtime, weight, rbcar.Text);
//添加到集合中去
dic.Add(carnum, vehicle);
MessageBox.Show("添加成功!");
}
}
else if (rbtruck.Checked == true)
{
if (isnull() == true)
{
weight = Convert.ToInt32(txttruckweight.Text);//卡車載重
//獲取對應子類對象
Vehicle vehicle = VehicleFactory.CreateVehicle(color, money, carnum, cartype, endtime, weight, rbtruck.Text);
//添加到集合中去
dic.Add(carnum, vehicle);
MessageBox.Show("添加成功!");
}
}
//調用清空文本框中的值的方法
infoclear();
}
catch (Exception)
{
MessageBox.Show("輸入格式有誤!");
}
}
//判斷新車入庫中填寫信息是否完整
public bool isnull()
{
if (rbcar.Checked==false&&rbtruck.Checked==false)
{
MessageBox.Show("請選擇添加的車輛類型!");
return false;
}
else if (txt.Text == "" || txtcartype.Text == "" || comcolor.Text == "" || txttime.Text == "" || txtdaymoney.Text == "" || txttruckweight.Text == "")
{
MessageBox.Show("請填寫完整的信息!");
return false;
}
else
{
return true;
}
}
public bool isnulltwo()
{
if (rbcar.Checked == false && rbtruck.Checked == false)
{
MessageBox.Show("請選擇添加的車輛類型!");
return false;
}
else if (txt.Text == "" || txtcartype.Text == "" || comcolor.Text == "" || txttime.Text == "" || txtdaymoney.Text == "")
{
MessageBox.Show("請填寫完整的信息!");
return false;
}
else
{
return true;
}
}
//單機卡車觸發的事件
private void rbtruck_Click(object sender, EventArgs e)
{
if (rbtruck.Checked == true)
{
txttruckweight.Enabled = true;
lbltruckweight.ForeColor = Color.Blue;
}
}
//單機轎車觸發的事件
private void rbcar_Click(object sender, EventArgs e)
{
if (rbcar.Checked == true)
{
txttruckweight.Enabled = false;
lbltruckweight.ForeColor = Color.Red;
}
}
//清空文本框中的值的方法
public void infoclear()
{
txt.Text = "";
txtcartype.Text = "";
comcolor.Text = "" ;
txttime.Text = "";
txtdaymoney.Text = "";
txttruckweight.Text = "";
}
如有感覺和我意見不同的可以盡情發表意見,謝謝!