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