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高可用架构群”中,田老师分享之后,几位专家也参与了讨论.他们是: 闫国旗:京东资深架构师,京东架构技术 ...
随机推荐
- python学习的一些感悟
首先声明,这里用到的库是在coursera上学习时,老师建立的一个库 #timer import simplegui import random # global state message = &q ...
- 关于C#的委托
作者 陈嘉栋(慕容小匹夫) 阅读目录 0x00 前言 0x01 从观察者模式说起 0x02 向Unity3D中的SendMessage和BroadcastMessage说拜拜 0x03 认识回调函数 ...
- Expert Shell Scripting
Expert Shell Scripting 好好学习这本书
- 23个经典JDK设计模式(转)
下面是JDK中有关23个经典设计模式的示例: Structural(结构模式) Adapter: 把一个接口或是类变成另外一种. o ● java.util.Arrays#asList() o ...
- android如何获取默认的桌面程序
[方法1] http://stackoverflow.com/questions/12594192/remove-activity-as-default-launcher/12594332#12594 ...
- js eval()函数 接收一个字符串,做为js代码来执行。 如: s='var d="kaka"'; 或者s=‘function (code){return code }’;
eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法“{}”并不能返回一个值, ...
- ikely()与unlikely() 都等同于if, 此处只是做编译优化
ikely()与unlikely()在2.6内核中,随处可见,那为什么要用它们?它们之间有什么区别呢? 首先明确: if (likely(value))等价于if (value)if (likely( ...
- 在线LCA模板
在线LCA 如求A,B两点的LCA,先计算出各个结点的深度d[],然后,通过递推公式求出各个结点的2次方倍的祖先p[],假设d[A] > d[B],则找到d[p[A][i]] == d[B]也就 ...
- Python操作Excel_输出所有内容(包含中文)
python 2.7.5代码: # coding=utf-8 import sys import xlrd data=xlrd.open_workbook('D:\\menu.xls') table ...
- IGeometry 中取指定的点
private static IGeometryCollection MakeMultiPoint(IGeometry geometry,int pointcount) { IGeo ...