博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#畅谈“网络电视”
阅读量:4576 次
发布时间:2019-06-08

本文共 6039 字,大约阅读时间需要 20 分钟。

C#畅谈“网络电视”

以上是大家比较喜欢的网络电视软件,例如:PPTV,BOX央视影音,PPS等。

今天我就和大家来聊一下简单的“网络电视”。虽然和上边的软件没发比,但是正在向着这个目标努力中……

 

一开始我在做这个项目的时候思路很茫然,就像地上的一团线团一样。

我需要用到哪些方法?需要建几个类?

拿到一个项目的时候首先要分析我想大家都知道

主界面如下:

既然是网络电视,那么肯定有很多的频道供用户去选择。所以肯定有频道类,要定义一个频道的基类(ChannelBase),让所有频道类继承这个基类,提高抽象程度会更方便一些。

频道管理类(ChannelManager)也是必不可少的,要不怎么去管理那么多的频道呢!

选择频道,频道下面就会有节目,节目类也随之而来。

这里我定义了两个频道类(TypeAChannel类,TypeBChannel类),关系如下:

1 public class TypeAChannel:ChannelBase
1 public class TypeBChannel:ChannelBase

 

频道基类(ChannelBase)代码如下:

1 //频道基类 2     public abstract class ChannelBase 3     { 4         //频道名称 5         public string ChannelName { get; set; } 6         //频道路径 7         public string Path { get; set; } 8         //节目列表,该频道上的所有节目列表 9         public List
TvList { get; set; }10 //获取频道列表:通过Fetch方法获取该频道拥有的所有节目列表11 public abstract void Fetch();12 //频道类型13 public string Type { get; set; }14 }

 

节目类(TvProgram)代码如下:

1 //节目类 2     public class TvProgram 3     { 4         //播出时间 5         public DateTime PlayTime { get; set; } 6         //早间档,午间档,晚间档 7         public string Shiduan { get; set; } 8         //节目名称 9         public string ProgramName { get; set; }10         //视频路径11         public string Path { get; set; }12     }

 

接下来可以着手绑定treeView了。

首先先添加根节点:

1         private void LoadRootNode()  2         { 3             TreeNode mineNode = new TreeNode(); 4             mineNode.Text = "我的电视台"; 5  6             allNode.Text = "所有电视台"; 7  8             treeView1.Nodes.Add(mineNode); 9             treeView1.Nodes.Add(allNode);10         }

 

treeView里代码如下:

1 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 2         { 3             TreeNode selectNode = treeView1.SelectedNode; 4             if (selectNode.Level==1 && selectNode.Parent.Text=="所有电视台") 5             { 6                 ChannelBase channel = (ChannelBase)selectNode.Tag; 7                 channel.Fetch(); 8  9                 List
ProList = channel.TvList;10 dataGridView1.DataSource = ProList;11 }12 }

 

 

接下来把LoadRootNode()方法在Load中调用一下:

1 private void Form1_Load(object sender, EventArgs e) 2         { 3             LoadRootNode(); 4             ChannelManager manager = new ChannelManager(); 5             manager.PareseXML(); 6             Dictionary
dic=manager.FullChannel; 7 foreach (var channel in dic.Values) 8 { 9 TreeNode tn = new TreeNode();10 tn.Text = channel.ChannelName;11 tn.Tag = channel;12 allNode.Nodes.Add(tn);13 }14 }

 

到这里treeView已经绑定完成了,那么我上边是不是犯了一个小错误呢?会导致什么后果?

 

没错,相信大家都猜到了,我在调用Fetch()方法之前,节目列表没有清除,可以用下面的方法:

1                 if (channel.TvList != null)2                 {3                     channel.TvList.Clear();4                 }

 

正确的代码如下:

1 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 2         { 3             TreeNode selectNode = treeView1.SelectedNode; 4             if (selectNode.Level==1 && selectNode.Parent.Text=="所有电视台") 5             { 6                 ChannelBase channel = (ChannelBase)selectNode.Tag; 7                 if (channel.TvList != null) 8                 { 9                     channel.TvList.Clear();10                 }11                 channel.Fetch();12 13                 List
ProList = channel.TvList;14 dataGridView1.DataSource = ProList;15 }16 }

 

频道管理类:

1 //频道管理类 2     public class ChannelManager 3     { 4         public ChannelManager() 5         { 6             fullChannel = new Dictionary
(); 7 } 8 9 private Dictionary
fullChannel = new Dictionary
();10 public Dictionary
FullChannel11 {12 get { return fullChannel; }13 set { fullChannel = value; }14 }15 public void PareseXML() 16 {17 XmlDocument doc = new XmlDocument();18 doc.Load("FullChannels.xml");19 XmlNode root = doc.DocumentElement;20 foreach (XmlNode node in root.ChildNodes)21 {22 string type = node["channelType"].InnerText;23 ChannelBase channel = ChannelFactory.CreatChannel(type);24 channel.ChannelName = node["tvChannel"].InnerText;25 channel.Path = node["path"].InnerText;26 channel.Type = type;27 28 fullChannel.Add(channel.ChannelName,channel);29 }30 }31 }

 

这里列举一个频道TypeAChannel类:

1 //A频道类 2     public class TypeAChannel:ChannelBase 3     { 4         //多态,覆盖父类的获取频道列表方法 5         public override void Fetch() 6         { 7             XmlDocument doc = new XmlDocument(); 8             doc.Load("北京电视台.xml"); 9             if (TvList == null)10             {11                 TvList = new List
();12 }13 //获取根节点14 XmlNode root = doc.DocumentElement;15 foreach (XmlNode item in root.ChildNodes)16 {17 if (item.Name == "tvProgramTable")18 {19 foreach (XmlNode child in item.ChildNodes)20 {21 //一个item就是一个tvProgram节点22 TvProgram program = new TvProgram();23 program.PlayTime = Convert.ToDateTime(child["playTime"].InnerText);24 program.Shiduan = child["meridien"].InnerText;25 program.ProgramName = child["programName"].InnerText;26 program.Path = child["path"].InnerText;27 TvList.Add(program);28 }29 }30 }31 }32 }

 

频道TypeBChannel类和TypeAChannel类一样。

至此基本功能已经完成,那么接下来大家也可以接着制作如下功能:

右键我的电视台下的频道会只有删除选项,右键所有电视台会只有加入我的电台选项。

那么还有提醒功能,就是用户可以设一个时间点,到时间了会提醒用户去收看,有兴趣的可以研究一下。

 

转载于:https://www.cnblogs.com/wcf6676/p/4649482.html

你可能感兴趣的文章
mybatis中parameterType可以写的别名
查看>>
并查集练习2(带权并查集)
查看>>
[luogu1972][bzoj1878][SDOI2009]HH的项链【莫队+玄学卡常】
查看>>
钢材销售系统1
查看>>
CSS居中布局总结
查看>>
NET_.NET深入体验与实战精要 第一章
查看>>
Android toolbar menu 字体点击样式
查看>>
实验一
查看>>
CCF——相邻数对201409-1
查看>>
JsBom
查看>>
re模块的使用
查看>>
继承和对象指针
查看>>
tkinter第三章(单选和多选)RadioButton CheckButton
查看>>
fedora yum源设置
查看>>
Linux服务器redhat配置本地yum源
查看>>
C#类型转换
查看>>
SignalRMvc的简单例子
查看>>
python 元组 【基本使用功能】
查看>>
ecplise 使用快捷键
查看>>
微信emoji表情编码 、MySQL 存储 emoji 表情符号字符集
查看>>