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類一樣。
至此基本功能已經完成,那么接下來大家也可以接着制作如下功能:
右鍵我的電視台下的頻道會只有刪除選項,右鍵所有電視台會只有加入我的電台選項。
那么還有提醒功能,就是用戶可以設一個時間點,到時間了會提醒用戶去收看,有興趣的可以研究一下。