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#畅谈“网络电视”的更多相关文章

  1. 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目

    小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...

  2. 见见面、聊聊天 - 5月22日晚7点Meetup,三里屯绿树旁酒吧,畅谈云技术和应用

    总是邮件.QQ什么的线上聊,让我们见面吧,不怕见光死,呵呵.   我和同事会先抛砖引玉,给大家介绍一下Autodesk几款最新的云技术和解决方案,然后大家就可畅所欲言,自由交流.来自五湖四海的人,为了 ...

  3. 基于vitamio的网络电视直播源码

    这个项目是基于vitamio的网络电视直播源码,也是一个使用了vitamio的基于安卓的网络直播项目源码,可能现在网上已经有很多类似这样的视频播放应用了,不过这个还是相对来说比较完整的,希望这个案例能 ...

  4. 初识XML及简单工厂运用--网络电视精灵

    网络电视精灵 任务描述 1. 解析XML文件中的数据 三个简单的xml文件; <?xml version="1.0" encoding="utf-8" ? ...

  5. MAC 下使用ipv6、ipv4观看电视、网络电视

      换了mac book,ipv6电视却看不了了,为了看电视,只要自己动手了. 关于ipv6是啥和哪里有ipv6这里就不说了,找度娘吧. 我们观看IPv6视频直播信号有两种,一种是mms协议,另外一种 ...

  6. 继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析

    网络电视精灵 项目运行状态如图: 项目完成后的类: 首先,将程序分为二部分进行: 一:TreeView节点内容的设计及编写: 1.1遍写XML文件:管理(FullChannels.xml),A类电视台 ...

  7. 【转】2012年6月26 – PPS网络电视PHP工程师最新面试题

    每一次面试都是一场较量,和面试官,更是和你自己! 前言:虽然面试职位是PHP工程师,但题目仅绝非限于PHP,甚至都没有多少PHP的题!inner peace!希望能给你带了一丝帮助. PPS网络电视面 ...

  8. 基于vitamio的网络电视直播源代码

    这个项目是基于vitamio的网络电视直播源代码.也是一个使用了vitamio的基于安卓的网络直播项目源代码,可能如今网上已经有非常多类似这种视频播放应用了.只是这个还是相对来说比較完整的,希望这个案 ...

  9. 京东云、新浪微博等专家畅谈Docker未来格局:开放与竞争(下)

    在上次推送的文章中(传送门),田琪老师分享了他的DockerCon 2015峰会见闻.在“QCon高可用架构群”中,田老师分享之后,几位专家也参与了讨论.他们是: 闫国旗:京东资深架构师,京东架构技术 ...

随机推荐

  1. 编译内核出错:invalid option `abi=aapcs-linux' 解决办法

    出现此问题的原因是由于kernel feature中选中了Use the ARM EABIto compile the kernel引起的,有两各解决办法: 1)换编译器为arm-linux-gcc ...

  2. unity3d中脚本生命周期(MonoBehaviour lifecycle)

    最近在做一个小示例,发现类继承于MonoBehaviour的类,有很多个方法,于是乎必然要问出一个问题:这么多个方法,执行先后顺序是如何的呢?内部是如何进行管理的呢?于是在网上找了许多资料,发现了Ri ...

  3. 单例模式在Unity中的应用

    起因:每个游戏场景中都会有许多的游戏对象,而各个游戏场景之间也是同等的关系.如何去管理它们,是我们要解决的问题. 场景中各脚本间的直接访问,会在各脚本间形成一个巨大而又混乱的网络,这给以后代码的维护带 ...

  4. 硬盘IO,SAS,SATA,和HD TUNE

    SAS的接口技术可以向下兼容SATA.具体来说,二者的兼容性主要体现在物理层和协议层的兼容. SAS系统的背板(Backplane)既可以连接具有双端口.高性能的SAS驱动器,也可以连接高容量.低成本 ...

  5. oracle中的exists 和not exists 用法详解(转)

    有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; ...

  6. aix ipcs使用说明

    ipcs: -q   Writes information about active message queues -o             Writes the following usage ...

  7. 数学(线性规划): ZJOI2013 防守战线

    偷懒用的线性规划. #include <iostream> #include <cstring> #include <cstdio> using namespace ...

  8. Apache-Tika解析XML文档

    通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理XML格式的文章,如下: package com.mengyao.tika.app; im ...

  9. How many ways?? - hdu2157(矩阵快速幂-模板)

    分析:求Map^k,刚开始没有用快速幂,TLE了   代码如下: =================================================================== ...

  10. SQL随笔

    多表分页查询: ,; 向表中插入新的字段: ALTER TABLE `Table_name` ) NOT NULL DEFAULT '' AFTER `id`;  更新表数据: UPDATE [LOW ...