您的位置:首页 > 其它

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

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控件,建议多多去理解,实践去理解才会记的长久。贴出来原代码:

课程类:

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);
}

}
}
}
}


执行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐