C#畅谈“网络电视”
C#畅谈“网络电视”
以上是大家比较喜欢的网络电视软件,例如:PPTV,BOX央视影音,PPS等。
今天我就和大家来聊一下简单的“网络电视”。虽然和上边的软件没发比,但是正在向着这个目标努力中……
一开始我在做这个项目的时候思路很茫然,就像地上的一团线团一样。
我需要用到哪些方法?需要建几个类?
拿到一个项目的时候首先要分析我想大家都知道
主界面如下:
既然是网络电视,那么肯定有很多的频道供用户去选择。所以肯定有频道类,要定义一个频道的基类(ChannelBase),让所有频道类继承这个基类,提高抽象程度会更方便一些。
频道管理类(ChannelManager)也是必不可少的,要不怎么去管理那么多的频道呢!
选择频道,频道下面就会有节目,节目类也随之而来。
这里我定义了两个频道类(TypeAChannel类,TypeBChannel类),关系如下:
public class TypeAChannel:ChannelBase
public class TypeBChannel:ChannelBase
频道基类(ChannelBase)代码如下:
//频道基类
public abstract class ChannelBase
{
//频道名称
public string ChannelName { get; set; }
//频道路径
public string Path { get; set; }
//节目列表,该频道上的所有节目列表
public List<TvProgram> TvList { get; set; }
//获取频道列表:通过Fetch方法获取该频道拥有的所有节目列表
public abstract void Fetch();
//频道类型
public string Type { get; set; }
}
节目类(TvProgram)代码如下:
//节目类
public class TvProgram
{
//播出时间
public DateTime PlayTime { get; set; }
//早间档,午间档,晚间档
public string Shiduan { get; set; }
//节目名称
public string ProgramName { get; set; }
//视频路径
public string Path { get; set; }
}
接下来可以着手绑定treeView了。
首先先添加根节点:
private void LoadRootNode()
{
TreeNode mineNode = new TreeNode();
mineNode.Text = "我的电视台"; allNode.Text = "所有电视台"; treeView1.Nodes.Add(mineNode);
treeView1.Nodes.Add(allNode);
}
treeView里代码如下:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode selectNode = treeView1.SelectedNode;
if (selectNode.Level== && selectNode.Parent.Text=="所有电视台")
{
ChannelBase channel = (ChannelBase)selectNode.Tag;
channel.Fetch(); List<TvProgram> ProList = channel.TvList;
dataGridView1.DataSource = ProList;
}
}
接下来把LoadRootNode()方法在Load中调用一下:
private void Form1_Load(object sender, EventArgs e)
{
LoadRootNode();
ChannelManager manager = new ChannelManager();
manager.PareseXML();
Dictionary<string,ChannelBase> dic=manager.FullChannel;
foreach (var channel in dic.Values)
{
TreeNode tn = new TreeNode();
tn.Text = channel.ChannelName;
tn.Tag = channel;
allNode.Nodes.Add(tn);
}
}
到这里treeView已经绑定完成了,那么我上边是不是犯了一个小错误呢?会导致什么后果?
没错,相信大家都猜到了,我在调用Fetch()方法之前,节目列表没有清除,可以用下面的方法:
if (channel.TvList != null)
{
channel.TvList.Clear();
}
正确的代码如下:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
TreeNode selectNode = treeView1.SelectedNode;
if (selectNode.Level== && selectNode.Parent.Text=="所有电视台")
{
ChannelBase channel = (ChannelBase)selectNode.Tag;
if (channel.TvList != null)
{
channel.TvList.Clear();
}
channel.Fetch(); List<TvProgram> ProList = channel.TvList;
dataGridView1.DataSource = ProList;
}
}
频道管理类:
//频道管理类
public class ChannelManager
{
public ChannelManager()
{
fullChannel = new Dictionary<string, ChannelBase>();
} private Dictionary<string, ChannelBase> fullChannel = new Dictionary<string, ChannelBase>();
public Dictionary<string, ChannelBase> FullChannel
{
get { return fullChannel; }
set { fullChannel = value; }
}
public void PareseXML()
{
XmlDocument doc = new XmlDocument();
doc.Load("FullChannels.xml");
XmlNode root = doc.DocumentElement;
foreach (XmlNode node in root.ChildNodes)
{
string type = node["channelType"].InnerText;
ChannelBase channel = ChannelFactory.CreatChannel(type);
channel.ChannelName = node["tvChannel"].InnerText;
channel.Path = node["path"].InnerText;
channel.Type = type; fullChannel.Add(channel.ChannelName,channel);
}
}
}
这里列举一个频道TypeAChannel类:
//A频道类
public class TypeAChannel:ChannelBase
{
//多态,覆盖父类的获取频道列表方法
public override void Fetch()
{
XmlDocument doc = new XmlDocument();
doc.Load("北京电视台.xml");
if (TvList == null)
{
TvList = new List<TvProgram>();
}
//获取根节点
XmlNode root = doc.DocumentElement;
foreach (XmlNode item in root.ChildNodes)
{
if (item.Name == "tvProgramTable")
{
foreach (XmlNode child in item.ChildNodes)
{
//一个item就是一个tvProgram节点
TvProgram program = new TvProgram();
program.PlayTime = Convert.ToDateTime(child["playTime"].InnerText);
program.Shiduan = child["meridien"].InnerText;
program.ProgramName = child["programName"].InnerText;
program.Path = child["path"].InnerText;
TvList.Add(program);
}
}
}
}
}
频道TypeBChannel类和TypeAChannel类一样。
至此基本功能已经完成,那么接下来大家也可以接着制作如下功能:
右键我的电视台下的频道会只有删除选项,右键所有电视台会只有加入我的电台选项。
那么还有提醒功能,就是用户可以设一个时间点,到时间了会提醒用户去收看,有兴趣的可以研究一下。
C#畅谈“网络电视”的更多相关文章
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- 见见面、聊聊天 - 5月22日晚7点Meetup,三里屯绿树旁酒吧,畅谈云技术和应用
总是邮件.QQ什么的线上聊,让我们见面吧,不怕见光死,呵呵. 我和同事会先抛砖引玉,给大家介绍一下Autodesk几款最新的云技术和解决方案,然后大家就可畅所欲言,自由交流.来自五湖四海的人,为了 ...
- 基于vitamio的网络电视直播源码
这个项目是基于vitamio的网络电视直播源码,也是一个使用了vitamio的基于安卓的网络直播项目源码,可能现在网上已经有很多类似这样的视频播放应用了,不过这个还是相对来说比较完整的,希望这个案例能 ...
- 初识XML及简单工厂运用--网络电视精灵
网络电视精灵 任务描述 1. 解析XML文件中的数据 三个简单的xml文件; <?xml version="1.0" encoding="utf-8" ? ...
- MAC 下使用ipv6、ipv4观看电视、网络电视
换了mac book,ipv6电视却看不了了,为了看电视,只要自己动手了. 关于ipv6是啥和哪里有ipv6这里就不说了,找度娘吧. 我们观看IPv6视频直播信号有两种,一种是mms协议,另外一种 ...
- 继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析
网络电视精灵 项目运行状态如图: 项目完成后的类: 首先,将程序分为二部分进行: 一:TreeView节点内容的设计及编写: 1.1遍写XML文件:管理(FullChannels.xml),A类电视台 ...
- 【转】2012年6月26 – PPS网络电视PHP工程师最新面试题
每一次面试都是一场较量,和面试官,更是和你自己! 前言:虽然面试职位是PHP工程师,但题目仅绝非限于PHP,甚至都没有多少PHP的题!inner peace!希望能给你带了一丝帮助. PPS网络电视面 ...
- 基于vitamio的网络电视直播源代码
这个项目是基于vitamio的网络电视直播源代码.也是一个使用了vitamio的基于安卓的网络直播项目源代码,可能如今网上已经有非常多类似这种视频播放应用了.只是这个还是相对来说比較完整的,希望这个案 ...
- 京东云、新浪微博等专家畅谈Docker未来格局:开放与竞争(下)
在上次推送的文章中(传送门),田琪老师分享了他的DockerCon 2015峰会见闻.在“QCon高可用架构群”中,田老师分享之后,几位专家也参与了讨论.他们是: 闫国旗:京东资深架构师,京东架构技术 ...
随机推荐
- [r]Setting up Django and your web server with uWSGI and nginx
Setting up Django and your web server with uWSGI and nginx This tutorial is aimed at the Django user ...
- Numpy基础笔记
Numpy简介 Numpy(Numerical Python的简称)是高性能科学计算和数据分析的基础包.其部分功能如下: ①ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组 ...
- Python 更改cmd中的字色
没有gui的python程序是在cmd窗口中运行的,黑色背景,灰色的字,确实很复古,不符合现代人的使用习惯-同事在用我写的小工具时,清一色的字色,看起来会没有重点性,因此我就想通过更改cmd中的字色来 ...
- ASP.NET关于引用bootstrap.css导致Gridview Header无法居中
HorizontalAlign="Center" 属性因不知名原因被覆盖掉. 可以使用<HeaderStyle CssClass="text-center&qu ...
- 关于Java(标识符规则)
Java 是大小写敏感的语言. Java 标识符组成 Java 标识符组成: 字母,数字,下划线和美元符 $ Java 标识符规则 仅包含 字母,数字,下划线和美元符 开头不能使数字 不能使 Java ...
- Rss web 工具 大对比
今天终于神受不了 feedly的链接死掉了..有时候挂代理就好了..但是麻烦. 于是: AOL reader Digg reader feedly 对比下.使用了一天 1.feedly 优: 效果最 ...
- (org.hibernate.LazyInitializationException:19) - could not initialize proxy错误
(org.hibernate.LazyInitializationException:19) - could not initialize proxy错误 在刚插入数据后,马上使用dao进行query ...
- wildcard 处理全部文件
Makefile如果想取得文件夹下全部文件 $(wildcard $(PATH)/*.c) 即可
- NYOJ 540
为了给学弟学妹讲课,我水了一道题…… import java.util.Arrays; import java.util.Scanner; public class NYOJ540 { public ...
- Squares<哈希>
Description A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-d ...