网络电视精灵

窗体样本:

XML文件

*存储频道信息

 
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <TVChannels>  
  3.     <Channel>  
  4.         <channelType>TypeA</channelType<!--频道类型-->  
  5.         <tvChannel>北京电视台</tvChannel<!--频道名称-->  
  6.         <path>files/北京电视台.xml</path>  <!--频道对应XML文件的本地路径-->  
  7.     </Channel>  
  8.     <Channel>  
  9.         <channelType>TypeB</channelType>  
  10.         <tvChannel>凤凰卫视</tvChannel>  
  11.         <path>files/凤凰卫视.xml</path>  
  12.     </Channel>  
  13. </TVChannels>  
  14.       
<?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>
	

*北京电视台

[html] view plain copy
 
print?
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <typeA version =" 1.0">  
  3.     <channelName>北京电视台</channelName>  
  4.     <tvProgramTable>  
  5.         <tvProgram>  
  6.             <playTime>2013-9-29 06:02</playTime<!--节目播出时间-->  
  7.             <meridien>早间档</meridien<!--时段-->         
  8.             <programName>重播:国际双行线</programName<!--节目名称-->  
  9.             <path>c:\a.wma</path>         <!--视频路径-->  
  10.         </tvProgram>  
  11.         <tvProgram>  
  12.             <playTime>2013-9-29 07:00</playTime<!--节目播出时间-->  
  13.             <meridien>早间档</meridien<!--时段-->  
  14.             <programName>北京您早</programName<!--节目名称-->  
  15.             <path>C:\New Stories (Highway Blues).wma</path>         <!--视频路径-->  
  16.         </tvProgram>  
  17.         <tvProgram>  
  18.             <playTime>2013-9-29 09:02</playTime<!--节目播出时间-->  
  19.             <meridien>早间档</meridien<!--时段-->     
  20.             <programName>重播《红星剧场》32集剧:勇者无敌(31)</programName<!--节目名称-->  
  21.             <path>**</path>         <!--视频路径-->  
  22.         </tvProgram>  
  23.         <tvProgram>  
  24.             <playTime>2013-9-29 09:58</playTime>  
  25.             <meridien>早间档</meridien>  
  26.             <programName>重播《红星剧场》32集剧:勇者无敌(32)</programName>  
  27.             <path>**</path>  
  28.         </tvProgram>  
  29.         <tvProgram>  
  30.             <playTime>2013-9-29 11:15</playTime>  
  31.             <meridien>午间档</meridien>  
  32.             <programName>重播:专题片:我爱你,中国(14)</programName>  
  33.             <path>**</path>  
  34.         </tvProgram>  
  35.         <tvProgram>  
  36.             <playTime>2013-9-29 11:58</playTime>  
  37.             <meridien>午间档</meridien>  
  38.             <programName>身边</programName>  
  39.             <path>**</path>  
  40.         </tvProgram>  
  41.         <tvProgram>  
  42.             <playTime>2013-9-29 12:30</playTime>  
  43.             <meridien>午间档</meridien>  
  44.             <programName>特别关注</programName>  
  45.             <path>**</path>  
  46.         </tvProgram>  
  47.         <tvProgram>  
  48.             <playTime>2013-9-29 13:05</playTime>  
  49.             <meridien>午间档</meridien>  
  50.             <programName>天下天天谈</programName>  
  51.             <path>**</path>  
  52.         </tvProgram>  
  53.         <tvProgram>  
  54.             <playTime>2013-9-29 13:40</playTime>  
  55.             <meridien>午间档</meridien>  
  56.             <programName>《玫瑰剧场》55集剧:闯关东中篇(21)</programName>  
  57.             <path>**</path>  
  58.         </tvProgram>  
  59.         <tvProgram>  
  60.             <playTime>2013-9-29 14:32</playTime>  
  61.             <meridien>午间档</meridien>  
  62.             <programName>《玫瑰剧场》55集剧:闯关东中篇(22)</programName>  
  63.             <path>**</path>  
  64.         </tvProgram>  
  65.         <tvProgram>  
  66.             <playTime>2013-9-29 15:27</playTime>  
  67.             <meridien>下午档</meridien>  
  68.             <programName>《玫瑰剧场》55集剧:闯关东中篇(23)</programName>  
  69.             <path>**</path>  
  70.         </tvProgram>  
  71.         <tvProgram>  
  72.             <playTime>2013-9-29 16:19</playTime>  
  73.             <meridien>下午档</meridien>  
  74.             <programName>《玫瑰剧场》55集剧:闯关东中篇(24)</programName>  
  75.             <path>**</path>  
  76.         </tvProgram>  
  77.         <tvProgram>  
  78.             <playTime>2013-9-29 17:31</playTime>  
  79.             <meridien>下午档</meridien>  
  80.             <programName>法治进行时</programName>  
  81.             <path>**</path>  
  82.         </tvProgram>  
  83.         <tvProgram>  
  84.             <playTime>2013-9-29 18:00</playTime>  
  85.             <meridien>晚间档</meridien>  
  86.             <programName>新闻晚高峰</programName>  
  87.             <path>**</path>  
  88.         </tvProgram>  
  89.         <tvProgram>  
  90.             <playTime>2013-9-29 18:30</playTime>  
  91.             <meridien>晚间档</meridien>  
  92.             <programName>北京新闻</programName>  
  93.             <path>**</path>  
  94.         </tvProgram>  
  95.         <tvProgram>  
  96.             <playTime>2013-9-29 18:56</playTime>  
  97.             <meridien>晚间档</meridien>  
  98.             <programName>天气预报</programName>  
  99.             <path>**</path>  
  100.         </tvProgram>  
  101.         <tvProgram>  
  102.             <playTime>2013-9-29 19:00</playTime>  
  103.             <meridien>晚间档</meridien>  
  104.             <programName>转播CCTV新闻联播</programName>  
  105.             <path>**</path>  
  106.         </tvProgram>  
  107.         <tvProgram>  
  108.             <playTime>2013-9-29 19:31</playTime>  
  109.             <meridien>晚间档</meridien>  
  110.             <programName>看气象</programName>  
  111.             <path>**</path>  
  112.         </tvProgram>  
  113.         <tvProgram>  
  114.             <playTime>2013-9-29 19:40</playTime>  
  115.             <meridien>晚间档</meridien>  
  116.             <programName>专题片:我爱你,中国(15)</programName>  
  117.             <path>**</path>  
  118.         </tvProgram>  
  119.         <tvProgram>  
  120.             <playTime>2013-9-29 20:22</playTime>  
  121.             <meridien>晚间档</meridien>  
  122.             <programName>《爸妈都是老党员》首播庆典</programName>  
  123.             <path>**</path>  
  124.         </tvProgram>  
  125.         <tvProgram>  
  126.             <playTime>2013-9-29 21:21</playTime>  
  127.             <meridien>晚间档</meridien>  
  128.             <programName>《红星剧场》38集剧:咱爸咱妈六十年(1)</programName>  
  129.             <path>**</path>  
  130.         </tvProgram>  
  131.         <tvProgram>  
  132.             <playTime>2013-9-29 23:25</playTime>  
  133.             <meridien>晚间档</meridien>  
  134.             <programName>重播文艺:花样年华歌舞大赛(5)</programName>  
  135.             <path>**</path>  
  136.         </tvProgram>  
  137.     </tvProgramTable>  
  138. </typeA>  
<?xml version="1.0" encoding="utf-8" ?>
<typeA version =" 1.0">
    <channelName>北京电视台</channelName>
	<tvProgramTable>
		<tvProgram>
			<playTime>2013-9-29 06:02</playTime> <!--节目播出时间-->
			<meridien>早间档</meridien> <!--时段-->       
			<programName>重播:国际双行线</programName> <!--节目名称-->
			<path>c:\a.wma</path>         <!--视频路径-->
		</tvProgram>
        <tvProgram>
			<playTime>2013-9-29 07:00</playTime> <!--节目播出时间-->
			<meridien>早间档</meridien> <!--时段-->
			<programName>北京您早</programName> <!--节目名称-->
			<path>C:\New Stories (Highway Blues).wma</path>         <!--视频路径-->
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 09:02</playTime> <!--节目播出时间-->
			<meridien>早间档</meridien> <!--时段-->   
			<programName>重播《红星剧场》32集剧:勇者无敌(31)</programName> <!--节目名称-->
			<path>**</path>         <!--视频路径-->
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 09:58</playTime>
			<meridien>早间档</meridien>
			<programName>重播《红星剧场》32集剧:勇者无敌(32)</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 11:15</playTime>
			<meridien>午间档</meridien>
			<programName>重播:专题片:我爱你,中国(14)</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 11:58</playTime>
			<meridien>午间档</meridien>
			<programName>身边</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 12:30</playTime>
			<meridien>午间档</meridien>
			<programName>特别关注</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 13:05</playTime>
			<meridien>午间档</meridien>
			<programName>天下天天谈</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 13:40</playTime>
			<meridien>午间档</meridien>
			<programName>《玫瑰剧场》55集剧:闯关东中篇(21)</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 14:32</playTime>
			<meridien>午间档</meridien>
			<programName>《玫瑰剧场》55集剧:闯关东中篇(22)</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 15:27</playTime>
			<meridien>下午档</meridien>
			<programName>《玫瑰剧场》55集剧:闯关东中篇(23)</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 16:19</playTime>
			<meridien>下午档</meridien>
			<programName>《玫瑰剧场》55集剧:闯关东中篇(24)</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 17:31</playTime>
			<meridien>下午档</meridien>
			<programName>法治进行时</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 18:00</playTime>
			<meridien>晚间档</meridien>
			<programName>新闻晚高峰</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 18:30</playTime>
			<meridien>晚间档</meridien>
			<programName>北京新闻</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 18:56</playTime>
			<meridien>晚间档</meridien>
			<programName>天气预报</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 19:00</playTime>
			<meridien>晚间档</meridien>
			<programName>转播CCTV新闻联播</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 19:31</playTime>
			<meridien>晚间档</meridien>
			<programName>看气象</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 19:40</playTime>
			<meridien>晚间档</meridien>
			<programName>专题片:我爱你,中国(15)</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 20:22</playTime>
			<meridien>晚间档</meridien>
			<programName>《爸妈都是老党员》首播庆典</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 21:21</playTime>
			<meridien>晚间档</meridien>
			<programName>《红星剧场》38集剧:咱爸咱妈六十年(1)</programName>
			<path>**</path>
		</tvProgram>
		<tvProgram>
			<playTime>2013-9-29 23:25</playTime>
			<meridien>晚间档</meridien>
			<programName>重播文艺:花样年华歌舞大赛(5)</programName>
			<path>**</path>
		</tvProgram>
	</tvProgramTable>
</typeA>



*凤凰卫视

[html] view plain copy
 
print?
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <typeB version =" 1.0">  
  3.     <ProgramList>  
  4.         <Program>  
  5.             <playTime>2013-9-29 01:30</playTime>  <!--播出时间-->  
  6.             <name>金龙鱼凤凰剧场:李算(9)</name>          <!--节目名称-->  
  7.             <path>**</path>          <!--节目视频的本地路径-->  
  8.         </Program>  
  9.         <Program>  
  10.             <playTime>2013-9-29 02:10</playTime>  <!--播出时间-->  
  11.             <name>非凡人物论成功(713)</name>          <!--节目名称-->  
  12.             <path>**</path>          <!--节目视频的本地路径-->  
  13.         </Program>  
  14.         <Program>  
  15.             <playTime>2013-9-29 02:15</playTime>  <!--播出时间-->  
  16.             <name>有报天天读(28/09/09) </name>          <!--节目名称-->  
  17.             <path>**</path>          <!--节目视频的本地路径-->  
  18.         </Program>  
  19.         <Program>  
  20.             <playTime>2013-9-29 02:40</playTime>  <!--播出时间-->  
  21.             <name>娱乐大风暴(682) </name>          <!--节目名称-->  
  22.             <path>**</path>          <!--节目视频的本地路径-->  
  23.         </Program>  
  24.         <Program>  
  25.             <playTime>2013-9-29 03:15</playTime>  <!--播出时间-->  
  26.             <name>上海新长宁集团特约之2013中华小姐环球大赛-美丽前奏(41) </name>          <!--节目名称-->  
  27.             <path>**</path>          <!--节目视频的本地路径-->  
  28.         </Program>  
  29.         <Program>  
  30.             <playTime>2013-9-29 03:20</playTime>  <!--播出时间-->  
  31.             <name>完全时尚手册:天桥云裳(632)  </name>          <!--节目名称-->  
  32.             <path>**</path>          <!--节目视频的本地路径-->  
  33.         </Program>  
  34.         <Program>  
  35.             <playTime>2013-9-29 03:40</playTime>  <!--播出时间-->  
  36.             <name>东风康明斯凤凰冲击播:天力士特约之今日看世界(39)  </name>          <!--节目名称-->  
  37.             <path>**</path>          <!--节目视频的本地路径-->  
  38.         </Program>  
  39.         <Program>  
  40.             <playTime>2013-9-29 04:25</playTime>  <!--播出时间-->  
  41.             <name>音乐中国风(442)  </name>          <!--节目名称-->  
  42.             <path>**</path>          <!--节目视频的本地路径-->  
  43.         </Program>  
  44.         <Program>  
  45.             <playTime>2013-9-29 04:35</playTime>  <!--播出时间-->  
  46.             <name>维维健康新概念(193) </name>          <!--节目名称-->  
  47.             <path>**</path>          <!--节目视频的本地路径-->  
  48.         </Program>  
  49.         <Program>  
  50.             <playTime>2013-9-29 04:40</playTime>  <!--播出时间-->  
  51.             <name>红牛凤凰全球连线(28/09/09) </name>          <!--节目名称-->  
  52.             <path>**</path>          <!--节目视频的本地路径-->  
  53.         </Program>  
  54.         <Program>  
  55.             <playTime>2013-9-29 05:05</playTime>  <!--播出时间-->  
  56.             <name>红云红河时事开讲(28/09/09)  </name>          <!--节目名称-->  
  57.             <path>**</path>          <!--节目视频的本地路径-->  
  58.         </Program>  
  59.         <Program>  
  60.             <playTime>2013-9-29 05:30</playTime>  <!--播出时间-->  
  61.             <name>别巡检调查队(34)(R) </name>          <!--节目名称-->  
  62.             <path>**</path>          <!--节目视频的本地路径-->  
  63.         </Program>  
  64.     </ProgramList>  
  65. </typeB>  
<?xml version="1.0" encoding="utf-8" ?>
<typeB version =" 1.0">
	<ProgramList>
		<Program>
			<playTime>2013-9-29 01:30</playTime>  <!--播出时间-->
			<name>金龙鱼凤凰剧场:李算(9)</name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 02:10</playTime>  <!--播出时间-->
			<name>非凡人物论成功(713)</name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 02:15</playTime>  <!--播出时间-->
			<name>有报天天读(28/09/09) </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 02:40</playTime>  <!--播出时间-->
			<name>娱乐大风暴(682) </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 03:15</playTime>  <!--播出时间-->
			<name>上海新长宁集团特约之2013中华小姐环球大赛-美丽前奏(41) </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 03:20</playTime>  <!--播出时间-->
			<name>完全时尚手册:天桥云裳(632)  </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 03:40</playTime>  <!--播出时间-->
			<name>东风康明斯凤凰冲击播:天力士特约之今日看世界(39)  </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 04:25</playTime>  <!--播出时间-->
			<name>音乐中国风(442)  </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 04:35</playTime>  <!--播出时间-->
			<name>维维健康新概念(193) </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 04:40</playTime>  <!--播出时间-->
			<name>红牛凤凰全球连线(28/09/09) </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 05:05</playTime>  <!--播出时间-->
			<name>红云红河时事开讲(28/09/09)  </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
		<Program>
			<playTime>2013-9-29 05:30</playTime>  <!--播出时间-->
			<name>别巡检调查队(34)(R) </name>          <!--节目名称-->
			<path>**</path>          <!--节目视频的本地路径-->
		</Program>
	</ProgramList>
</typeB>

2.分类

*抽象类ChannelBase存储频道基本信息,定义抽象方法Fetch()解析频道节目单信息

[csharp] view plain copy
 
  1. public abstract  class ChannelBase  
  2.    {  
  3.        #region 属性  
  4.   
  5.        
  6.        /// <summary>  
  7.        /// 频道名称  
  8.        /// </summary>  
  9.        private string channelName;  
  10.        public string ChannelName  
  11.        {  
  12.            get { return channelName; }  
  13.            set { channelName = value; }  
  14.        }  
  15.        /// <summary>  
  16.        /// 频道路径  
  17.        /// </summary>  
  18.        private string path;  
  19.        public string Path  
  20.        {  
  21.            get { return path; }  
  22.            set { path = value; }  
  23.        }  
  24.        /// <summary>  
  25.        /// 节目列表  
  26.        /// </summary>  
  27.        private List<TvProgram> programList;  
  28.        public List< TvProgram> ProgramList  
  29.        {  
  30.            get { return programList; }  
  31.            set { this.programList = value; }  
  32.        }  
  33.     #endregion  
  34.   
  35.        public abstract void Fetch();  
  36.          
  37.    }  
*电视节目类
[csharp] view plain copy
 
  1. /// <summary>  
  2.    /// 节目对象  
  3.    /// </summary>  
  4.    public class TvProgram  
  5.    {  
  6.        #region 属性  
  7.   
  8.        /// <summary>  
  9.        /// 播出时间  
  10.        /// </summary>  
  11.        private DateTime playTime;  
  12.        public DateTime PlayTime  
  13.        {  
  14.            get { return playTime; }  
  15.            set { playTime = value; }  
  16.        }  
  17.        /// <summary>  
  18.        /// 时段  
  19.        /// </summary>  
  20.        private string median;  
  21.        public string Median  
  22.        {  
  23.            get { return median; }  
  24.            set { median = value; }  
  25.        }  
  26.        /// <summary>  
  27.        /// 名称  
  28.        /// </summary>  
  29.        private string programName;  
  30.        public string ProgramName  
  31.        {  
  32.            get { return programName; }  
  33.            set { programName = value; }  
  34.        }  
  35.        /// <summary>  
  36.        /// 文件路径  
  37.        /// </summary>  
  38.        private string filePath;  
  39.        public string FilePath  
  40.        {  
  41.            get { return filePath; }  
  42.            set { filePath = value; }  
  43.        }  
  44.        #endregion  
  45.   
  46.    }  

*TypeA类型频道类
[csharp] view plain copy
 
  1. /// <summary>  
  2. /// TypeA类型节目单解析  
  3.   
  4. /// </summary>  
  5. public  class TypeAChannel:ChannelBase  
  6. {  
  7.     /// <summary>  
  8.     /// 多态,覆盖父类的获取频道列表方法  
  9.   
  10.     /// </summary>  
  11.     public override void Fetch()  
  12.     {  
  13.         //获取频道列表  
  14.         XmlDocument xmlDoc = new XmlDocument();  
  15.         try  
  16.         {  
  17.             //加载频道节目单文件  
  18.   
  19.             xmlDoc.Load(Path);  
  20.         }  
  21.         catch (Exception ex)  
  22.         {  
  23.             Console.WriteLine("文件加载失败:" + ex.Message);  
  24.             return;  
  25.         }  
  26.         XmlElement elem = xmlDoc.DocumentElement;  
  27.         if (ProgramList == null)  
  28.         {  
  29.             ProgramList = new List<TvProgram>();  
  30.         }  
  31.         foreach (XmlNode node in elem.ChildNodes)  
  32.         {  
  33.             if (node.Name == "tvProgramTable")  
  34.             {  
  35.                 foreach (XmlNode subnode in node.ChildNodes)  
  36.                 {  
  37.                     TvProgram program = new TvProgram();  
  38.                     program.PlayTime = DateTime.Parse(subnode["playTime"].InnerText);  
  39.                     program.Median = subnode["meridien"].InnerText;  
  40.                     program.ProgramName = subnode["programName"].InnerText;  
  41.                     program.FilePath = subnode["path"].InnerText;  
  42.   
  43.                     this.ProgramList.Add(program);  
  44.                 }  
  45.             }  
  46.         }   
  47.     }  
  48. }  

*TypeB类型频道类
[csharp] view plain copy
 
  1.   
[csharp] view plain copy
 
  1. /// <summary>  
  2.    /// TypeB类型节目单解析  
  3.   
  4.    /// </summary>  
  5.    public class TypeBChannel : ChannelBase  
  6.    {  
  7.        /// <summary>  
  8.        /// 多态,覆盖父类方法,获取TypeBChannel的节目列表  
  9.   
  10.        /// </summary>  
  11.        public override void Fetch()  
  12.        {  
  13.            //获取节目列表  
  14.            XmlDocument xmlDoc = new XmlDocument();  
  15.            try  
  16.            {  
  17.                xmlDoc.Load(Path);  
  18.            }  
  19.            catch (Exception ex)  
  20.            {  
  21.                Console.WriteLine("文件加载失败:" + ex.Message);  
  22.                return;  
  23.            }  
  24.            XmlElement elem = xmlDoc.DocumentElement;  
  25.            if (ProgramList == null)  
  26.            {  
  27.                ProgramList = new List<TvProgram>();  
  28.            }  
  29.            foreach (XmlNode node in elem.ChildNodes[0])//【0】第一个节点  
  30.   
  31.            {  
  32.                TvProgram programe = new TvProgram();  
  33.                programe.PlayTime = DateTime.Parse(node["playTime"].InnerText);  
  34.                programe.Median = "";  
  35.   
  36.                programe.ProgramName = node["name"].InnerText;  
  37.                programe.FilePath = node["path"].InnerText;  
  38.   
  39.                this.ProgramList.Add(programe);  
  40.            }  
  41.        }  
  42.    }  
*channelManager类:读取xml文件,加载所有频道列表.根据频道类型创建"工厂"
[csharp] view plain copy
 
  1. public class ChannelManager  
  2.    {  
  3.       
  4.        /// <summary>  
  5.        /// 频道文件路径  
  6.        /// </summary>  
  7.        private string channelPath ="files/FullChannels.xml";  
  8.      
  9.        /// <summary>  
  10.        /// 全部频道  
  11.        /// </summary>  
  12.        private Dictionary<string, ChannelBase> fullChannel=new Dictionary<string,ChannelBase>();  
  13.        public Dictionary<string, ChannelBase> FullChannel  
  14.        {  
  15.            get   
  16.            {   
  17.                return fullChannel;   
  18.            }  
  19.        }  
  20.   
  21.        //持久化信息  
  22.        private SavingInfo seria = new SavingInfo();  
  23.        public SavingInfo Seria  
  24.        {  
  25.            get { return seria; }  
  26.   
  27.        }  
  28.   
  29.        /// <summary>  
  30.        /// 启动程序时,读取FullChannels.xml,加载所有频道列表  
  31.   
  32.        /// </summary>  
  33.        public void LoadChannel()  
  34.        {  
  35.            //预处理集合,防止被重复加载数据  
  36.            try  
  37.            {  
  38.                fullChannel.Clear();  
  39.                XmlDocument xmlDoc = new XmlDocument();  
  40.                xmlDoc.Load(channelPath);  
  41.                XmlElement xmlRoot = xmlDoc.DocumentElement;  
  42.                foreach (XmlNode node in xmlRoot.ChildNodes)  
  43.                {  
  44.                    //根据频道类型创建对象  
  45.                    ChannelBase channel =CreateChannel(node["channelType"].InnerText);  
  46.                    channel.ChannelName = node["tvChannel"].InnerText;  
  47.                    channel.Path = node["path"].InnerText;  
  48.                    this.fullChannel.Add(channel.ChannelName, channel);  
  49.                }  
  50.   
  51.            }  
  52.            catch  
  53.            {  
  54.                throw new Exception("数据加载错误!");  
  55.            }  
  56.   
  57.              
  58.        }  
  59.   
  60.        public  ChannelBase CreateChannel(string type)  
  61.        {  
  62.            ChannelBase channel = null;  
  63.            switch (type)  
  64.            {  
  65.                case "TypeA":  
  66.                    channel = new TypeAChannel();  
  67.                    break;  
  68.                case "TypeB":  
  69.                    channel = new TypeBChannel();  
  70.                    break;  
  71.                default:  
  72.                    break;  
  73.            }  
  74.            return channel;  
  75.        }  
  76.   
  77.   
  78.        //保存定制频道信息的文本文件名称  
  79.        private string saveFileName = @"files\save";  
  80.        /// <summary>  
  81.        /// 将我的电台信息存储到文本文件之中  
  82.        /// 要解决中文乱码问题  
  83.        /// </summary>  
  84.        public void SaveAsTxt()  
  85.        {  
  86.            try  
  87.            {  
  88.                FileStream fs = new FileStream(saveFileName + ".txt", FileMode.Create);  
  89.                StreamWriter writer = new StreamWriter(fs, Encoding.GetEncoding("GB2312"));  
  90.                string type = "";  
  91.                for (int index = 0; index < this.seria.MyFavor.Count; index++)  
  92.                {  
  93.                    ChannelBase channel = this.seria.MyFavor[index];  
  94.                    if (channel is TypeBChannel)  
  95.                    {  
  96.                        type = "TypeB";  
  97.                    }  
  98.                    else  
  99.                    {  
  100.                        type = "TypeA";  
  101.                    }  
  102.                    writer.WriteLine(type  
  103.                        + "|" + channel.ChannelName  
  104.                        + "|" + channel.Path);  
  105.                }  
  106.   
  107.                writer.WriteLine("End of my Favor");  
  108.                writer.Close();  
  109.                fs.Close();  
  110.   
  111.            }  
  112.            catch (Exception ex)  
  113.            {  
  114.                MessageBox.Show("写入文件失败:" + ex.ToString());  
  115.            }  
  116.        }  
  117.   
  118.        /// <summary>  
  119.        /// 从文本文件之中读取"我的电台"信息  
  120.   
  121.        /// </summary>  
  122.        public void LoadFromText()  
  123.        {  
  124.            //#region 存在性判断  
  125.   
  126.            if (!File.Exists(@"files\save.txt"))  
  127.            {//不存在则不再处理  
  128.                return;  
  129.            }  
  130.            //#endregion  
  131.   
  132.            try  
  133.            {  
  134.                StreamReader reader = new StreamReader(saveFileName + ".txt", Encoding.GetEncoding("GB2312"));  
  135.                string line = reader.ReadLine();  
  136.                string[] propertyValues;  
  137.                ChannelBase channel = null;  
  138.                 
  139.                while (line.Trim() != "End of my Favor")  
  140.                {  
  141.   
  142.                    propertyValues = line.Split('|');  
  143.                    channel = CreateChannel(propertyValues[0]);  
  144.   
  145.                    channel.ChannelName = propertyValues[1];  
  146.                    channel.Path = propertyValues[2];  
  147.                    this.seria.MyFavor.Add(channel);  
  148.                    line = reader.ReadLine();  
  149.                }  
  150.                reader.Close();  
  151.            }  
  152.            catch (Exception ex)  
  153.            {  
  154.                MessageBox.Show("文件操作异常:" + ex.Message);  
  155.            }  
  156.        }  
  157.    }  

*持久化信息类SavingInfo
[csharp] view plain copy
 
  1. //持久化信息类  
  2.   public class SavingInfo  
  3.   {  
  4.       public SavingInfo()  
  5.       {  
  6.           this.myFavor = new List<ChannelBase>();  
  7.       }  
  8.       #region 属性  
  9.   
  10.   
  11.       /// <summary>  
  12.       /// 我的收藏  
  13.       /// </summary>  
  14.       private List<ChannelBase> myFavor;  
  15.       public List<ChannelBase> MyFavor  
  16.       {  
  17.           get  
  18.           {  
  19.               if (myFavor == null)  
  20.               {  
  21.                   return new List<ChannelBase>();  
  22.               }  
  23.               else  
  24.               {  
  25.                   return myFavor;  
  26.               }  
  27.           }  
  28.           set { myFavor = value; }  
  29.       }  
  30.       #endregion  
  31.   
  32.   }  

3.主窗体

*电视台初始化

[csharp] view plain copy
 
  1. /// <summary>  
  2.         /// 管理器类  
  3.         /// </summary>  
  4.         private ChannelManager myManager = new ChannelManager();  
  5.   
  6.         public MainForm()  
  7.         {  
  8.             InitializeComponent();  
  9.         }  
  10.   
  11.         /// <summary>  
  12.         /// 电视台初始化  
  13.         /// </summary>  
  14.         private void InitChannel()  
  15.         {  
  16.             //加载所有频道信息  
  17.             myManager.LoadChannel();  
  18.   
  19.             //加载用户定制的频道信息  
  20.             myManager.LoadFromText();  
  21.   
  22.             //刷新TreeView显示  
  23.             UpdateTreeView();  
  24.   
  25.         }  
 
[csharp] view plain copy
 
  1. /// <summary>  
  2.        /// 窗体加载事件  
  3.        /// </summary>  
  4.        /// <param name="sender"></param>  
  5.        /// <param name="e"></param>  
  6.        private void MainForm_Load(object sender, EventArgs e)  
  7.        {  
  8.            this.SetVisible(true);  
  9.            this.InitChannel();  
  10.   
  11.        }  
[csharp] view plain copy
 
  1. /// <summary>  
  2.        /// 控制DataGridView和listView的显示  
  3.   
  4.        /// </summary>  
  5.        /// <param name="boolInfo"></param>  
  6.        private void SetVisible(bool boolInfo)  
  7.        {  
  8.            this.dgvProgList.Visible = boolInfo;  
  9.        }  

*刷新频道列表
[csharp] view plain copy
 
  1. private void UpdateTreeView()  
  2.       {  
  3.           //清空所有节点  
  4.   
  5.           this.tvChannel.Nodes.Clear();  
  6.   
  7.           //初始化根结点  
  8.           TreeNode nodeFirstLevel = new TreeNode("我的电视台");  
  9.           nodeFirstLevel.ImageIndex = 0;  
  10.           this.tvChannel.Nodes.Add(nodeFirstLevel);  
  11.           nodeFirstLevel = new TreeNode("所有电视台");  
  12.           this.tvChannel.Nodes.Add(nodeFirstLevel);  
  13.   
  14.           //加载“所有电视台”  
  15.   
  16.           foreach (ChannelBase dicOne in myManager.FullChannel.Values)  
  17.           {  
  18.               TreeNode node = new TreeNode();  
  19.               node.Text = dicOne.ChannelName;  
  20.               node.Tag = dicOne;  
  21.               node.ImageIndex = 1;  
  22.               this.tvChannel.Nodes[1].Nodes.Add(node);  
  23.   
  24.           }  
  25.   
  26.           //加载“我的电视台”  
  27.   
  28.           foreach (ChannelBase dicOne in myManager.Seria.MyFavor)  
  29.           {  
  30.               TreeNode node = new TreeNode();  
  31.               node.Text = dicOne.ChannelName;  
  32.               node.Tag = dicOne;  
  33.               node.ImageIndex = 1;  
  34.               this.tvChannel.Nodes[0].Nodes.Add(node);  
  35.           }  
  36.   
  37.           //展开所有节点  
  38.   
  39.           tvChannel.ExpandAll();  
  40.       }  

*将一个电台添加到我的电台中
[csharp] view plain copy
 
  1. private void tsmAddToFavor_Click(object sender, EventArgs e)  
  2.        {  
  3.            TreeNode node = this.tvChannel.SelectedNode;  
  4.            //没有选中任何节点,返回  
  5.   
  6.            if (node == null)  
  7.            {  
  8.                return;  
  9.            }  
  10.            ChannelBase ch = (ChannelBase)node.Tag;  
  11.            //保证不重复  
  12.   
  13.            foreach (TreeNode nodeItem in this.tvChannel.Nodes[0].Nodes)  
  14.            {  
  15.                if (nodeItem.Text.Trim() == node.Text.Trim())  
  16.                {  
  17.                    return;//发现“我的收藏夹”中有这个电台,就退出,不再执行添加工作。  
  18.   
  19.                }  
  20.            }  
  21.            this.myManager.Seria.MyFavor.Add(ch);  
  22.            this.UpdateTreeView();  
  23.        }  

右键单击树型菜单,控制右键菜单的菜单

即“所有电视台”的子节点的右键中只显示“加入到我的电台”
而“我的电视台”的子节点的右键只能显示"删除"



[csharp] view plain copy
 
  1. private void tvChannel_MouseClick(object sender, MouseEventArgs e)  
  2.         {  
  3.             //只处理右键事件  
  4.   
  5.             TreeNode node = this.tvChannel.SelectedNode;  
  6.             if (node != null && node.Level != 0)//有节点被选中且不是顶级节点  
  7.             {  
  8.                 //这句代码保证右键点击树的时候,那个节点处于选中状态  
  9.   
  10.                 if (node.Parent.Text == "所有电视台")  
  11.                 {  
  12.                     //使"加入到我的电台"这个菜单项可见  
  13.   
  14.                     cmenuRight.Items[1].Visible = false;  
  15.                     cmenuRight.Items[0].Visible = true;  
  16.                 }  
  17.                 else  
  18.                 {  
  19.                     //使“删除”菜单项可见  
  20.                     cmenuRight.Items[0].Visible = false;  
  21.                     cmenuRight.Items[1].Visible = true;  
  22.                 }  
  23.             }  
  24.             else  
  25.             {  
  26.                 cmenuRight.Items[1].Visible = false;  
  27.                 cmenuRight.Items[0].Visible = false;  
  28.             }  
  29.         }  
 
[csharp] view plain copy
 
  1. private void TMenuItemDel_Click(object sender, EventArgs e)  
  2.        {  
  3.            TreeNode node = this.tvChannel.SelectedNode;  
  4.            //没有选中任何节点,返回  
  5.            if (node == null)  
  6.            {  
  7.                return;  
  8.            }  
  9.            ChannelBase ch = (ChannelBase)node.Tag;  
  10.   
  11.            this.myManager.Seria.MyFavor.Remove(ch);  
  12.            this.UpdateTreeView();  
  13.        }  

树形菜单选项改变事件:改变频道,加载选中频道的节目信息
[csharp] view plain copy
 
    1. private void tvChannel_AfterSelect(object sender, TreeViewEventArgs e)  
    2.         {  
    3.             //控制DataGridView的显示  
    4.   
    5.             this.SetVisible(true);  
    6.             //e.Node选中的节点  
    7.   
    8.             if (e.Node.Level != 0)  
    9.             {  
    10.                 ChannelBase ch = (ChannelBase)e.Node.Tag;  
    11.                 if (ch.ProgramList != null)  
    12.                 {  
    13.                     ch.ProgramList.Clear();//清除当前节目单  
    14.   
    15.                 }  
    16.                 ch.Fetch(); //读取节目单  
    17.   
    18.                 this.dgvProgList.DataSource = ch.ProgramList; //绑定到数据展示控件显示  
    19.   
    20.                 this.dgvProgList.Tag = ch.ChannelName; //将当前Dgv的Tag属性设为频道的名称  
    21.             }  
    22.         }  



猜你喜欢

转载自www.cnblogs.com/wuayn/p/8903567.html
今日推荐