当前位置: 移动技术网 > IT编程>开发语言>c# > C#实现简单的汽车租赁系统

C#实现简单的汽车租赁系统

2019年07月18日  | 移动技术网IT编程  | 我要评论

最近学习了继承,多态,集合,设计模式,有一个汽车租凭系统,给大家分享一下:

我们首先来看看我们这个系统的效果

1.做一个项目,我们首先对项目进行分析

根据我们最近学的知识,我们可以看出继承,多态,集合,设计模式,我们都能用到

我们把所需要的类和简单模式中的“简单工厂”的工厂准备好

 类图:

01.车辆类(父类)

 using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;

namespace 汽车租赁系统
{
 // 车辆类 父类
 public abstract class vehicle
 {
  //属性
  //车牌号
  public string licenseno { get; set; }
  
  //车名
  public string name { get; set; }
  //颜色
  public string color { get; set; }
  //使用时间
  public int rentdate { get; set; }
  //使用人
  public string rentuser { get; set; }
  //日租金
  public double dailyrent { get; set; }
  //还车日期
  public int returndate { get; set; }

  public vehicle() { }
  //构造
  public vehicle(string liceseno,string name,string color,int rentdate,double dailyrent)
  {
   this.color = color;
   this.dailyrent = dailyrent;
   this.licenseno = liceseno;
   this.name = name;
   this.rentdate = rentdate;
 
  }

  //计算价格的虚方法
  public abstract double getnum();
  
 }
}

02.子类汽车类   (继承 车辆类 父类)

 using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;

namespace 汽车租凭系统
{
 //汽车类 子类
 public class car:vehicle
 {
  public car() { }
  //构造
  public car(string licenseno, string name, string color, int rentdate, double dailyrent)
   : base(licenseno, name, color, rentdate, dailyrent) 
  { }
  //重写父类计算价格的方法
  public override double getnum()
  {
   //日租金*租的天数
   double result = this.dailyrent * this.returndate;
   return result;
  }
 }
}

03.子类卡车类 继承 车辆类 父类

 using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;

namespace 汽车租凭系统
{
 //子类
 public class truck:vehicle
 {
  //载重
  public int load { get; set; }

  public truck() { }

  //构造
  public truck(string licenseno,string name,string color,int rentdate,double dailyrent,int load )
   :base(licenseno,name,color,rentdate,dailyrent ) 
  {
   this.load = load;
  }

  //重写父类计算价格的方法
  public override double getnum()
  {
   //日租金*租的天数
   double result = this.dailyrent * this.returndate;
   return result;
  }
 }
}

 04.“简单工厂”的工厂类

说这个工厂类,就是为了在新车入库的时候,可以知道它是轿车还是卡车,实例化不同的对象,方便使用

 using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;

namespace 汽车租赁系统
{
 //工厂类
 public class vehiclefactory
 {
  //带参静态方法
  public static vehicle carteshow(string liceseno, string name, string color, int rentdate, double dailyrent, int load,string type)
  {
   //初始化父类对象
   vehicle vehicle = null;
   switch (type)
   {
    //根据传来的值,实例化对应的对象
    case"卡车":
     vehicle = new truck(liceseno, name, color, rentdate, dailyrent, load);
     break;
    case"轿车":
     vehicle = new car(liceseno, name, color, rentdate, dailyrent);
     break;
   }
   //返回实例化对象
   return vehicle;
  
  
  }
 }
}

2. 剩下的就是对主窗体的功能进行实现

其实租车和还车的核心就是两个集合之间的交互

新车入库就是使用“简单工厂”的设计模式进行对应添加

其中有个我们以前没见过的控件tabcontrol

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 frmmain : form
 {
  public frmmain()
  {
   initializecomponent();
  }
  //保存可租车辆的集合
  dictionary<string, vehicle> vehicles=new dictionary<string,vehicle>();
  //保存租出车的集合
  dictionary<string, vehicle> rentvehicles=new dictionary<string,vehicle>();

  //动态加载listview的方法
  public void new(dictionary<string,vehicle> list,listview lvlist) 
  {
   listviewitem listview = null;
   lvlist.items.clear();
   foreach (vehicle item in list.values)
   {
    if (item is car)
    {
     listview = new listviewitem();
     listview.text = item.licenseno;
     listview.subitems.add(item.name);
     listview.subitems.add(item.color);
     listview.subitems.add(item.rentdate.tostring());
     listview.subitems.add(item.dailyrent.tostring());
    }
    else if (item is truck)
    {
     listview = new listviewitem();
     listview.text = item.licenseno;
     listview.subitems.add(item.name);
     listview.subitems.add(item.color);
     listview.subitems.add(item.rentdate.tostring());
     listview.subitems.add(item.dailyrent.tostring());
     listview.subitems.add(((truck)item).load.tostring());
    }
    lvlist.items.add(listview);
   }
   
  }

  //准备可租车辆
  public void intitle() 
  {
   
   truck truck = new truck("京a111","奥迪","红色",3,240,10);
   car car = new car("京a222", "宝马", "黑色", 3, 240);

   vehicles.add(truck.licenseno,truck);
   vehicles.add(car.licenseno, car);
   //加载数据
   new(vehicles,lvlist);
   
  }
  private void frmmain_load(object sender, eventargs e)
  {
   intitle();
  }
  //点击租车触发的事件
  private void btn_zu_click(object sender, eventargs e)
  {
   if(lvlist.selecteditems.count==0)
   
   {
    messagebox.show("请选中一行!");
    return;
   }
   if (txt_name.text=="")
   {
    messagebox.show("请输入姓名!");
    return;

   }
   //执行租车.
   //获取车牌号的值
   string carnum = lvlist.selecteditems[0].text;
   vehicle ve= vehicles[carnum];

   //直接把获得要租的信息放入rentvehicles集合

   rentvehicles.add(carnum,ve);

   //删除原来的集合
   vehicles.remove(carnum);

   //重新加载
   new(vehicles,lvlist);
   messagebox.show("租车成功");

  }

  private void button1_click(object sender, eventargs e)
  {
   //加载已出租车辆信息
   new(rentvehicles,lvlist_huan);
   
  }

  private void btn_ji_click(object sender, eventargs e)
  {
   if (txt_day.text=="")
   {
    messagebox.show("请输入天数");
    return;
   }

   if (lvlist_huan.selecteditems.count==0)
   {
    messagebox.show("请选择一行");
    return;
   }
   //获取车牌号的值
   string carnum1 = lvlist_huan.selecteditems[0].text;
   vehicle ve = rentvehicles[carnum1];

  
   //获取租的天数
   int num = convert.toint32(txt_day.text);
   ve.returndate = num;
   double money=ve.getnum();
   dialogresult result= messagebox.show("你要支付"+money+"元","提示",messageboxbuttons.okcancel,messageboxicon.question);
   if (result==dialogresult.ok)
   {
    //直接把获得要还的信息放入vehicles集合
    vehicles.add(carnum1, ve);

    //删除原来的集合
    rentvehicles.remove(carnum1);

    //重新加载
    new(rentvehicles, lvlist_huan);
    messagebox.show("还车成功");
   }
   

  }
  //刷新按钮
  private void btn_new_click(object sender, eventargs e)
  {
   //重新加载
   new(vehicles, lvlist);
  }
  //判断填写是否正确的方法
  public bool good() 
  {
   bool flag = true;
   if (txt_id.text==""||txt_xing.text==""||cmb_color.text==""||txt_time.text==""||txt_money.text==""||txt_zhong.text==""|| rdb_jiao.text=="")
   {
    flag = false;

   }
   return flag;
  }
  //入库按钮点击事件
  private void btn_ruku_click(object sender, eventargs e)
  {
   if (good())//判断填写是否正确
   {

    foreach (string item in vehicles.keys)
    {
     if (txt_id.text==item)
     {
      messagebox.show("此车牌已经有库存了,请你确认!");
      return;
     }
    }
    //使用"简单工厂"
    vehicle ve = null;
    if (rdb_jiao.checked == true)
    {
     ve = vehiclefactory.carteshow(txt_id.text, txt_xing.text, cmb_color.text,convert.toint32(txt_time.text), convert.todouble(txt_money.text), convert.toint32(txt_zhong.text), rdb_jiao.text);

    }
    else
    {
     ve = vehiclefactory.carteshow(txt_id.text, txt_xing.text, cmb_color.text, convert.toint32(txt_time.text), convert.todouble(txt_money.text), convert.toint32(txt_zhong.text), rdb_ka.text);

    }
    //添加集合
    vehicles.add(txt_id.text, ve);
    messagebox.show("入库成功");

    //清空所要填的值选项
    txt_id.text="";
    txt_xing.text="";
    cmb_color.text="";
    txt_time.text="";
    txt_money.text= "";
    txt_zhong.text = ""; 
   }
   else
   {

    messagebox.show("请完善信息的填写!");
   }
   

  }
  //选择不同的按钮
  private void rdb_jiao_checkedchanged(object sender, eventargs e)
  {
   if (rdb_jiao.checked==true)
   {
    lab_zhong.forecolor = color.red;
    txt_zhong.enabled = false;
   }
   else
   {
    lab_zhong.forecolor = color.black;
    txt_zhong.enabled = true;
   }
  }
 }
}

我们来分类看看其中的魅力代码:

1.租车的界面功能

01.租车按钮  

//点击租车触发的事件
  private void btn_zu_click(object sender, eventargs e)
  {
   //确保选中一行
   if(lvlist.selecteditems.count==0)
   
   {
    messagebox.show("请选中一行!");
    return;
   }
   //确保有人租车
   if (txt_name.text=="")
   {
    messagebox.show("请输入姓名!");
    return;

   }
   //执行租车.
   //获取车牌号的值
   string carnum = lvlist.selecteditems[0].text;
   //根据车牌号获得此车对象
   vehicle ve= vehicles[carnum];

   //直接把获得要租的信息放入rentvehicles集合

   rentvehicles.add(carnum,ve);

   //删除原来的集合
   vehicles.remove(carnum);

   //重新加载
   new(vehicles,lvlist);
   messagebox.show("租车成功");

02.刷新按钮

//刷新按钮
  private void btn_new_click(object sender, eventargs e)
  {
   //重新加载
   new(vehicles, lvlist);
  }

这里的刷新定义了一个方法,也就是动态加载listview的方法(nuw方法)

这个方法有两个参数,第一个参数传入车辆类型集合对象,第二个传入listview的名字

这样的作用就是在租车和还车时都能使用此方法进行刷新,岂不妙哉!

 //动态加载listview的方法
  public void new(dictionary<string,vehicle> list,listview lvlist) 
  {
   //初始化listviewitem对象
   listviewitem listview = null;
    //清除listview,以免有冲突的值
   lvlist.items.clear();
   foreach (vehicle item in list.values)
   {
    //判断赋值
    if (item is car)
    {
     listview = new listviewitem();
     listview.text = item.licenseno;
     listview.subitems.add(item.name);
     listview.subitems.add(item.color);
     listview.subitems.add(item.rentdate.tostring());
     listview.subitems.add(item.dailyrent.tostring());
    }
    else if (item is truck)
    {
     listview = new listviewitem();
     listview.text = item.licenseno;
     listview.subitems.add(item.name);
     listview.subitems.add(item.color);
     listview.subitems.add(item.rentdate.tostring());
     listview.subitems.add(item.dailyrent.tostring());
     listview.subitems.add(((truck)item).load.tostring());
    }
    //关联
    lvlist.items.add(listview);
   }
   
  }

2.还车的界面功能

01.选择结算按钮

 private void btn_ji_click(object sender, eventargs e)
  {
   //确保 是否输入天数
   if (txt_day.text=="")
   {
    messagebox.show("请输入天数");
    return;
   }
   //确保是否选中一行
   if (lvlist_huan.selecteditems.count==0)
   {
    messagebox.show("请选择一行");
    return;
   }
   //获取车牌号的值
   string carnum1 = lvlist_huan.selecteditems[0].text;
    //根据车牌号获得对应的车辆对象
   vehicle ve = rentvehicles[carnum1];
  
   //获取租的天数
   int num = convert.toint32(txt_day.text);
   //给属性使用天数赋值
   ve.returndate = num;
   //调用计算方法(多态的应用)
   double money=ve.getnum();
   dialogresult result= messagebox.show("你要支付"+money+"元","提示",messageboxbuttons.okcancel,messageboxicon.question);
   if (result==dialogresult.ok)
   {
    //直接把获得要还的信息放入vehicles集合
    vehicles.add(carnum1, ve);

    //删除原来的集合
    rentvehicles.remove(carnum1);

    //重新加载
    new(rentvehicles, lvlist_huan);
    messagebox.show("还车成功");
   }
   

  }

02.刷新按钮(调用租车时写的方法)

private void button1_click(object sender, eventargs e)
  {
   //加载已出租车辆信息
   new(rentvehicles,lvlist_huan);
   
  }

3.新车入库界面功能

01.入库按钮

 //入库按钮点击事件
  private void btn_ruku_click(object sender, eventargs e)
  {
   if (good())//判断填写是否正确
   {
     //车牌号是唯一的,不能重复添加已有的车牌号
    foreach (string item in vehicles.keys)
    {
     if (txt_id.text==item)
     {
      messagebox.show("此车牌已经有库存了,请你确认!");
      return;
     }
    }
    //使用"简单工厂",进行对应添加
    vehicle ve = null;
    if (rdb_jiao.checked == true)
    {
     ve = vehiclefactory.carteshow(txt_id.text, txt_xing.text, cmb_color.text,convert.toint32(txt_time.text), convert.todouble(txt_money.text), convert.toint32(txt_zhong.text), rdb_jiao.text);

    }
    else
    {
     ve = vehiclefactory.carteshow(txt_id.text, txt_xing.text, cmb_color.text, convert.toint32(txt_time.text), convert.todouble(txt_money.text), convert.toint32(txt_zhong.text), rdb_ka.text);

    }
    //添加集合
    vehicles.add(txt_id.text, ve);
    messagebox.show("入库成功");

    //清空所要填的值选项
    txt_id.text="";
    txt_xing.text="";
    cmb_color.text="";
    txt_time.text="";
    txt_money.text= "";
    txt_zhong.text = ""; 
   }
   else
   {

    messagebox.show("请完善信息的填写!");
   }
   

  }

以上就是本文的全部内容,希望对大家的学习有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网