CourseItem.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LessonList { /// <summary> /// 课程类 /// </summary> public class CourseItem { public CourseItem() { } /// <summary> /// 实例化一个课程的对象 /// </summary> /// <param name="n">课程名字</param> /// <param name="s">课程数</param> /// <param name="a">备注</param> public CourseItem(string n,int s,string m) { Name = n; Count = s; More = m; } /// <summary> /// 课程名字 /// </summary> public string Name { get; set; } /// <summary> /// 课程数 /// </summary> public int Count { get; set; } /// <summary> /// 备注 /// </summary> public string More { get; set; } } }
Specialty.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace LessonList { /// <summary> /// 专业类 /// </summary> public class Specialty { //声明一个用来存储多门课程的集合。Dictionary是系统提供的一个泛型类, //主要表示键和值的集合 private Dictionary<string, CourseItem> items; //用一个变量存储专业的总课时,并同时初始化为0 private int count; //空的构造函数,同时也实例化一个空的集合 public Specialty() { items = new Dictionary<string, CourseItem>(); } /// <summary> /// 带参数的构造函数 /// </summary> /// <param name="s_name">专业名称</param> /// <param name="items">存储课程的集合</param> public Specialty(string s_name,Dictionary<string,CourseItem> items) { Name = s_name; this.items = items; } /// <summary> /// 课程名字 /// </summary> public string Name { get; set; } /// <summary> /// 专业总课时,只读 /// </summary> public int Count { get { Compute(); return count; } } /// <summary> /// 课程集合 /// </summary> public Dictionary<string, CourseItem> Items { get { return items; } set { items = value; } } /// <summary> /// 计算课时 /// </summary> private void Compute() { int result = 0; if (items.Count > 0) { foreach (CourseItem ci in items.Values) { result += ci.Count; } } count = result; } } }
form1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace LessonList { public partial class Form1 : Form { #region//第一步 声明类的数据字段 //课程对象 CourseItem c1, c2, c3,c4,c5,c6; //专业对象 Specialty sp1, sp2; //声明一个用于存储课程项的Dictionary集合 Dictionary<string, CourseItem> AllCourse; //声明一个用于存放专业的Dictionary集合 Dictionary<string, Specialty> AllSpecialty; #endregion public Form1() { InitializeComponent(); } #region//第二步 初始化类的公有字段 private void InitItem() { //初始化课程列表 c1 = new CourseItem("Arduino基础版",10,"一周时间"); c2 = new CourseItem("Arduino提高版", 20, "两周时间"); c3 = new CourseItem("Arduino至尊版", 30, "一月时间"); c4 = new CourseItem("51基础版", 10, "一周时间"); c5 = new CourseItem("51提高版", 20, "两周时间"); c6 = new CourseItem("51至尊版", 30, "一月时间"); //将所有的课程都填充到课程的集合中去。 AllCourse = new Dictionary<string, CourseItem>(); AllCourse.Add(c1.Name, c1); AllCourse.Add(c2.Name, c2); AllCourse.Add(c3.Name, c3); //初始化专业列表 //先初始化第一个专业的信息以及所有的课程列表 Dictionary<string,CourseItem> sp1temp = new Dictionary<string,CourseItem>(); sp1temp.Add(c1.Name,c1); sp1temp.Add(c2.Name, c2); sp1temp.Add(c3.Name, c3); //将第一个专业的名称和所包含的课程信息初始化 sp1 = new Specialty("Arduino专业",sp1temp); //先初始化第一个专业的信息以及所有的课程列表 Dictionary<string, CourseItem> sp2temp = new Dictionary<string, CourseItem>(); sp2temp.Add(c4.Name, c4); sp2temp.Add(c5.Name, c5); sp2temp.Add(c6.Name, c6); //将第一个专业的名称和所包含的课程信息初始化 sp2 = new Specialty("51单片机专业", sp2temp); //装载存放专业的集合 AllSpecialty = new Dictionary<string, Specialty>(); AllSpecialty.Add(sp1.Name, sp1); AllSpecialty.Add(sp2.Name, sp2); } #endregion #region//第三步 为专业下拉菜单和课程复选列表填充值 private void Form1_Load(object sender, EventArgs e) { InitItem(); //初始化所有数据 cb_spec.Text = "----请选择课程----"; foreach(Specialty sp in AllSpecialty.Values) { cb_spec.Items.Add(sp.Name); } foreach (CourseItem ci in AllCourse.Values) { clb_course.Items.Add(ci.Name); } } #endregion #region//第四步 将制定专业的课程填充到ListView中 //选择专业下拉菜单激发的事件 private void cb_spec_SelectedIndexChanged(object sender, EventArgs e) { if (cb_spec.Text == sp1.Name) { ModifyListView(sp1); } else { ModifyListView(sp2); } } private void ModifyListView(Specialty sp) { //清空listView1 listView1.Items.Clear(); //创建一个ListViewItem引用 ListViewItem lvi; //迭代传入对象的课程集合 foreach(CourseItem ci in sp.Items.Values) { lvi = new ListViewItem(ci.Name); lvi.SubItems.Add(ci.Count.ToString()); //添加课时数列 lvi.SubItems.Add(ci.More); //添加课程简介 listView1.Items.Add(lvi); } //计算listview1下面的综合信息 lbl_name.Text = sp.Name; lbl_kcs.Text = sp.Items.Count.ToString(); lbl_kss.Text = sp.Count.ToString(); } #endregion #region//第五步 将制定的课程添加到下拉列表中选中的专业中 private void button1_Click(object sender, EventArgs e) { if (cb_spec.Text != "----请选择课程----" && clb_course.CheckedItems.Count > 0) { //这里声明一个专业对象的引用 Specialty sp = null; //循环选中项 for (int i = 0; i < clb_course.CheckedItems.Count; i++) { //取出当前选中的专业 sp = AllSpecialty[cb_spec.Text]; //取出当前选中的课程 CourseItem ci = AllCourse[clb_course.CheckedItems[i].ToString()]; //判断,如果被选中专业中 不存在当前项 if (!sp.Items.ContainsValue(ci)) { sp.Items.Add(ci.Name, ci); //将当前项添加到专业的课程集合中 ModifyListView(sp); } else { MessageBox.Show(ci.Name + "已经存在了!"); } } } else { MessageBox.Show("未选中项或者当前未选择要处理的专业"); } } #endregion #region//第六步 将制定课程从当前专业课程移除 private void button2_Click(object sender, EventArgs e) { //得到当前需要处理的专业对象 Specialty sp = AllSpecialty[cb_spec.Text]; //在本实例中我们允许listview1控件实现多选,因此用foreach foreach(ListViewItem lvi in listView1.SelectedItems) { //得到当前需要处理的课程对象 CourseItem ci = sp.Items[lvi.Text]; if (sp.Items.ContainsValue(ci)) { sp.Items.Remove(ci.Name); } } ModifyListView(sp); } #endregion #region//第七步 全选课程复选框列表 private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked) { for (int i = 0; i < clb_course.Items.Count; i++) { clb_course.SetItemChecked(i, true); //循环选中 } } else { for (int i = 0; i < clb_course.Items.Count;i++ ) { clb_course.SetItemChecked(i, false); //取消全选 } } } #endregion } }
最终form界面如下: