效果:
编写节目类 属性:播出时间、时段、名称、视频路径
编写频道基类 属性:频道名称、频道节目单位置、节目列表 抽象方法: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; }