C#畅谈“网络电视”
以上是大家比较喜欢的网络电视软件,例如:PPTV,BOX央视影音,PPS等。
今天我就和大家来聊一下简单的“网络电视”。虽然和上边的软件没发比,但是正在向着这个目标努力中……
一开始我在做这个项目的时候思路很茫然,就像地上的一团线团一样。
我需要用到哪些方法?需要建几个类?
拿到一个项目的时候首先要分析我想大家都知道
主界面如下:
既然是网络电视,那么肯定有很多的频道供用户去选择。所以肯定有频道类,要定义一个频道的基类(ChannelBase),让所有频道类继承这个基类,提高抽象程度会更方便一些。
频道管理类(ChannelManager)也是必不可少的,要不怎么去管理那么多的频道呢!
选择频道,频道下面就会有节目,节目类也随之而来。
这里我定义了两个频道类(TypeAChannel类,TypeBChannel类),关系如下:
1publicclassTypeAChannel:ChannelBase
1publicclassTypeBChannel:ChannelBase
频道基类(ChannelBase)代码如下:
1//频道基类2publicabstractclassChannelBase3{4//频道名称5publicstringChannelName {get;set; }6//频道路径7publicstringPath {get;set; }8//节目列表,该频道上的所有节目列表9publicList<TvPRogram> TvList {get;set; }10//获取频道列表:通过Fetch方法获取该频道拥有的所有节目列表11publicabstractvoidFetch();12//频道类型13publicstringType {get;set; }14}
节目类(TvProgram)代码如下:
1//节目类2publicclassTvProgram3{4//播出时间5publicDateTime PlayTime {get;set; }6//早间档,午间档,晚间档7publicstringShiduan {get;set; }8//节目名称9publicstringProgramName {get;set; }10//视频路径11publicstringPath {get;set; }12}
接下来可以着手绑定treeView了。
首先先添加根节点:
1privatevoidLoadRootNode()2{3TreeNode mineNode =newTreeNode();4mineNode.Text ="我的电视台";56allNode.Text ="所有电视台";78treeView1.Nodes.Add(mineNode);9treeView1.Nodes.Add(allNode);10}
treeView里代码如下:
1privatevoidtreeView1_AfterSelect(objectsender, TreeViewEventArgs e)2{3TreeNode selectNode =treeView1.SelectedNode;4if(selectNode.Level==1&& selectNode.Parent.Text=="所有电视台")5{6ChannelBase channel =(ChannelBase)selectNode.Tag;7channel.Fetch();89List<TvProgram> ProList =channel.TvList;10dataGridView1.DataSource =ProList;11}12}
接下来把LoadRootNode()方法在Load中调用一下:
1privatevoidForm1_Load(objectsender, EventArgs e)2{3LoadRootNode();4ChannelManager manager =newChannelManager();5manager.Paresexml();6Dictionary<string,ChannelBase> dic=manager.FullChannel;7foreach(varchannelindic.Values)8{9TreeNode tn =newTreeNode();10tn.Text =channel.ChannelName;11tn.Tag =channel;12allNode.Nodes.Add(tn);13}14}
到这里treeView已经绑定完成了,那么我上边是不是犯了一个小错误呢?会导致什么后果?
没错,相信大家都猜到了,我在调用Fetch()方法之前,节目列表没有清除,可以用下面的方法:
1if(channel.TvList !=null)2{3channel.TvList.Clear();4}
正确的代码如下:
1privatevoidtreeView1_AfterSelect(objectsender, TreeViewEventArgs e)2{3TreeNode selectNode =treeView1.SelectedNode;4if(selectNode.Level==1&& selectNode.Parent.Text=="所有电视台")5{6ChannelBase channel =(ChannelBase)selectNode.Tag;7if(channel.TvList !=null)8{9channel.TvList.Clear();10}11channel.Fetch();1213List<TvProgram> ProList =channel.TvList;14dataGridView1.DataSource =ProList;15}16}
频道管理类:
1//频道管理类2publicclassChannelManager3{4publicChannelManager()5{6fullChannel =newDictionary<string, ChannelBase>();7}89privateDictionary<string, ChannelBase> fullChannel =newDictionary<string, ChannelBase>();10publicDictionary<string, ChannelBase>FullChannel11{12get{returnfullChannel; }13set{ fullChannel =value; }14}15publicvoidPareseXML()16{17XmlDocument doc =newXmlDocument();18doc.Load("FullChannels.xml");19XmlNode root =doc.DocumentElement;20foreach(XmlNode nodeinroot.ChildNodes)21{22stringtype = node["channelType"].InnerText;23ChannelBase channel =ChannelFactory.CreatChannel(type);24channel.ChannelName = node["tvChannel"].InnerText;25channel.Path = node["path"].InnerText;26channel.Type =type;2728fullChannel.Add(channel.ChannelName,channel);29}30}31}
这里列举一个频道TypeAChannel类:
1//A频道类2publicclassTypeAChannel:ChannelBase3{4//多态,覆盖父类的获取频道列表方法5publicoverridevoidFetch()6{7XmlDocument doc =newXmlDocument();8doc.Load("北京电视台.xml");9if(TvList ==null)10{11TvList =newList<TvProgram>();12}13//获取根节点14XmlNode root =doc.DocumentElement;15foreach(XmlNode iteminroot.ChildNodes)16{17if(item.Name =="tvProgramTable")18{19foreach(XmlNode childinitem.ChildNodes)20{21//一个item就是一个tvProgram节点22TvProgram program =newTvProgram();23program.PlayTime = Convert.ToDateTime(child["playTime"].InnerText);24program.Shiduan = child["meridien"].InnerText;25program.ProgramName = child["programName"].InnerText;26program.Path = child["path"].InnerText;27TvList.Add(program);28}29}30}31}32}
频道TypeBChannel类和TypeAChannel类一样。
至此基本功能已经完成,那么接下来大家也可以接着制作如下功能:
右键我的电视台下的频道会只有删除选项,右键所有电视台会只有加入我的电台选项。
那么还有提醒功能,就是用户可以设一个时间点,到时间了会提醒用户去收看,有兴趣的可以研究一下。