欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-28 19:17:57
最近学习了继承,多态,集合,设计模式,有一个汽车租凭系统,给大家分享一下: 我们首先来看看我们这个系统的效果 1.做一个项目,我们首先对项目进行分析 根据...

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

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

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

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

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

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

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

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

 类图:

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

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

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

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("请完善信息的填写!");
   }
   

  }

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