效果:
編寫節目類 屬性:播出時間、時段、名稱、視頻路徑
編寫頻道基類 屬性:頻道名稱、頻道節目單位置、節目列表 抽象方法:Fetch()
編寫頻道子類 繼承“頻道基類”,實現Fetch()【只寫方法聲明】
編寫頻道工廠類 方法:實現創建頻道子類
第一步.創建幾個類:
01:創建一個電視類(TvProgram)
該類主要負責定義節目的屬性,為後續從xml文件(FullChannnels.xml)中讀取的內容提供存放位置。
屬性為:
public DateTime PlayTime { get; set; } public string SomeTime { get; set; } public string Name { get; set; } public string Path { get; set; }
02:創建一個頻道基類(ChannelBase)(父類或是超類),且此類為抽象類
屬性為:
public string ChannelName{get; set; } public string Path { get; set; } public string Type { get; set; } public List<TvProgram> Tvlist { get; set; }
方法:
public abstract List<TvProgram> Fetch();
03:創建一個A類頻道(TypeAChannel)
該類主要負責解析XM文件(北京電視台.xml)
04:創建一個B類頻道(TypeBChannel)
該類主要負責解析XML文件(鳳凰衛視.xml)
05:創建一個工廠類(工具類)(ChannelFactory)
該類主要負責頻道的選擇
總結:ChannelBase,TypeAChannel,TypeBChannel,ChannelFactory四個類主要控制頻道信息
06:創建一個管理類(ChannelManager)
創建一個方法LoadAllChannel():解析文件
該類主要作用實質上減輕窗體中的代碼量。相當於程序的工具類。
第二步.寫代碼的核心思路:
01.首先在頻道管理類ChannelManager中寫一個加載所有頻道方法LoadAllChannel;
該方法作用讀取FullChannels.xml文件,並且將讀取到的內容賦值給ChannelBase 對象。關鍵的問題就轉化成了如何創建一個ChannelBase對象。我們都知道ChannelBase本身是一個抽象類,無法創建實例。由此,我們想到可以通過其子類來創建對象。由於不同子類實例化需要多次new,我們單獨寫了一個工廠類(ChannelFafactory),來創建子類實例,但是該子類實例存儲在父類變量中。賦值完成後,我們需要將頻道對象添加到字典中。那麼LoadAllChannel方法結束後,字典中就有
XML文檔中的數據。也就是我們實現了將
本地硬盤上的xml文件中的數據讀取到了內容中的一個字典集合中。
代碼:
public Dictionary<string, ChannelBase> Fulllist { get { return fulllist; } set { fulllist = value; } } private string channelPath = "files/FullChannel.xml"; //構造函數中new public ChannelManager() { fulllist = new Dictionary<string, ChannelBase>(); } //解析xml文件 public void ReadFiles() { fulllist.Clear(); XmlDocument doc = new XmlDocument(); doc.Load(channelPath); XmlNode root = doc.DocumentElement; foreach (XmlNode item in root.ChildNodes) { ChannelBase channelSB = ChannelFactory.CreateFile(item["channelType"].InnerText); channelSB.Type = item["channelType"].InnerText; channelSB.ChannelName = item["tvChannel"].InnerText; channelSB.Path=item["Path"].InnerText; fulllist.Add(channelSB.ChannelName,channelSB); }
02:將集合中的數據綁定到ListView中
將字典集合中的數據通過Foreach拆解,每循環一項,都創建一個TreeNode對象。
並且將集合中的屬性賦值給節點對應的屬性。然後將拼接處的節點添加到TreeView上
。這裡需要注意的是,如何找到TreeView控件中的【所有電視台】這個節點,因為
我們需要在該節點上添加頻道名稱
核心代碼如下:
ChannelManager manager = new ChannelManager(); manager.ReadFiles(); Dictionary<string, ChannelBase> dsc = manager.Fulllist; foreach (ChannelBase item in dsc.Values) { TreeNode td = new TreeNode(); td.Text = item.ChannelName; //頻道對象 td.Tag = item; tvlist.Nodes[1].Nodes.Add(td); }
03:A類頻道(TypeAChannel)
public override List<TvProgram> Fetch() { XmlDocument doc = new XmlDocument(); doc.Load(Path); XmlNode root = doc.DocumentElement; if (Tvlist == null) { Tvlist = new List<TvProgram>(); } foreach (XmlNode child in root.ChildNodes) { TvProgram tvp = new TvProgram(); if (child.Name == "tvProgramTable") { foreach (XmlNode two in child.ChildNodes) { tvp.PlayTime = Convert.ToDateTime(two["PlayTime"].InnerText); tvp.SomeTime = two["meridien"].InnerText; tvp.Name = two["programName"].InnerText; tvp.Path = two["path"].InnerText; Tvlist.Add(tvp); } } } return this.Tvlist;
04:B類頻道(TypeBChannel)和A類解析方法是一樣的。
05:進行頻道的選擇:
工廠類(工具類)(ChannelFactory)
代碼:
public static ChannelBase CreateFile(string type) { ChannelBase cb = null; switch (type) { case "TypeA": cb = new TypeAChannel(); break; case "TypeB": cb = new TypeBChannel(); break; default: break; } return cb; }
07:把數據綁定到dataGriv中,在Afterselect事件中寫
代碼:
TreeNode selectNode = tvlist.SelectedNode; if (selectNode.Level==1&&selectNode.Parent.Text=="所有電視台") { ChannelBase channel = (ChannelBase)selectNode.Tag; if (channel.Tvlist != null) { channel.Tvlist.Clear(); } //方式一: //List<TvProgram> tvlist1 = new List<TvProgram>(); //dgvlist.DataSource = tvlist1; //方式二: dgvlist.DataSource =channel.Fetch(); }
08:實現添加電台和刪除電台
添加:
TreeNode selectNOde = tvlist.SelectedNode; ChannelBase channel = (ChannelBase)selectNOde.Tag; tn.Text = channel.ChannelName; tn.Tag = channel; my.Nodes.Add(tn);
刪除:
my.Nodes.Remove(tn);
09.
001:
當在我的電台中沒有頻道時,沒有刪除功能,更不能有添加功能
如果有了已添加的頻道,才有刪除功能。但此時也不能有添加功能。
002:
當在所有電台中時,沒有刪除功能,只有添加功能。
代碼如下:
TreeNode select = tvlist.SelectedNode; if (select!=null&&select.Level==1) { if (select.Parent.Text=="我的電視台") { tvment.Items[0].Visible = false; tvment.Items[1].Visible = true; } else { tvment.Items[0].Visible = true; tvment.Items[1].Visible = false; } } else { tvment.Items[0].Visible = false; tvment.Items[1].Visible = false; }