码迷,mamicode.com
首页 > 其他好文 > 详细

网络电视精灵的框架及关键代码

时间:2016-03-16 23:59:46      阅读:567      评论:0      收藏:0      [点我收藏+]

标签:

效果:

技术分享

编写节目类 属性:播出时间、时段、名称、视频路径

编写频道基类 属性:频道名称、频道节目单位置、节目列表 抽象方法:Fetch()

编写频道子类 继承频道基类,实现Fetch()【只写方法声明】

编写频道工厂类 方法:实现创建频道子类

第一步.创建几个类:

01创建一个电视类(TvProgram)

该类主要负责定义节目的属性,为后续从xml文件(FullChannnels.xml)中读取的内容提供存放位置。

属性为:   

 public DateTime PlayTime { get; set; }
        public string SomeTime { get; set; }
        public string Name { get; set; }
        public string Path { get; set; }

02:创建一个频道基类(ChannelBase)(父类或是超类),且此类为抽象类

属性为:

   public string ChannelName{get; set; }

        public string Path { get; set; }

        public string Type { get; set; }

        public List<TvProgram> Tvlist { get; set; }

 

方法:

        public abstract List<TvProgram> Fetch();

03:创建一个A类频道(TypeAChannel)

该类主要负责解析XM文件(北京电视台.xml)

 

04:创建一个B类频道(TypeBChannel)

该类主要负责解析XML文件(凤凰卫视.xml

05:创建一个工厂类(工具类)(ChannelFactory

该类主要负责频道的选择

总结:ChannelBase,TypeAChannel,TypeBChannel,ChannelFactory四个类主要控制频道信息

06:创建一个管理类(ChannelManager)

创建一个方法LoadAllChannel():解析文件

该类主要作用实质上减轻窗体中的代码量。相当于程序的工具类。

第二步.写代码的核心思路:

01.首先在频道管理类ChannelManager中写一个加载所有频道方法LoadAllChannel;

该方法作用读取FullChannels.xml文件,并且将读取到的内容赋值给ChannelBase          对象。关键的问题就转化成了如何创建一个ChannelBase对象。我们都知道ChannelBase本身是一个抽象类,无法创建实例。由此,我们想到可以通过其子类来创建对象。由于不同子类实例化需要多次new,我们单独写了一个工厂类(ChannelFafactory),来创建子类实例,但是该子类实例存储在父类变量中。赋值完成后,我们需要将频道对象添加到字典中。那么LoadAllChannel方法结束后,字典中就有

XML文档中的数据。也就是我们实现了将

本地硬盘上的xml文件中的数据读取到了内容中的一个字典集合中。

代码:

 public Dictionary<string, ChannelBase> Fulllist
       {
            get { return fulllist; }
            set { fulllist = value; }
        }
        private string channelPath = "files/FullChannel.xml";
      //构造函数中new
      public ChannelManager() {
          fulllist = new Dictionary<string, ChannelBase>();
      }
      //解析xml文件
      public void ReadFiles() {
          fulllist.Clear();
          XmlDocument doc = new XmlDocument();
          doc.Load(channelPath);
          XmlNode root = doc.DocumentElement;
          foreach (XmlNode item in root.ChildNodes)
          {
              ChannelBase channelSB = ChannelFactory.CreateFile(item["channelType"].InnerText);
              channelSB.Type = item["channelType"].InnerText;
              channelSB.ChannelName = item["tvChannel"].InnerText;
              channelSB.Path=item["Path"].InnerText;
              fulllist.Add(channelSB.ChannelName,channelSB);
          }

   02:将集合中的数据绑定到ListView中

将字典集合中的数据通过Foreach拆解,每循环一项,都创建一个TreeNode对象。

并且将集合中的属性赋值给节点对应的属性。然后将拼接处的节点添加到TreeView上

。这里需要注意的是,如何找到TreeView控件中的【所有电视台】这个节点,因为

我们需要在该节点上添加频道名称

核心代码如下:

ChannelManager manager = new ChannelManager();
            manager.ReadFiles();
            Dictionary<string, ChannelBase> dsc = manager.Fulllist;
            foreach (ChannelBase item in dsc.Values)
            {
                TreeNode td = new TreeNode();
                td.Text = item.ChannelName;
                //频道对象
                td.Tag = item;
                tvlist.Nodes[1].Nodes.Add(td);
            }

03:A类频道(TypeAChannel)

 public override List<TvProgram> Fetch()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(Path);
            XmlNode root = doc.DocumentElement;
            if (Tvlist == null)
            {
                Tvlist = new List<TvProgram>();
            }
            foreach (XmlNode child in root.ChildNodes)
            {
                TvProgram tvp = new TvProgram();
                if (child.Name == "tvProgramTable")
                {
                    foreach (XmlNode two in child.ChildNodes)
                    {
                        tvp.PlayTime = Convert.ToDateTime(two["PlayTime"].InnerText);
                        tvp.SomeTime = two["meridien"].InnerText;
                        tvp.Name = two["programName"].InnerText;
                        tvp.Path = two["path"].InnerText;
                        Tvlist.Add(tvp);
                    }                
                }
            }
            return this.Tvlist;

 

         04:B类频道(TypeBChannel)和A类解析方法是一样的。

05:进行频道的选择:

   工厂类(工具类)(ChannelFactory

代码:

public static ChannelBase CreateFile(string type) {
          ChannelBase cb = null;
          switch (type)
          {
              case "TypeA":
                  cb = new TypeAChannel();
                  break;
              case "TypeB":
                  cb = new TypeBChannel();
                  break;
              default:
                  break;
          }              
          return cb;
      }

07:把数据绑定到dataGriv中,在Afterselect事件中写

代码:

TreeNode selectNode = tvlist.SelectedNode;
            if (selectNode.Level==1&&selectNode.Parent.Text=="所有电视台")
            {
                ChannelBase channel = (ChannelBase)selectNode.Tag;
                if (channel.Tvlist != null)
                {
                    channel.Tvlist.Clear();
                }
                //方式一:
                //List<TvProgram> tvlist1 = new List<TvProgram>();
                //dgvlist.DataSource = tvlist1;
                    //方式二:
                dgvlist.DataSource =channel.Fetch();
            }

08:实现添加电台和删除电台

添加:

 TreeNode selectNOde = tvlist.SelectedNode;

            ChannelBase channel = (ChannelBase)selectNOde.Tag; 

                tn.Text = channel.ChannelName;

                tn.Tag = channel;

                my.Nodes.Add(tn);

删除:

my.Nodes.Remove(tn);

09.

001:

当在我的电台中没有频道时,没有删除功能,更不能有添加功能

如果有了已添加的频道,才有删除功能。但此时也不能有添加功能。

002:

当在所有电台中时,没有删除功能,只有添加功能。

代码如下:

  TreeNode select = tvlist.SelectedNode;
            if (select!=null&&select.Level==1)
            {
                if (select.Parent.Text=="我的电视台")
                {
                    tvment.Items[0].Visible = false;            
                    tvment.Items[1].Visible = true;
                }
                else
                {
                    tvment.Items[0].Visible = true;
                   tvment.Items[1].Visible = false;
                }
            }
            else
            {
                tvment.Items[0].Visible = false;
                tvment.Items[1].Visible = false;
            }

 

网络电视精灵的框架及关键代码

标签:

原文地址:http://www.cnblogs.com/whyhappy/p/5285460.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!