1 //频道基类 2 public abstract class ChannelBase 3 { 4 //频道名称 5 public string ChannelName { get; set; } 6 //频道路径 7 public string Path { get; set; } 8 //节目列表,TvProgram节目类频道上的所有节目列表 9 public List<TvProgram> TvList { get; set; } 10 //获取频道列表:通过Fetch方法获取该频道拥有的所有节目列表 11 public abstract void Fetch(); 12 13 public ChannelBase() { } 14 public ChannelBase(string channelName, string path, List<TvProgram> list) 15 { 16 this.ChannelName = channelName; 17 this.Path = path; 18 this.TvList = list; 19 } 20 21 }
1 public class ChannelFactory 2 { 3 public static ChannelBase getInstance(string type) 4 { 5 ChannelBase channel = null; 6 switch (type) 7 { 8 case "TypeA": 9 //创建北京电视台对象 10 channel = new TypeAChannnel(); 11 break; 12 case "TypeB": 13 //创建凤凰卫视对象 14 channel = new TypeBChannel(); 15 break; 16 default: 17 break; 18 } 19 return channel; 20 } 21 }
1 public class ChannelManager 2 { 3 //定制一个泛型集合 Dictionary<K,V> 4 //key:频道的名称 value:频道对象 5 private Dictionary<string, ChannelBase> allChannels = new Dictionary<string, ChannelBase>(); 6 7 public Dictionary<string, ChannelBase> AllChannels 8 { 9 get { return allChannels; } 10 set { allChannels = value; } 11 } 12 /// <summary> 13 /// 解析所有电视台并填充到双列集合中 14 /// </summary> 15 public void ResolveAllChannels() 16 { 17 XmlDocument doc = new XmlDocument(); 18 doc.Load("files\FullChannels.xml"); 19 XmlNode root = doc.DocumentElement; 20 foreach (XmlNode item in root.ChildNodes) 21 { 22 string type = item["channelType"].InnerText; 23 //一个item就是一个频道 24 ChannelBase channel = ChannelFactory.getInstance(type); 25 channel.ChannelName = item["tvChannel"].InnerText; 26 channel.Path = item["path"].InnerText; 27 //解析到双列集合中 28 allChannels.Add(channel.ChannelName, channel); 29 } 30 31 } 32 33 }
1 //节目类 2 public class TvProgram 3 { 4 //播出时间 5 public DateTime PlayTime { get; set; } 6 //早间档 午间档 晚间档 7 public string ShiDuan { get; set; } 8 //节目名称 9 public string Name { get; set; } 10 //视频路径 11 public string Path { get; set; } 12 }
1 //北京电视台 2 public class TypeAChannnel : ChannelBase 3 { 4 public override void Fetch() 5 { 6 7 //获取频道列表 8 XmlDocument doc = new XmlDocument(); 9 doc.Load(Path); 10 XmlNode elem = doc.DocumentElement; 11 TvList = new List<TvProgram>(); 12 13 foreach (XmlNode node in elem.ChildNodes) 14 { 15 if (node.Name == "tvProgramTable") 16 { 17 foreach (XmlNode child in node.ChildNodes) 18 { 19 TvProgram program = new TvProgram(); 20 program.PlayTime = Convert.ToDateTime(child["playTime"].InnerText); 21 program.ShiDuan = child["meridien"].InnerText; 22 program.Name = child["programName"].InnerText; 23 program.Path = child["path"].InnerText; 24 25 this.TvList.Add(program); 26 } 27 } 28 29 } 30 31 } 32 }
//凤凰卫视 public class TypeBChannel:ChannelBase { public override void Fetch() { //获取节目列表 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Path); XmlNode elem = xmlDoc.DocumentElement; TvList = new List<TvProgram>(); foreach (XmlNode node in elem.ChildNodes[0])//[0]第一个节点 { TvProgram programe = new TvProgram(); programe.PlayTime = DateTime.Parse(node["playTime"].InnerText); programe.ShiDuan = ""; programe.Name = node["name"].InnerText; programe.Path = node["path"].InnerText; this.TvList.Add(programe); } } }
1 TreeNode node = new TreeNode(); 2 TreeNode allNode = new TreeNode();//另一个根节点 3 Dictionary<string, List<TvProgram>> dic = new Dictionary<string, List<TvProgram>>(); 4 private void frmMain_Load(object sender, EventArgs e) 5 { 6 dgvList.AutoGenerateColumns = false; 7 //1.在treeview上构建两个根节点 8 node.Text = "我的电视台"; 9 //2.将node绑定到treeView1上 10 treeView1.Nodes.Add(node); 11 12 allNode.Text = "所有电视台"; 13 //2.将allNode绑定到treeView1上 14 treeView1.Nodes.Add(allNode); 15 16 LoadDataFromXml(); 17 } 18 /// <summary> 19 /// 动态绑定treeview节点 20 /// </summary> 21 private void LoadDataFromXml() 22 { 23 //ChannelManager有一个集合 调度 ResolveAllChannels方法 集合就有值了 24 ChannelManager manager = new ChannelManager(); 25 manager.ResolveAllChannels();//解析所有电视台相当于给集合赋值 26 foreach (ChannelBase channel in manager.AllChannels.Values) 27 { 28 //一个channel在Tv上就是一个节点 29 TreeNode tn = new TreeNode(); 30 tn.Text = channel.ChannelName; 31 tn.Tag = channel; 32 allNode.Nodes.Add(tn); 33 } 34 35 } 36 37 private void treeView1_AfterSelect_1(object sender, TreeViewEventArgs e) 38 { 39 TreeNode selectNode = treeView1.SelectedNode; 40 //获取到选中节点的level值 41 int level = selectNode.Level; 42 if (level == 1) 43 { 44 ChannelBase channel = (ChannelBase)selectNode.Tag; 45 channel.Fetch(); 46 //channel.TvList.Clear(); 47 dgvList.DataSource = channel.TvList; 48 49 } 50 } 51 52 private void 添加ToolStripMenuItem_Click(object sender, EventArgs e) 53 { 54 TreeNode selectedNode = treeView1.SelectedNode; 55 ChannelBase channel = (ChannelBase)selectedNode.Tag; 56 channel.Fetch(); 57 foreach (TreeNode item in selectedNode.Nodes) 58 { 59 if (item.Text == channel.ChannelName) 60 { 61 MessageBox.Show("此电视台已加入,无需重复添加!"); 62 return; 63 } 64 } 65 dic.Add(channel.ChannelName, channel.TvList); 66 TreeNode NewNode = new TreeNode(); 67 NewNode.Text = channel.ChannelName; 68 NewNode.Tag = channel; 69 node.Nodes.Add(NewNode); 70 } 71 72 private void 删除ToolStripMenuItem_Click(object sender, EventArgs e) 73 { 74 TreeNode selectedNode = treeView1.SelectedNode; 75 ChannelBase channel = (ChannelBase)selectedNode.Tag; 76 dic.Remove(channel.ChannelName); 77 selectedNode.Nodes.Remove(selectedNode); 78 79 } 80 81 private void 播放ToolStripMenuItem_Click(object sender, EventArgs e) 82 { 83 string programName = dgvList.SelectedRows[0].Cells[1].Value.ToString(); 84 MessageBox.Show("正在播放:" + programName + ""); 85 86 } 87