网络电视精灵
这篇文章的目的主要为了后续工作的使用,在这里对S2深入.NET平台和C#编程中贯穿案例《网络电视精灵》的部分实现代码进行思路剖析。
一.项目框架的搭建:
这个界面需要的控件MenuStrip、TreeView、TabControl、ListView、DataGridView。
思路分析:
1.创建对应的类
TvProgram:节目类
//节目单的类 public class TvProgram { //节目播出的时间 public DateTime PlayTime { get; set; } //时段 public String Meridiem { get; set; } //节目的名称 public string ProgramName { get; set; } //视频的路径 public string Path { get; set; } }
该类主要负责定义节目的属性,为后续从xml文件中读取的内容提供存放位置。
ChannelBase:频道基类
//频道类 public abstract class ChannelBase { //定义3个属性和一个方法 //节目的类型 public String Type { get; set; } //名字 public string ChannelName { get; set; } //存放的路径 public string Path { get; set; } //提供一个用于保存该节目的所有集合 public List<TvProgram> TvList { get; set; } //解析path对应的频道xml文件形成内存中的泛型 public abstract void Fetch(); }
TypeAChannel:A类频道
public class TypeAChannel:ChannelBase { public override void Fetch() { //解析xml文件将xml文件转换到lvlist中 if (TvList==null) { TvList = new List<TvProgram>(); } //将一次性读取内存中数据,形成一个大的字符串 XmlDocument doc = new XmlDocument(); doc.Load("files/北京电视台.xml"); //获取根节点 XmlNode root = doc.DocumentElement; foreach (XmlNode item in root.ChildNodes) { if (item.Name.Equals("tvProgramTable")) { //item的子节点里的东西 foreach (XmlNode child in item.ChildNodes) { //节目单 TvProgram tp = new TvProgram(); //节目播出时间 tp.PlayTime = Convert.ToDateTime(child["playTime"].InnerText); //时段 tp.Meridiem=child["meridien"].InnerText; //节目名称 tp.ProgramName=child["programName"].InnerText; //视频路径 tp.Path=child["path"].InnerText; //加载到tvlist中 TvList.Add(tp); } } } } }
TypeBChannel:B类频道
public class TypeBChannel:ChannelBase { public override void Fetch() { //如果这个listview等于空,就能new 节目单 if (TvList==null) { TvList = new List<TvProgram>(); } XmlDocument doc = new XmlDocument(); doc.Load("files/凤凰卫视.xml"); XmlNode root = doc.DocumentElement; foreach (XmlNode item in root.ChildNodes) { foreach (XmlNode child in item.ChildNodes) { TvProgram tp = new TvProgram(); tp.PlayTime = Convert.ToDateTime(child["playTime"].InnerText); tp.ProgramName=child["name"].InnerText; tp.Path=child["path"].InnerText; TvList.Add(tp); } } } }
ChannelFactory:工厂类
//工厂类 public class ChannelFactory { public static ChannelBase createChannel(string Type) { ChannelBase channel = null; switch (Type) { case"TypeA": channel = new TypeAChannel(); break; case "TypeB": channel = new TypeBChannel(); break; } return channel; } }
Mian窗体
public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } //解析北京电视台的节目单 public void InitDataToTreeview() { manager.ReadXmlToList(); List<ChannelBase> list = manager.FullChannels; foreach (ChannelBase item in list) { //每循环一次代表一个频道对item TreeNode tn = new TreeNode(); tn.Text = item.ChannelName; tn.Tag = item; tn2.Nodes.Add(tn); //MessageBox.Show(item.ChannelName); } } //管理 ChannelManager manager = new ChannelManager(); //本身为null TreeNode tn2; private void FrmMain_Load(object sender, EventArgs e) { TreeNode tn1 = new TreeNode("我的电视台"); tn2 = new TreeNode("所有电视台"); tvList.Nodes.Add(tn1); tvList.Nodes.Add(tn2); #region 之前节点加载的方法 ////添加节点 //TreeNode tn = new TreeNode("我的电视台"); //tvList.Nodes.Add(tn); //TreeNode te = new TreeNode("所有电视台"); //tvList.Nodes.Add(te); ////添加tn子节点 //TreeNode bj = new TreeNode("北京电视台"); //te.Nodes.Add(bj); //TreeNode fh = new TreeNode("蜂huandianshit"); #endregion //解析电视台的节目单 InitDataToTreeview(); //构造根节点==Tvlist } private void msList_ItemClicked(object sender, ToolStripItemClickedEventArgs e) { } private void tvList_AfterSelect(object sender, TreeViewEventArgs e) { //获取Tag的节点 TreeNode tn= tvList.SelectedNode; ChannelBase ChannelBase = (ChannelBase)tn.Tag; if (tn.Level==1) { ChannelBase.Fetch(); List <TvProgram> list= ChannelBase.TvList; DgvList.DataSource = list; } } }
还需要在添加files文件因为上边的的代码有在TypeA\BChannel的lei中要将xml文件转为集合里
FullChannels.xml
<?xml version="1.0" encoding="utf-8" ?> <TVChannels> <Channel> <channelType>TypeA</channelType> <!--频道编号--> <tvChannel>北京电视台</tvChannel> <!--频道名称--> <path>files/北京电视台.xml</path> <!--频道对应XML文件的本地路径--> </Channel> <Channel> <channelType>TypeB</channelType> <tvChannel>凤凰卫视</tvChannel> <path>files/凤凰卫视.xml</path> </Channel> </TVChannels>
北京电视台.xml
<?xml version="1.0" encoding="utf-8" ?> <typeA version =" 1.0"> <channelName>北京电视台</channelName> <tvProgramTable> <tvProgram> <playTime>2009-9-29 06:02</playTime> <!--节目播出时间--> <meridien>早间档</meridien> <!--时段--> <programName>重播:国际双行线</programName> <!--节目名称--> <path>c:\a.wma</path> <!--视频路径--> </tvProgram> <tvProgram> <playTime>2009-9-29 07:00</playTime> <!--节目播出时间--> <meridien>早间档</meridien> <!--时段--> <programName>北京您早</programName> <!--节目名称--> <path>C:\New Stories (Highway Blues).wma</path> <!--视频路径--> </tvProgram> <tvProgram> <playTime>2009-9-29 09:02</playTime> <!--节目播出时间--> <meridien>早间档</meridien> <!--时段--> <programName>重播《红星剧场》32集剧:勇者无敌(31)</programName> <!--节目名称--> <path>**</path> <!--视频路径--> </tvProgram> <tvProgram> <playTime>2009-9-29 09:58</playTime> <meridien>早间档</meridien> <programName>重播《红星剧场》32集剧:勇者无敌(32)</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 11:15</playTime> <meridien>午间档</meridien> <programName>重播:专题片:我爱你,中国(14)</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 11:58</playTime> <meridien>午间档</meridien> <programName>身边</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 12:30</playTime> <meridien>午间档</meridien> <programName>特别关注</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 13:05</playTime> <meridien>午间档</meridien> <programName>天下天天谈</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 13:40</playTime> <meridien>午间档</meridien> <programName>《玫瑰剧场》55集剧:闯关东中篇(21)</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 14:32</playTime> <meridien>午间档</meridien> <programName>《玫瑰剧场》55集剧:闯关东中篇(22)</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 15:27</playTime> <meridien>下午档</meridien> <programName>《玫瑰剧场》55集剧:闯关东中篇(23)</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 16:19</playTime> <meridien>下午档</meridien> <programName>《玫瑰剧场》55集剧:闯关东中篇(24)</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 17:31</playTime> <meridien>下午档</meridien> <programName>法治进行时</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 18:00</playTime> <meridien>晚间档</meridien> <programName>新闻晚高峰</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 18:30</playTime> <meridien>晚间档</meridien> <programName>北京新闻</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 18:56</playTime> <meridien>晚间档</meridien> <programName>天气预报</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 19:00</playTime> <meridien>晚间档</meridien> <programName>转播CCTV新闻联播</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 19:31</playTime> <meridien>晚间档</meridien> <programName>看气象</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 19:40</playTime> <meridien>晚间档</meridien> <programName>专题片:我爱你,中国(15)</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 20:22</playTime> <meridien>晚间档</meridien> <programName>《爸妈都是老党员》首播庆典</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 21:21</playTime> <meridien>晚间档</meridien> <programName>《红星剧场》38集剧:咱爸咱妈六十年(1)</programName> <path>**</path> </tvProgram> <tvProgram> <playTime>2009-9-29 23:25</playTime> <meridien>晚间档</meridien> <programName>重播文艺:花样年华歌舞大赛(5)</programName> <path>**</path> </tvProgram> </tvProgramTable> </typeA>
凤凰卫视.xml
<?xml version="1.0" encoding="utf-8" ?> <typeB version =" 1.0"> <ProgramList> <Program> <playTime>2009-9-29 01:30</playTime> <!--播出时间--> <name>简单工厂模式</name> <!--节目名称--> <path>D:\简单工厂模式.wmv</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 02:10</playTime> <!--播出时间--> <name>非凡人物论成功(713)</name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 02:15</playTime> <!--播出时间--> <name>有报天天读(28/09/09) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 02:40</playTime> <!--播出时间--> <name>娱乐大风暴(682) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 03:15</playTime> <!--播出时间--> <name>上海新长宁集团特约之2009中华小姐环球大赛-美丽前奏(41) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 03:20</playTime> <!--播出时间--> <name>完全时尚手册:天桥云裳(632) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 03:40</playTime> <!--播出时间--> <name>东风康明斯凤凰冲击播:天力士特约之今日看世界(39) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 04:25</playTime> <!--播出时间--> <name>音乐中国风(442) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 04:35</playTime> <!--播出时间--> <name>维维健康新概念(193) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 04:40</playTime> <!--播出时间--> <name>红牛凤凰全球连线(28/09/09) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 05:05</playTime> <!--播出时间--> <name>红云红河时事开讲(28/09/09) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> <Program> <playTime>2009-9-29 05:30</playTime> <!--播出时间--> <name>别巡检调查队(34)(R) </name> <!--节目名称--> <path>**</path> <!--节目视频的本地路径--> </Program> </ProgramList> </typeB>
未完待续......请等待......