第二十四讲:泛型实例 - 专业\课程管理模块实现

回顾
    1. 泛型最常用集合操作
    2. 泛型集合的优点
        1. 类型安全
        2. 效率更高
        3. 二进制代码重用(代码扩展更好)
        
    3. 在CLR中预定义了一批常用的泛型类
        List<T>, Dictionary<TKey,TValue>, Queue<T>等等,都放在System.Collections.Generic 命名空间下面,有兴趣可以去查阅
        
主要内容
    1. 申明类的数据字段
    2. 初始化类的公有字段
    3. 加载专业信息和全部课程列表
    4. 将指定专业所属课程填充到ListView
    5. 向专业中添加课程
    6. 将指定课程从专业移除

    7. 课程列表的全选,取消


我是跟着课程写的,测试通过,本着不理解透不往下学的态度,我一个人捣鼓了三天基本是学懂了,重复敲了三遍,看一遍,等一顿饭的工夫,自己去敲,碰到不能理解的,想不通的,就再看一遍,重头再敲,三天了敲懂,总算也值了,呵呵。两个类,一个课程类,一个专业类,专业类包含课程类,最后前台逻辑实现,其实重点在前台控件的控制上,ListView这个控件,还是多看看,多敲敲,Combobox控件,CheckListbox控件,建议多多去理解,实践去理解才会记的长久。贴出来原代码:

课程类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WF24
{
    /// <summary>
    /// 课程类
    /// </summary>
    public class Course
    {
        string _CourseName;//课程名
        int _CourseNumber;//课时数
        string _CourseMore;//课程说明

        /// <summary>
        /// 课程名读写属性
        /// </summary>
        public string CourseName
        {
            get { return _CourseName; }
            set { _CourseName = value; }
        }

        /// <summary>
        /// 课时数读写属性
        /// </summary>
        public int CourseNumber
        {
            get { return _CourseNumber; }
            set { _CourseNumber = value; }
        }

        /// <summary>
        /// 课程说明读写属性
        /// </summary>
        public string CourseMore
        {
            get { return _CourseMore; }
            set { _CourseMore = value; }
        }

    }
}

专业类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WF24
{
    /// <summary>
    /// 专业类
    /// </summary>
    public class Special
    {


        #region 类的基础信息
        //专业类里面包含了对应的课程列表
        Dictionary<string, Course> spec;//一个泛型集合
        string specName; //专业名称
        int specCount;//专业课程集的课时总数

        /// <summary>
        /// 专业类课程列表属性
        /// </summary>
        public Dictionary<string, Course> Spec
        {
            get { return spec; }
            set { spec = value; }
        }


        /// <summary>
        /// 专业名称属性
        /// </summary>
        public string SpecName
        {
            get { return specName; }
            set { specName = value; }
        }


        /// <summary>
        /// 专业课程集课时总数
        /// </summary>
        public int SpecCount
        {
            get {
                GetSpecCount();
                return specCount; 
            }
        }

        /// <summary>
        /// 实例化类对象时,初始化专业类的泛型集合强类型属性
        /// </summary>
        public Special()
        {
            spec = new Dictionary<string, Course>();
        }

        /// <summary>
        /// 通过专业名称和专业课程集来实例化
        /// </summary>
        /// <param name="s">专业名</param>
        /// <param name="co">专业课程集</param>
        public Special(string s, Dictionary<string, Course> co)
        {
            this.specName = s;
            this.spec = co;
        }

        /// <summary>
        /// 根据转入的专业课程集初始化类对象
        /// </summary>
        /// <param name="co">专业课程集</param>
        //public Special(Dictionary<string, Course> co)
        //{
        //    this.spec = co;
        //} 
        #endregion

        private void GetSpecCount()
        {
            int result = 0;
            foreach (Course c in spec.Values)
            {
                result += c.CourseNumber;
            }

            this.specCount=result;
        }

        /// <summary>
        /// 根据用户提供的专业名来获取课程列表
        /// </summary>
        /// <param name="s">专业名</param>
        /// <returns>课程列表</returns>
        public List<Course> GetCourseList(string s)
        {
            List<Course> lc = new List<Course>();

            foreach (KeyValuePair<string, Course> k in spec)
            {
                if (s == k.Key)
                {
                    lc.Add(k.Value);
                }
            }

            return lc;
        }
    }
}

前台代码:

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 WF24
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        #region 定义公共字段
        //定义公共字段
        Special s1, s2, s3;//3个专业
        Dictionary<string, Course> d1; //专业课程集合1
        Dictionary<string, Course> d2; //专业课程集合2
        Dictionary<string, Course> d3; //专业课程集合3

        Dictionary<string, Special> allSpecial;//收录全部的专业
        Dictionary<string, Course> allCourse; //收录全部的课程


        List<Course> list1 = new List<Course>() {
            new Course(){CourseName="计算机课程1",CourseNumber=109,CourseMore="计算机备注1"},
            new Course(){CourseName="计算机课程2",CourseNumber=109,CourseMore="计算机备注2"},
            new Course(){CourseName="计算机课程3",CourseNumber=109,CourseMore="计算机备注3"},
            new Course(){CourseName="计算机课程4",CourseNumber=109,CourseMore="计算机备注4"}
        };

        List<Course> list2 = new List<Course>() {
            new Course(){CourseName="生物科学课程1",CourseNumber=109,CourseMore="生物科学备注1"},
            new Course(){CourseName="生物科学课程2",CourseNumber=109,CourseMore="生物科学备注2"},
            new Course(){CourseName="生物科学课程3",CourseNumber=109,CourseMore="生物科学备注3"},
            new Course(){CourseName="生物科学课程4",CourseNumber=109,CourseMore="生物科学备注4"}
        };

        List<Course> list3 = new List<Course>() {
            new Course(){CourseName="会计化专业1",CourseNumber=109,CourseMore="会计化专业备注1"},
            new Course(){CourseName="会计化专业2",CourseNumber=109,CourseMore="会计化专业备注2"},
            new Course(){CourseName="会计化专业3",CourseNumber=109,CourseMore="会计化专业备注3"},
            new Course(){CourseName="会计化专业4",CourseNumber=109,CourseMore="会计化专业备注4"}
        };
        #endregion

        #region 初始化代码 +public void Init()
        public void Init()
        {
            allSpecial = new Dictionary<string, Special>();
            allCourse = new Dictionary<string, Course>();
            d1 = new Dictionary<string, Course>(); //专业课程集合1
            //将课程添加到对应专业类中去
            foreach (Course c in list1)
            {

                d1.Add(c.CourseName, c);//先添加到单个专业集合中
                allCourse.Add(c.CourseName, c);//再次添加到全部的集合中
            }

            s1 = new Special("计算机课程", d1);//实例化专业类,下同
            allSpecial.Add(s1.SpecName, s1);//将实例化的专业类添加到全部集合中
            //================================================
            d2 = new Dictionary<string, Course>(); //专业课程集合2
            foreach (Course c in list2)
            {

                d2.Add(c.CourseName, c);
                allCourse.Add(c.CourseName, c);
            }

            s2 = new Special("生物科学课程", d2);
            allSpecial.Add(s2.SpecName, s2);
            //================================================
            d3 = new Dictionary<string, Course>(); //专业课程集合3
            foreach (Course c in list3)
            {

                d3.Add(c.CourseName, c);
                allCourse.Add(c.CourseName, c);
            }

            s3 = new Special("会计化专业", d3);
            allSpecial.Add(s3.SpecName, s3);

        }

        #endregion


        /// <summary>
        /// 窗口载入时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            Init();//调用初始化方法

            //为专业列表添加专业名称进去
            cbSpec.Text = "--请选择专业--";
            foreach (Special s in allSpecial.Values)
            {
                cbSpec.Items.Add(s.SpecName);
            }
            //将课程添加到复选列表中
            foreach (Course c in allCourse.Values)
            {
                clbClass.Items.Add(c.CourseName);
            }
        }

        ListViewItem lvi; //定义一个列表视图项的类对象,这个是ListView控件专有的类

        /// <summary>
        /// 用户选择专业时
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cbSpec_SelectedIndexChanged(object sender, EventArgs e)
        {
            NewMethod(cbSpec.Text);
        }

        #region 加载专业课程列表   +private void NewMethod(string str)
        private void NewMethod(string str)
        {
            //每次改变,加载专业课程时需要先清空原先加载的数据
            lvClass.Items.Clear();
            if (str != "--请选择专业--")//如果选择不等默认显示文本
            {
                //获取所选择专业
                Special s = allSpecial[cbSpec.Text.Trim()];

                foreach (Course c in s.Spec.Values)//将专业中的课程添加到ListView列表中
                {
                    lvi = new ListViewItem(c.CourseName);//这个初始化必须有,不能整个空的,否则第一列不显示
                    lvi.SubItems.Add(c.CourseNumber.ToString());
                    lvi.SubItems.Add(c.CourseMore);
                    lvClass.Items.Add(lvi);//上面三行是对每一行的每一列进行填充,最好这一步是将行添加到集合中来
                }
                lblName.Text = s.SpecName;
                lblNumber.Text = s.Spec.Count.ToString();
                lblTotal.Text = s.SpecCount.ToString();
            }

            
        }
        #endregion

        /// <summary>
        /// 移除课程
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRemove_Click(object sender, EventArgs e)
        {
            if (cbSpec.Text != "--请选择专业--" && lvClass.SelectedItems.Count > 0)
            {
                //获取专业类
                Special spec = allSpecial[cbSpec.Text.Trim()];

                foreach (ListViewItem l in lvClass.SelectedItems)
                {
                    //获取每一项所对应的课程
                    Course c = allCourse[l.Text];

                    //判断所选课程是否被包含在所选专业中
                    if (spec.Spec.ContainsValue(c))
                    {
                        //如果在就删除它
                        spec.Spec.Remove(c.CourseName);
                    }
                }
            }
            //重新加载专业对应的课程列表
            NewMethod(cbSpec.Text);
        }

        /// <summary>
        /// 向指定专业添加选择的课程
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //首先我确认用户选择了课程和专业
            if (cbSpec.Text != "--请选择专业--" && clbClass.CheckedItems.Count > 0)
            { 
                //同样是先获取所选择的专业
                Special spec = allSpecial[cbSpec.Text.Trim()];
 
                //循环获取并添加所选择的课程到指定的专业中去
                for (int i = 0; i < clbClass.CheckedItems.Count; i++)
                {
                    Course c = allCourse[clbClass.CheckedItems[i].ToString()];

                    //判断对应专业中是否已经存在所要添加的课程,有就是友好提示一下
                    if (!spec.Spec.ContainsValue(c))
                    {
                        //如果没有就添加
                        spec.Spec.Add(c.CourseName, c);
                    }
                    else {
                        MessageBox.Show(c.CourseName+"课程已经存在");
                    }
                }
            }
            NewMethod(cbSpec.Text);
        }

        /// <summary>
        /// 全选筛选框的使用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            //根据筛选框的状态操作
            if (checkBox1.Checked==true)
            {
                for (int i = 0; i < clbClass.Items.Count; i++)
                {
                    clbClass.SetItemChecked(i, true);
                }
            }
            else
            {
                for (int i = 0; i < clbClass.Items.Count; i++)
                {
                    clbClass.SetItemChecked(i, false);
                }
                
            }
        }
    }
}

执行结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值