zoukankan      html  css  js  c++  java
  • C#畅谈“网络电视”

    C#畅谈“网络电视”

    以上是大家比较喜欢的网络电视软件,例如:PPTV,BOX央视影音,PPS等。

    今天我就和大家来聊一下简单的“网络电视”。虽然和上边的软件没发比,但是正在向着这个目标努力中……

     

    一开始我在做这个项目的时候思路很茫然,就像地上的一团线团一样。

    我需要用到哪些方法?需要建几个类?

    拿到一个项目的时候首先要分析我想大家都知道

    主界面如下:

    既然是网络电视,那么肯定有很多的频道供用户去选择。所以肯定有频道类,要定义一个频道的基类(ChannelBase),让所有频道类继承这个基类,提高抽象程度会更方便一些。

    频道管理类(ChannelManager)也是必不可少的,要不怎么去管理那么多的频道呢!

    选择频道,频道下面就会有节目,节目类也随之而来。

    这里我定义了两个频道类(TypeAChannel类,TypeBChannel类),关系如下:

    1 public class TypeAChannel:ChannelBase
    1 public class TypeBChannel:ChannelBase

    频道基类(ChannelBase)代码如下:

     1 //频道基类
     2     public abstract class ChannelBase
     3     {
     4         //频道名称
     5         public string ChannelName { get; set; }
     6         //频道路径
     7         public string Path { get; set; }
     8         //节目列表,该频道上的所有节目列表
     9         public List<TvProgram> TvList { get; set; }
    10         //获取频道列表:通过Fetch方法获取该频道拥有的所有节目列表
    11         public abstract void Fetch();
    12         //频道类型
    13         public string Type { get; set; }
    14     }

    节目类(TvProgram)代码如下:

     1 //节目类
     2     public class TvProgram
     3     {
     4         //播出时间
     5         public DateTime PlayTime { get; set; }
     6         //早间档,午间档,晚间档
     7         public string Shiduan { get; set; }
     8         //节目名称
     9         public string ProgramName { get; set; }
    10         //视频路径
    11         public string Path { get; set; }
    12     }

    接下来可以着手绑定treeView了。

    首先先添加根节点:

     1         private void LoadRootNode() 
     2         {
     3             TreeNode mineNode = new TreeNode();
     4             mineNode.Text = "我的电视台";
     5 
     6             allNode.Text = "所有电视台";
     7 
     8             treeView1.Nodes.Add(mineNode);
     9             treeView1.Nodes.Add(allNode);
    10         }

    treeView里代码如下:

     1 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
     2         {
     3             TreeNode selectNode = treeView1.SelectedNode;
     4             if (selectNode.Level==1 && selectNode.Parent.Text=="所有电视台")
     5             {
     6                 ChannelBase channel = (ChannelBase)selectNode.Tag;
     7                 channel.Fetch();
     8 
     9                 List<TvProgram> ProList = channel.TvList;
    10                 dataGridView1.DataSource = ProList;
    11             }
    12         }

    接下来把LoadRootNode()方法在Load中调用一下:

     1 private void Form1_Load(object sender, EventArgs e)
     2         {
     3             LoadRootNode();
     4             ChannelManager manager = new ChannelManager();
     5             manager.PareseXML();
     6             Dictionary<string,ChannelBase> dic=manager.FullChannel;
     7             foreach (var channel in dic.Values)
     8             {
     9                 TreeNode tn = new TreeNode();
    10                 tn.Text = channel.ChannelName;
    11                 tn.Tag = channel;
    12                 allNode.Nodes.Add(tn);
    13             }
    14         }

    到这里treeView已经绑定完成了,那么我上边是不是犯了一个小错误呢?会导致什么后果?

    没错,相信大家都猜到了,我在调用Fetch()方法之前,节目列表没有清除,可以用下面的方法:

    1                 if (channel.TvList != null)
    2                 {
    3                     channel.TvList.Clear();
    4                 }

    正确的代码如下:

     1 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
     2         {
     3             TreeNode selectNode = treeView1.SelectedNode;
     4             if (selectNode.Level==1 && selectNode.Parent.Text=="所有电视台")
     5             {
     6                 ChannelBase channel = (ChannelBase)selectNode.Tag;
     7                 if (channel.TvList != null)
     8                 {
     9                     channel.TvList.Clear();
    10                 }
    11                 channel.Fetch();
    12 
    13                 List<TvProgram> ProList = channel.TvList;
    14                 dataGridView1.DataSource = ProList;
    15             }
    16         }

    频道管理类:

     1 //频道管理类
     2     public class ChannelManager
     3     {
     4         public ChannelManager()
     5         {
     6             fullChannel = new Dictionary<string, ChannelBase>();
     7         }
     8 
     9         private Dictionary<string, ChannelBase> fullChannel = new Dictionary<string, ChannelBase>();
    10         public Dictionary<string, ChannelBase> FullChannel
    11         {
    12             get { return fullChannel; }
    13             set { fullChannel = value; }
    14         }
    15         public void PareseXML() 
    16         {
    17             XmlDocument doc = new XmlDocument();
    18             doc.Load("FullChannels.xml");
    19             XmlNode root = doc.DocumentElement;
    20             foreach (XmlNode node in root.ChildNodes)
    21             {
    22                 string type = node["channelType"].InnerText;
    23                 ChannelBase channel = ChannelFactory.CreatChannel(type);
    24                 channel.ChannelName = node["tvChannel"].InnerText;
    25                 channel.Path = node["path"].InnerText;
    26                 channel.Type = type;
    27 
    28                 fullChannel.Add(channel.ChannelName,channel);
    29             }
    30         }
    31     }

    这里列举一个频道TypeAChannel类:

     1 //A频道类
     2     public class TypeAChannel:ChannelBase
     3     {
     4         //多态,覆盖父类的获取频道列表方法
     5         public override void Fetch()
     6         {
     7             XmlDocument doc = new XmlDocument();
     8             doc.Load("北京电视台.xml");
     9             if (TvList == null)
    10             {
    11                 TvList = new List<TvProgram>();
    12             }
    13             //获取根节点
    14             XmlNode root = doc.DocumentElement;
    15             foreach (XmlNode item in root.ChildNodes)
    16             {
    17                 if (item.Name == "tvProgramTable")
    18                 {
    19                     foreach (XmlNode child in item.ChildNodes)
    20                     {
    21                         //一个item就是一个tvProgram节点
    22                         TvProgram program = new TvProgram();
    23                         program.PlayTime = Convert.ToDateTime(child["playTime"].InnerText);
    24                         program.Shiduan = child["meridien"].InnerText;
    25                         program.ProgramName = child["programName"].InnerText;
    26                         program.Path = child["path"].InnerText;
    27                         TvList.Add(program);
    28                     }
    29                 }
    30             }
    31         }
    32     }

    频道TypeBChannel类和TypeAChannel类一样。

    至此基本功能已经完成,那么接下来大家也可以接着制作如下功能:

    右键我的电视台下的频道会只有删除选项,右键所有电视台会只有加入我的电台选项。

    那么还有提醒功能,就是用户可以设一个时间点,到时间了会提醒用户去收看,有兴趣的可以研究一下。

  • 相关阅读:
    利用html2canvas将html页面截图 js
    微信网页分享功能 js
    json数组排序 js
    数字千位符 js
    调用百度Api读取图片文字 C#
    判断手机移动端js
    网页添加水印js
    css 文字隐藏,鼠标移动显示
    删除某个数据库下所有表
    linux错误记录
  • 原文地址:https://www.cnblogs.com/wcf6676/p/4649482.html
Copyright © 2011-2022 走看看