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 = ;
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#实例,熟练使用泛型数组等,课程选择小软件的更多相关文章
- Java 泛型 泛型数组
Java 泛型 泛型数组 @author ixenos 先给结论 不能(直接)创建泛型数组 泛型数组实际的运行时对象数组只能是原始类型( T[]为Object[],Pair<T>[]为Pa ...
- java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)
JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java ...
- Java“禁止”泛型数组
Java“禁止”泛型数组 原文:https://blog.csdn.net/yi_Afly/article/details/52058708 1. 泛型定义泛型编程是一种通过参数化的方式将数据处理与数 ...
- 自定义泛型_无多态_通配符无泛型数组_jdk7泛型使用
通配符 T, K, V, E 等泛型字母为有类型, 类型参数赋予具体的值 ? 未知类型 类型参数赋予不确定值, 任意类型 只能用在 声明类型上,方法参数上, 不能用在定义泛型类上 上限 extends ...
- Java 中为什么不能创建泛型数组?
之前只是知道在 Java 中不能创建泛型数组,今天翻看 <Effective Java>其中对这个部分有讲解,记录一下. 现在我们假设在 Java 中可以创建泛型数组,看看可能会发生什么情 ...
- 泛型数组列表 ArrayList
为什么使用泛型数组列表而不使用普通数组? 1.普通数组经常会发生容量太大以致浪费的情况 2.普通数组无法动态更改数组 基本概念: 1.采用[类型参数]的[类]---->[泛型类] 2.[泛型类型 ...
- Java泛型数组
文章来自http://blog.csdn.net/orzlzro/article/details/7017435 Java 不支持泛型数组.也就是说, List<String>[] ls ...
- Java 泛型数组
Java 不支持泛型数组.也就是说, List<String>[] ls = new ArrayList<String>[10]; 是不支持的,而 List<String ...
- 每天一个JavaScript实例-递归实现反转数组字符串
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
随机推荐
- JavaScript target与currentTarget区别
1.DOM事件绑定到父元素 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=& ...
- OSGI中的service依赖关系管理
众所周知.对于高动态高可扩展的应用,OSGI是一个很好的平台.可是.也因此添加了复杂性.开发中对service的依赖变得复杂. 这也是service的关系管理成为OSGI中一个很重要的部分,我们来看看 ...
- Linux如何查看进程、杀死进程、查看端口等常用命令
查看进程号 1.ps 命令用于查看当前正在运行的进程.grep 是搜索 例如: ps -ef | grep java表示查看所有进程里 CMD 是 java 的进程信息2.ps -aux | grep ...
- Java GUI编程SwingUtilities.invokeLater作用
1 http://blog.micxp.com/index.php/archives/109/ 2
- Android 下Service
1 http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html 2 http://blog.csdn.net/android_tutor/ ...
- android CheckBox控件的定义及事件监听
http://www.beijibear.com/index.php?aid=336 android CheckBox控件的定义及事件监听,本例实现CheckBox控件的定义及点击事件的监听并显示结果 ...
- Dictionary及KeyValuePair使用
/// <summary> /// 除去数组中的空值和签名参数并以字母a到z的顺序排序 /// </summary> /// <param name="dicA ...
- SpringBoot使用MyBatis报错:Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseInsertProvider.dynamicSQL)
© 版权声明:本文为博主原创文章,转载请注明出处 1. 错误描述 使用SpringBoot集成MyBatis框架,并且使用 mapper-spring-boot-starter 自动生成MyBati ...
- Android採用async框架实现文件上传
页面效果 须要的权限 <uses-permission android:name="android.permission.INTERNET"/> 网络訪问权限; 布局文 ...
- eureka集群高可用配置,亲测成功配置(转)
转自大神的文章:https://blog.csdn.net/tianyaleixiaowu/article/details/78184793 网上讲这个东西的很多,抄来抄去的,大部分类似,多数没讲明白 ...