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. psql rank row

    rank() OVER (PARTITION BY f1 ORDER BY f2 DESC) ROW_NUMBER() () OVER (PARTITION BY f1 ORDER BY f2 DES ...

  2. Mvc 页面缓存 OutputCache VaryByCustom

    优化网站,dotNet MVC 可以通过(OutputCache)特性在某些Action上使用缓存,如果我们想要自定义缓存依据可以通过如下方式进行: 第一步, 在 global.asax.cs 文件中 ...

  3. jQuery取CSS的HEX(16位)颜色值

    //IE10以上版本.CHROME.FIREFOX中GRB颜色转HEX颜色值 $.fn.getBackgroundColor = function() { var rgb = $(this).css( ...

  4. Ombrophobic Bovines

    poj2391:http://poj.org/problem?id=2391 题意:一个人有n个农场,每个农场都一个避雨的地方,每个农场有一些牛,每个避雨的地方能容纳牛的数量是有限的.农场之间有一些道 ...

  5. cortex m0 lpc1114的NVIC中断如何使用

    LPC1114单片机的NVIC中断函数,有开中断.关中断.设置优先级.挂起等操作函数.这些函数位于core_cm0.h文件里面.比如开中断的函数如下: /** \brief Enable Extern ...

  6. UpdateLayeredWindow是炫效果的关键

    自绘——是的,输入框每个字都自己绘制,计算行宽,行高,模拟光标闪烁,处理输入法的各种事件,以及选中,拖动等功能. 支持支持一下,实际上无句柄的,就是多行富文本编辑比较麻烦,其他的,都不复杂.很容易实现 ...

  7. 【转】[Java] HashMap使用的示例

    原文网址:http://kings11347.blog.163.com/blog/static/56047032201212895416436/ import java.util.HashMap; i ...

  8. IIS7.0出错的解决方案 IIS 状态代码:IIS详细错误代码以及解释

    一.请求筛选模块被配置为拒绝包含双重转义序列的请求.HTTP 错误 404.11 - Not Found   1.单击 开始 . 在 开始搜索 框中, 键入 Notepad. 右击 记事本 , 然后单 ...

  9. App自动更新之通知栏下载

    见证过博客园的多次升级,你也希望你的软件通过更新发布新特性通知用户吧,是的.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.设计思路,使用Versio ...

  10. datagridview bindingsource

    调用bindindsource的ResetBindings() 方法