首页 > 代码库 > 继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析

继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析

网络电视精灵

    项目运行状态如图:

      技术分享

 

 

    项目完成后的类:

    技术分享    

    首先,将程序分为二部分进行:

    一:TreeView节点内容的设计及编写:

    1.1遍写XML文件:管理(FullChannels.xml),A类电视台北京电视台(北京电视台.xml),B类电视台凤凰卫视(凤凰卫视.xml)

    1.2创建一个抽象的电视频道父类,ChannelBase,其中有成员:频道名称,频道路径,节目列表(以电视节目类作为类型的集合),解析频道节目单的抽象方法.代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 第八章_网络电视精灵{    /// <summary>    /// 频道类    /// </summary>    public abstract class ChannelBase    {        //频道名称        public string ChannelName { get; set; }        //频道路径        public string Path { get; set; }        //节目列表        public List<TvProgram> ProgramList { get; set; }        //电视节目类作为类型        //解析频道节目单信息        public abstract void Fetch();    }}

  

    1.3创建一个电视节目类,TvProgram类,该类主要负责定义节目的属性,为后续从xml文件中读取的内容提供存放位置

     其中有成员:播出时间,时段,节目名称,节目文件路径.代码如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 第八章_网络电视精灵{    public class TvProgram    {        //播出时间        public DateTime PlayTime { get; set; }        //时段        public string Median { get; set; }        //节目名称        public string ProgramName { get; set; }        //节目文件路径        public string FilePath { get; set; }      }}

  

    1.4电视台分为两类,那么有TypeAChannel,TypeAChannel两个继承自ChannelBase的子类:

    A类电视(北京电视台): 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml;namespace 第八章_网络电视精灵{    /// <summary>    /// A类电视台(北京电视台)    /// </summary>    public class TypeAChannel:ChannelBase    {        public override void Fetch()        {            //获取频道列表            XmlDocument doc = new XmlDocument();            //加载频道节目单文件            doc.Load("北京电视台.xml");            XmlElement root = doc.DocumentElement;            if (ProgramList == null)            {                ProgramList = new List<TvProgram>();      //给频道类的List集合中添加数据            }            foreach (XmlNode item in root.ChildNodes)            {                if (item.Name == "tvProgramTable")                {                    foreach (XmlNode node in item.ChildNodes)                    {                        TvProgram program = new TvProgram();                        program.PlayTime = DateTime.Parse(node["playTime"].InnerText);                        program.Median = node["meridien"].InnerText;                        program.ProgramName = node["programName"].InnerText;                        program.FilePath = node["path"].InnerText;                        ProgramList.Add(program);                    }                }            }        }    }}

  

    B类电视(凤凰卫视)

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml;namespace 第八章_网络电视精灵{    /// <summary>    /// B类电视(凤凰卫视)    /// </summary>    public class TypeBChannel:ChannelBase    {        public override void Fetch()        {            //获取频道列表            XmlDocument doc = new XmlDocument();            try            {                //加载频道节目单文件                doc.Load("凤凰卫视.xml");            }            catch (Exception)            {                throw;            }            XmlElement root = doc.DocumentElement;            if (ProgramList == null)            {                ProgramList = new List<TvProgram>();            }            foreach (XmlNode item in root.ChildNodes)            {                if (item.Name == "ProgramList")                {                    foreach (XmlNode node in item.ChildNodes)                    {                        TvProgram program = new TvProgram();                        program.PlayTime = DateTime.Parse(node["playTime"].InnerText);                        program.ProgramName = node["name"].InnerText;                        program.FilePath = node["path"].InnerText;                        ProgramList.Add(program);                    }                }            }        }    }}

  

    1.5创建一个电视频道管理类,实现多态:    

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

         该方法作用读取FullChannels.xml文件,并且将读取到的内容赋值给ChannelBase 对象。关键的问题就转化成了如何创建一个ChannelBase对象。我们都知道ChannelBase本身是一个抽象类,无法创建实例。由此,我们想到可以通过其子类

    来创建对象。由于不同子类实例化需要多次new,我们单独写了一个方法CreateChannel(string type),来创建子类实例,但是该子类实例存储在父类变量中。赋值完成后,我们需要将频道对象添加到字典中。那么 

    LoadAllChannel方法结束后,字典中就有了XML文档中的数据。也就是我们实现了将本地硬盘上的xml文件中的数据读取到了内存中的一个字典集合中。    

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml;namespace 第八章_网络电视精灵{    /// <summary>    /// 电视频道管理类    /// </summary>    public class ChannelManager    {        //频道文件路径        private string channelPath = "FullChannels.xml";        //全部频道        private Dictionary<string, ChannelBase> fullChannel = new Dictionary<string, ChannelBase>();        public Dictionary<string, ChannelBase> FullChannel        {            get { return fullChannel; }            set { fullChannel = value; }        }        //读取FullChannels.xml加载所有频道列表        public void LoadChannel()        {            fullChannel.Clear();            XmlDocument doc = new XmlDocument();            doc.Load(channelPath);            XmlElement root = doc.DocumentElement;            foreach (XmlNode item in root.ChildNodes)            {                ChannelBase channel = CreateChannel(item["channelType"].InnerText);                channel.ChannelName = item["tvChannel"].InnerText;                channel.Path = item["path"].InnerText;                fullChannel.Add(channel.ChannelName, channel);            }        }        //根据频道类型创建对象        public ChannelBase CreateChannel(string type)        {            ChannelBase channel = null;            switch (type)            {                case "TypeA":                    channel = new TypeAChannel();                    break;                case "TypeB":                    channel = new TypeBChannel();                    break;                default:                    break;            }            return channel;        }    }}

  

    到此,为TreeView节点对象的准备工作就做完了,下面开始为TreeView的节点进行对象绑定以及右侧DataGridView的数据绑定:

    

    二:为TreeView的节点进行对象绑定以及右侧DataGridView的数据绑定、右键菜单:

    2.1初始化根节点并为DataGridView绑定数据:

        private void FrmMain_Load(object sender, EventArgs e)        {            UpdateTreeView();        }        //TreeView加载频道信息        public void UpdateTreeView()        {            //清空所有节点            tvList.Nodes.Clear();            //初始化根节点            TreeNode node = new TreeNode("我的电视台");            tvList.Nodes.Add(node);            node = new TreeNode("所有电视台");            tvList.Nodes.Add(node);            ChannelManager man=new ChannelManager();            man.LoadChannel();            foreach (ChannelBase item in man.FullChannel.Values)            {                //定义一个TreeView节点                TreeNode tn = new TreeNode();                tn.Text = item.ChannelName;                tn.Tag = item;                tvList.Nodes[1].Nodes.Add(tn);            }        }

  

    2.2实现右键菜单的添加功能:

      (  在这一步活生生卡了一个小时,还是比较笨~   )

    获取选中的节点,根据Tag属性获取对应频道对象,然后将选定的频道加入到我的电视台中:  

     ChannelManager cm = new ChannelManager();        ChannelBase channel = null;        //加入我的电视台        private void 加入ToolStripMenuItem_Click(object sender, EventArgs e)        {            channel= (ChannelBase)tvList.SelectedNode.Tag;            cm.LoadChannel();            TreeNode node = new TreeNode();            node.Text = channel.ChannelName;            node.Tag = channel;            tvList.Nodes[0].Nodes.Add(node);        }

  

    2.3实现右键菜单的删除功能:    

     private void 删除ToolStripMenuItem_Click(object sender, EventArgs e)        {            ChannelBase chan=null;            chan=(ChannelBase)tvList.SelectedNode.Tag;            cm.FullChannel.Remove(chan.ChannelName);            tvList.Nodes.Remove(tvList.SelectedNode);        }

  

    2.4还需要根据鼠标点击的节点位置判断右键菜单的显示:    

      //判断右键菜单的内容            if (tvList.SelectedNode.Level == 0)            {                cmsMenu.Items[0].Visible = false;                cmsMenu.Items[1].Visible = false;            }            else if (tvList.SelectedNode.Parent.Text == "我的电视台")            {                cmsMenu.Items[0].Visible = false;                cmsMenu.Items[1].Visible = true;            }            else if (tvList.SelectedNode.Parent.Text == "所有电视台")            {                cmsMenu.Items[1].Visible = false;                cmsMenu.Items[0].Visible = true;            }

  

    2.5根据点击的节点判断DataGridView的内容:    

    if (tvList.SelectedNode.Text=="北京电视台")            {                TypeAChannel ta = new TypeAChannel();                ta.Fetch();                dgvList.DataSource = ta.ProgramList;            }            else if (tvList.SelectedNode.Text == "凤凰卫视")            {                TypeBChannel tb = new TypeBChannel();                tb.Fetch();                dgvList.DataSource = tb.ProgramList;            }            else            {                List<TvProgram> list = new List<TvProgram>();                dgvList.DataSource = list;            }

  

继续努力!

 

END

本人原创,如有转载,请注明出处.

继承,多态,集合,面向对象,XML文件解析,TreeView动态加载综合练习----->网络电视精灵项目练习、分析