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類一樣。

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

右鍵我的電視台下的頻道會只有刪除選項,右鍵所有電視台會只有加入我的電台選項。

那么還有提醒功能,就是用戶可以設一個時間點,到時間了會提醒用戶去收看,有興趣的可以研究一下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM