继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析
网络电视精灵
项目运行状态如图:
项目完成后的类:
首先,将程序分为二部分进行:
一:TreeView节点内容的设计及编写:
1.1遍写XML文件:管理(FullChannels.xml),A类电视台北京电视台(北京电视台.xml),B类电视台凤凰卫视(凤凰卫视.xml)
1.2创建一个抽象的电视频道父类,ChannelBase,其中有成员:频道名称,频道路径,节目列表(以电视节目类作为类型的集合),解析频道节目单的抽象方法.代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第八章_网络电视精灵 { /// <summary> /// 频道类 /// </summary> public abstract class ChannelBase { //频道名称 public string ChannelName { get; set; } //频道路径 public string Path { get; set; } //节目列表 public List<TvProgram> ProgramList { get; set; } //电视节目类作为类型 //解析频道节目单信息 public abstract void Fetch(); } }
1.3创建一个电视节目类,TvProgram类,该类主要负责定义节目的属性,为后续从xml文件中读取的内容提供存放位置
其中有成员:播出时间,时段,节目名称,节目文件路径.代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 第八章_网络电视精灵 { public class TvProgram { //播出时间 public DateTime PlayTime { get; set; } //时段 public string Median { get; set; } //节目名称 public string ProgramName { get; set; } //节目文件路径 public string FilePath { get; set; } } }
1.4电视台分为两类,那么有TypeAChannel,TypeAChannel两个继承自ChannelBase的子类:
A类电视(北京电视台):
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace 第八章_网络电视精灵 { /// <summary> /// A类电视台(北京电视台) /// </summary> public class TypeAChannel:ChannelBase { public override void Fetch() { //获取频道列表 XmlDocument doc = new XmlDocument(); //加载频道节目单文件 doc.Load("北京电视台.xml"); XmlElement root = doc.DocumentElement; if (ProgramList == null) { ProgramList = new List<TvProgram>(); //给频道类的List集合中添加数据 } foreach (XmlNode item in root.ChildNodes) { if (item.Name == "tvProgramTable") { foreach (XmlNode node in item.ChildNodes) { TvProgram program = new TvProgram(); program.PlayTime = DateTime.Parse(node["playTime"].InnerText); program.Median = node["meridien"].InnerText; program.ProgramName = node["programName"].InnerText; program.FilePath = node["path"].InnerText; ProgramList.Add(program); } } } } } }
B类电视(凤凰卫视)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace 第八章_网络电视精灵 { /// <summary> /// B类电视(凤凰卫视) /// </summary> public class TypeBChannel:ChannelBase { public override void Fetch() { //获取频道列表 XmlDocument doc = new XmlDocument(); try { //加载频道节目单文件 doc.Load("凤凰卫视.xml"); } catch (Exception) { throw; } XmlElement root = doc.DocumentElement; if (ProgramList == null) { ProgramList = new List<TvProgram>(); } foreach (XmlNode item in root.ChildNodes) { if (item.Name == "ProgramList") { foreach (XmlNode node in item.ChildNodes) { TvProgram program = new TvProgram(); program.PlayTime = DateTime.Parse(node["playTime"].InnerText); program.ProgramName = node["name"].InnerText; program.FilePath = node["path"].InnerText; ProgramList.Add(program); } } } } } }
1.5创建一个电视频道管理类,实现多态:
首先在频道管理类ChannelManager中写一个加载所有频道方法LoadAllChannel;
该方法作用读取FullChannels.xml文件,并且将读取到的内容赋值给ChannelBase 对象。关键的问题就转化成了如何创建一个ChannelBase对象。我们都知道ChannelBase本身是一个抽象类,无法创建实例。由此,我们想到可以通过其子类
来创建对象。由于不同子类实例化需要多次new,我们单独写了一个方法CreateChannel(string type),来创建子类实例,但是该子类实例存储在父类变量中。赋值完成后,我们需要将频道对象添加到字典中。那么
LoadAllChannel方法结束后,字典中就有了XML文档中的数据。也就是我们实现了将本地硬盘上的xml文件中的数据读取到了内存中的一个字典集合中。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace 第八章_网络电视精灵 { /// <summary> /// 电视频道管理类 /// </summary> public class ChannelManager { //频道文件路径 private string channelPath = "FullChannels.xml"; //全部频道 private Dictionary<string, ChannelBase> fullChannel = new Dictionary<string, ChannelBase>(); public Dictionary<string, ChannelBase> FullChannel { get { return fullChannel; } set { fullChannel = value; } } //读取FullChannels.xml加载所有频道列表 public void LoadChannel() { fullChannel.Clear(); XmlDocument doc = new XmlDocument(); doc.Load(channelPath); XmlElement root = doc.DocumentElement; foreach (XmlNode item in root.ChildNodes) { ChannelBase channel = CreateChannel(item["channelType"].InnerText); channel.ChannelName = item["tvChannel"].InnerText; channel.Path = item["path"].InnerText; fullChannel.Add(channel.ChannelName, channel); } } //根据频道类型创建对象 public ChannelBase CreateChannel(string type) { ChannelBase channel = null; switch (type) { case "TypeA": channel = new TypeAChannel(); break; case "TypeB": channel = new TypeBChannel(); break; default: break; } return channel; } } }
到此,为TreeView节点对象的准备工作就做完了,下面开始为TreeView的节点进行对象绑定以及右侧DataGridView的数据绑定:
二:为TreeView的节点进行对象绑定以及右侧DataGridView的数据绑定、右键菜单:
2.1初始化根节点并为DataGridView绑定数据:
private void FrmMain_Load(object sender, EventArgs e) { UpdateTreeView(); } //TreeView加载频道信息 public void UpdateTreeView() { //清空所有节点 tvList.Nodes.Clear(); //初始化根节点 TreeNode node = new TreeNode("我的电视台"); tvList.Nodes.Add(node); node = new TreeNode("所有电视台"); tvList.Nodes.Add(node); ChannelManager man=new ChannelManager(); man.LoadChannel(); foreach (ChannelBase item in man.FullChannel.Values) { //定义一个TreeView节点 TreeNode tn = new TreeNode(); tn.Text = item.ChannelName; tn.Tag = item; tvList.Nodes[1].Nodes.Add(tn); } }
2.2实现右键菜单的添加功能:
( 在这一步活生生卡了一个小时,还是比较笨~ )
获取选中的节点,根据Tag属性获取对应频道对象,然后将选定的频道加入到我的电视台中:
ChannelManager cm = new ChannelManager(); ChannelBase channel = null; //加入我的电视台 private void 加入ToolStripMenuItem_Click(object sender, EventArgs e) { channel= (ChannelBase)tvList.SelectedNode.Tag; cm.LoadChannel(); TreeNode node = new TreeNode(); node.Text = channel.ChannelName; node.Tag = channel; tvList.Nodes[0].Nodes.Add(node); }
2.3实现右键菜单的删除功能:
private void 删除ToolStripMenuItem_Click(object sender, EventArgs e) { ChannelBase chan=null; chan=(ChannelBase)tvList.SelectedNode.Tag; cm.FullChannel.Remove(chan.ChannelName); tvList.Nodes.Remove(tvList.SelectedNode); }
2.4还需要根据鼠标点击的节点位置判断右键菜单的显示:
//判断右键菜单的内容 if (tvList.SelectedNode.Level == 0) { cmsMenu.Items[0].Visible = false; cmsMenu.Items[1].Visible = false; } else if (tvList.SelectedNode.Parent.Text == "我的电视台") { cmsMenu.Items[0].Visible = false; cmsMenu.Items[1].Visible = true; } else if (tvList.SelectedNode.Parent.Text == "所有电视台") { cmsMenu.Items[1].Visible = false; cmsMenu.Items[0].Visible = true; }
2.5根据点击的节点判断DataGridView的内容:
if (tvList.SelectedNode.Text=="北京电视台") { TypeAChannel ta = new TypeAChannel(); ta.Fetch(); dgvList.DataSource = ta.ProgramList; } else if (tvList.SelectedNode.Text == "凤凰卫视") { TypeBChannel tb = new TypeBChannel(); tb.Fetch(); dgvList.DataSource = tb.ProgramList; } else { List<TvProgram> list = new List<TvProgram>(); dgvList.DataSource = list; }
继续努力!
END
本人原创,如有转载,请注明出处.
继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析的更多相关文章
- android sax解析xml 文件 动态加载标题
要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...
- mybatis源码解析之Configuration加载(五)
概述 前面几篇文章主要看了mybatis配置文件configuation.xml中<setting>,<environments>标签的加载,接下来看一下mapper标签的解析 ...
- Android应用安全之外部动态加载DEX文件风险
1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...
- AngularJS进阶(三十九)基于项目实战解析ng启动加载过程
基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...
- 通过正则表达式实现简单xml文件解析
这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- android基础知识13:AndroidManifest.xml文件解析
注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...
- Android之AndroidManifest.xml文件解析
转自:Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文 ...
- 9.XML文件解析
一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...
随机推荐
- WebService和AngularJS实现模糊过滤查询
WebService和AngularJS实现模糊过滤查询 [概要] 网上看到一个不错的帖子,用WebService获取json,然后在前端使用AngularJs进行过滤搜索,看完文章后,按自己的想 ...
- AngularJS and Asp.net MVC
AngularJS 初印象------对比 Asp.net MVC 之前就早耳闻前端MVC的一些框架,微软自家的Knockout.js,google家的AngularJs,还有Backone.但未曾了 ...
- 《剑指Offer》面试题-从头到尾打印链表
题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推 ...
- Aforge.net 一个专门为开发者和研究者基于C#框架设计
时间过得真快啊,转眼今年就要过去了,大半年都没有写博客了,要说时间嘛,花在泡妹子和搞英语去了,哈哈...前几天老大问我 怎么这么长时间都没写博客了,好吧,继续坚持,继续分享我的心得体会. 这个系列我们 ...
- C# socket编程实践
C# socket编程实践——支持广播的简单socket服务器 在上篇博客简单理解socket写完之后我就希望写出一个websocket的服务器了,但是一路困难重重,还是从基础开始吧,先搞定C# ...
- Bootstrap3.0学习第六轮(表单)
Bootstrap3.0学习第六轮(表单) 前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/aehyok/p/3404867.h ...
- vim复制
关于vim复制剪贴粘贴命令的总结 最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了. 首先是剪切(删 ...
- thinkphp空操作和配置文件实现简化路由
1关于TP中空操作和路由问题 <?php function test(){ $content="test demo @云峰天下"; $pattern='/@(\S+)\s/' ...
- easyui struts后台实现tree返回json数据
首先jsp页面有一ul用于展现tree <ul id="trueULid"></ul> 加载tree <script type="text/ ...
- 前端MVVM框架avalon - 模型转换1
轻量级前端MVVM框架avalon - 模型转换(一) 接上一章 ViewModel modelFactory工厂是如何加工用户定义的VM? 附源码 洋洋洒洒100多行内部是魔幻般的实现 1: fun ...