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 = ;
if (items.Count > )
{
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基础版",,"一周时间");
c2 = new CourseItem("Arduino提高版", , "两周时间");
c3 = new CourseItem("Arduino至尊版", , "一月时间"); c4 = new CourseItem("51基础版", , "一周时间");
c5 = new CourseItem("51提高版", , "两周时间");
c6 = new CourseItem("51至尊版", , "一月时间"); //将所有的课程都填充到课程的集合中去。
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 > )
{
//这里声明一个专业对象的引用
Specialty sp = null; //循环选中项
for (int i = ; 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 = ; i < clb_course.Items.Count; i++)
{
clb_course.SetItemChecked(i, true); //循环选中
}
}
else
{
for (int i = ; i < clb_course.Items.Count;i++ )
{
clb_course.SetItemChecked(i, false); //取消全选
}
} }
#endregion }
}

最终form界面如下:

C#实例,熟练使用泛型数组等,课程选择小软件的更多相关文章

  1. Java 泛型 泛型数组

    Java 泛型 泛型数组 @author ixenos 先给结论 不能(直接)创建泛型数组 泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair<T>[]为Pa ...

  2. java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)

    JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型.  1.Java泛型  其实Java ...

  3. Java“禁止”泛型数组

    Java“禁止”泛型数组 原文:https://blog.csdn.net/yi_Afly/article/details/52058708 1. 泛型定义泛型编程是一种通过参数化的方式将数据处理与数 ...

  4. 自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用

    通配符 T, K, V, E 等泛型字母为有类型, 类型参数赋予具体的值 ? 未知类型 类型参数赋予不确定值, 任意类型 只能用在 声明类型上,方法参数上, 不能用在定义泛型类上 上限 extends ...

  5. Java 中为什么不能创建泛型数组?

    之前只是知道在 Java 中不能创建泛型数组,今天翻看 <Effective Java>其中对这个部分有讲解,记录一下. 现在我们假设在 Java 中可以创建泛型数组,看看可能会发生什么情 ...

  6. 泛型数组列表 ArrayList

    为什么使用泛型数组列表而不使用普通数组? 1.普通数组经常会发生容量太大以致浪费的情况 2.普通数组无法动态更改数组 基本概念: 1.采用[类型参数]的[类]---->[泛型类] 2.[泛型类型 ...

  7. Java泛型数组

    文章来自http://blog.csdn.net/orzlzro/article/details/7017435 Java 不支持泛型数组.也就是说, List<String>[] ls ...

  8. Java 泛型数组

    Java 不支持泛型数组.也就是说, List<String>[] ls = new ArrayList<String>[10]; 是不支持的,而 List<String ...

  9. 每天一个JavaScript实例-递归实现反转数组字符串

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

随机推荐

  1. 2、cas4.0 单点登录 之 cas-client

    cas4.0 单点登录 之 cas-client cas4.0 单点登录 之 https证书已经做好了证书的准备工作.如今结合cas-server来配置单点登录: 一.安装cas服务端(cas-ser ...

  2. 渐进式 JPEG (Progressive JPEG)来提升用户体验

    1.概述 jpg格式分为:Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,扩展名也是相同的,唯一的区别是二者显示的方式不同. Base ...

  3. R 安装 简单实用

    下载和安装Windows环境的R 1.进入主页,点击 蓝色加粗的 download R 2.随便点击一个镜像,这里点击的是http://mirror.fcaglp.unlp.edu.ar/CRAN/ ...

  4. 利用CFAbsoluteTimeGetCurrent()计算时间差

    开发中,遇到计算时间差的问题,利用CFAbsoluteTimeGetCurrent()可以很方便的进行计算 实例: 场景:类似购物车中修改商品数量的功能,如下图所示,要求,修改完的数量,要同步到服务器 ...

  5. mysql 语句要求

    mysql 语句不可以有单引号,要把单引号替换为双引号!

  6. mysql 随机取数据

    SELECT * FROM table WHERE id >= (SELECT FLOOR(RAND()*MAX(id)) FROM table ) ORDER BY idLIMIT 1; 这样 ...

  7. MQTT--linux安装部署(CentOS)

    OS环境:CentOS6.5 1.安装依赖 yum -y install gcc gcc-c++ openssl-devel c-ares-devel libuuid-devel wget cmake ...

  8. org.springframework.beans.factory.UnsatisfiedDependencyException

    © 版权声明:本文为博主原创文章,转载请注明出处 1.问题描述: 搭建SSH框架,启动时报错如下: 严重: Context initialization failed org.springframew ...

  9. Linux 下安装PHPunit

    PHP 档案包 (PHAR)  要获取 PHPUnit,最简单的方法是下载 PHPUnit 的 PHP 档案包 (PHAR),它将 PHPUnit 所需要的所有必要组件(以及某些可选组件)捆绑在单个文 ...

  10. stage3D基础一-----Stage3D如何工作(转)

    在如何使用Stage3D系列中的第一个教程中,你将会学习到有关在Flash Player 11中新引入的ActionScript API,该API允许在Flash中利用硬件加速进行3D渲染.在学习这个 ...