C#实例,熟练使用泛型数组等,课程选择小软件

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界面如下:

1

posted on 2013-11-07 18:31  神秘藏宝室  阅读(351)  评论(0编辑  收藏  举报

 >>>转载请注明出处<<<