效果:

編寫節目類 屬性:播出時間、時段、名稱、視頻路徑
編寫頻道基類 屬性:頻道名稱、頻道節目單位置、節目列表 抽象方法: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;
}