第二十四讲:泛型实例 - 专业\课程管理模块实现
2014-03-26 17:55
507 查看
回顾
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控件,建议多多去理解,实践去理解才会记的长久。贴出来原代码:
课程类:
专业类:
前台代码:
执行结果:
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); } } } } }
执行结果:
相关文章推荐
- 模块管理常规功能自定义系统的设计与实现(03--基本系统)
- java GUI实现学生图书管理简单实例
- 模块管理常规功能自定义系统的设计与实现(54--视频讲解更新高清 )
- 用C#和SQL实现课程信息管理系统(华工软院复试题练习)
- 模块管理常规功能自己定义系统的设计与实现(53--演示程序和视频解说 )
- Java语言实现简单FTP软件 FTP连接管理模块实现(8)
- 利用面向对象实现简单的控制台课程管理系统
- step by step 之餐饮管理系统四(日志模块实现)
- JAVA课程学习九:类训练-学生管理实现
- Linux BT下载(14)-策略管理模块的设计和实现
- 商城项目用拦截器实现日志管理模块
- 模块管理常规功能自己定义系统的设计与实现(31--第三阶段 权限设计[1])
- 模块管理常规功能自定义系统的设计与实现(56--开源开发测试版发布 )
- 实验楼学习之C++实现课程管理系统
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 传智播客--OA的部门管理和员工管理模块的实现总结
- 学生社团管理系统 任务:通过此系统可以实现如下功能(包含但不限于以下功能,可自行设计): 1、社团信息包括:社团编号、社团名称、成立时间…… 2、学生信息包括:学号、姓名、性别、年级、专业…… 3
- jsp与数据库连接实例:数据库课程设计冰山一角(完整模块)
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 模块管理常规功能自定义系统的设计与实现(29--多个模块之间的关联[5])