当前位置: 代码迷 >> C# >> 网络电视精怪的框架及关键代码
  详细解决方案

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

热度:140   发布时间:2016-04-28 08:22:55.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;            }

 

  相关解决方案