你的位置:首页 > ASP.net教程

[ASP.net教程]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.Parese 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> FullChannel11     {12       get { return fullChannel; }13       set { fullChannel = value; }14     }15     public void Parese16     {17       new 18       doc.Load("FullChannels.");19        doc.DocumentElement;20       foreach (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       new  8       doc.Load("北京电视台."); 9       if (TvList == null)10       {11         TvList = new List<TvProgram>();12       }13       //获取根节点14        doc.DocumentElement;15       foreach (in root.ChildNodes)16       {17         if (item.Name == "tvProgramTable")18         {19           foreach (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类一样。

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

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

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