网络电视精灵

    项目运行状态如图:

      

    项目完成后的类:

        

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

    一: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动态加载综合练习----->网络电视精灵项目练习、分析的更多相关文章

  1. android sax解析xml 文件 动态加载标题

    要解决一个问题 : 问题描述为 把标题动态的加载到 listView子布局中 我们首先通过 java程序写一个把标题写到xml文件的程序.这个程序会在以后讲解. 现在截图 已经写好的xm文件格式如下 ...

  2. mybatis源码解析之Configuration加载(五)

    概述 前面几篇文章主要看了mybatis配置文件configuation.xml中<setting>,<environments>标签的加载,接下来看一下mapper标签的解析 ...

  3. Android应用安全之外部动态加载DEX文件风险

    1. 外部动态加载DEX文件风险描述 Android 系统提供了一种类加载器DexClassLoader,其可以在运行时动态加载并解释执行包含在JAR或APK文件内的DEX文件.外部动态加载DEX文件 ...

  4. AngularJS进阶(三十九)基于项目实战解析ng启动加载过程

    基于项目实战解析ng启动加载过程 前言 在AngularJS项目开发过程中,自己将遇到的问题进行了整理.回过头来总结一下angular的启动过程. 下面以实际项目为例进行简要讲解. 1.载入ng库 2 ...

  5. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

  6. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  7. android基础知识13:AndroidManifest.xml文件解析

    注:本文转载于:http://blog.csdn.net/xianming01/article/details/7526987 AndroidManifest.xml文件解析. 1.重要性 Andro ...

  8. Android之AndroidManifest.xml文件解析

    转自:Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文 ...

  9. 9.XML文件解析

    一.XML简介 XML(EXtensible Markup Language),可扩展标记语言 特点:XML与操作系统.编程语言的开发平台无关 实现不同系统之间的数据交换 作用:数据交互 配置应用程序 ...

随机推荐

  1. sql like 时间需要做转换

    EG: where Convert(varchar(100),[字段名],120) like '2010-10-10%'

  2. C#:vs2010无法打开vs2012创建的项目

    vs低版本打开高版本创建的项目时会提示"选择的文件是解决方案文件,但是用此应用程序的较新版本创建的,无法打开" 解决办法: 写字板打开解决方案sln文件 将其改成你现在用的vs版本 ...

  3. 目前比较流行的Python科学计算发行版

    经常有身边的学友问到用什么Python发行版比较好? 其实目前比较流行的Python科学计算发行版,主要有这么几个: Python(x,y) GUI基于PyQt,曾经是功能最全也是最强大的,而且是Wi ...

  4. c#中运行时编译时 多态

    c#中运行时编译时 多态   public class aa { } public class bb:aa { } public class cc { public static void Main( ...

  5. Hadoop企业级应用

    Hadoop专业解决方案之构建Hadoop企业级应用 一.大数据的挑战 大数据面对挑战是你必须重新思考构建数据分析应用的方式.传统方式的应用构建是基于数据存储在不支持大数据处理的基础之上.这主要是因为 ...

  6. 重载 C 函数

    在 clang 的扩展下,可以重载 C 函数,例如重载 sin 函数: float __attribute__((overloadable)) sin(float x) { return sinf(x ...

  7. IOS学习之路二十三(EGOImageLoading异步加载图片开源框架使用)

    EGOImageLoading 是一个用的比较多的异步加载图片的第三方类库,简化开发过程,我们直接传入图片的url,这个类库就会自动帮我们异步加载和缓存工作:当从网上获取图片时,如果网速慢图片短时间内 ...

  8. 一个使用MVC3+NHibernate “增删改查” 的项目

    一个使用MVC3+NHibernate “增删改查” 的项目  前言: 谈到NHibernate大伙并不陌生,搞Java的更是清楚,Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框 ...

  9. Android 短信模块分析(二) MMS中四大组件核心功能详解

    接下来的分析先从MMS中四大组件(Activity ,BroadCastReceiver,Service,ContentProvider),也是MMS中最核心的部分入手: 一. Activity  1 ...

  10. Ajax实现xml文件数据插入数据库(二)--- ajax实现与jsp的数据交互。

    在上一篇文章中我们成功得到了重新组织后的数据,接下来需要做的便是将数据插入到数据库中了.在与数据库打交道的过程中有一些方法是普遍的,我们将这些通用方法封装到一个DbUtil类中,以便复用,封装好的Db ...