電視精靈
效果展示
該項目主要練習xml文件解析和面向對象思維;
1.電視台和節目信息都要從xml文件中解析,並綁定;
2.實現點擊電視頻道節點顯示該頻道的電視節目信息;
3.當時間到達用戶設置的節目提醒時間後彈出窗口提醒用戶節目即將開始;
效果演示
1.點擊頻道顯示該頻道的節目信息

2.選中全部電視台下的節點,右鍵顯示右鍵菜單‘添加到我的電視台’;

3.選中我的電視台下的節點,右鍵顯示右鍵菜單‘刪除’;

4:右鍵電視節目信息顯示設置提醒

5.點擊提醒管理顯示提醒窗體,右鍵提醒信息顯示刪除

xml文件
1.頻道信息
<?xml version="1.0" encoding="utf-8" ?>
<TVChannels>
<Channel>
<channelType>TypeA</channelType> <!--頻道類型-->
<tvChannel>北京電視台</tvChannel> <!--頻道名稱-->
<path>files/北京電視台.xml</path> <!--頻道對應XML文件的本地路徑-->
</Channel>
<Channel>
<channelType>TypeB</channelType>
<tvChannel>鳳凰衛視</tvChannel>
<path>files/鳳凰衛視.xml</path>
</Channel>
</TVChannels>
2.北京電視台
<?xml version="1.0" encoding="utf-8" ?>
<typeA version =" 1.0">
<channelName>北京電視台</channelName>
<tvProgramTable>
<tvProgram>
<playTime>2016-9-5 16:21</playTime> <!--節目播出時間-->
<meridien>早間檔</meridien> <!--時段-->
<programName>重播:國際雙行線</programName> <!--節目名稱-->
<path>c:\a.wma</path> <!--視頻路徑-->
</tvProgram>
<tvProgram>
<playTime>2016-9-5 16:22</playTime> <!--節目播出時間-->
<meridien>早間檔</meridien> <!--時段-->
<programName>北京您早</programName> <!--節目名稱-->
<path>C:\New Stories (Highway Blues).wma</path> <!--視頻路徑-->
</tvProgram>
<tvProgram>
<playTime>2009-9-29 09:02</playTime> <!--節目播出時間-->
<meridien>早間檔</meridien> <!--時段-->
<programName>重播《紅星劇場》32集劇:勇者無敵(31)</programName> <!--節目名稱-->
<path>**</path> <!--視頻路徑-->
</tvProgram>
<tvProgram>
<playTime>2009-9-29 09:58</playTime>
<meridien>早間檔</meridien>
<programName>重播《紅星劇場》32集劇:勇者無敵(32)</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 11:15</playTime>
<meridien>午間檔</meridien>
<programName>重播:專題片:我愛你,中國(14)</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 11:58</playTime>
<meridien>午間檔</meridien>
<programName>身邊</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 12:30</playTime>
<meridien>午間檔</meridien>
<programName>特別關注</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 13:05</playTime>
<meridien>午間激情檔</meridien>
<programName>網絡電視精靈</programName>
<path>H:\video\01網絡電視精靈.avi</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 13:40</playTime>
<meridien>午間檔</meridien>
<programName>《玫瑰劇場》55集劇:闖關東中篇(21)</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 14:32</playTime>
<meridien>午間檔</meridien>
<programName>《玫瑰劇場》55集劇:闖關東中篇(22)</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 15:27</playTime>
<meridien>下午檔</meridien>
<programName>《玫瑰劇場》55集劇:闖關東中篇(23)</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 16:19</playTime>
<meridien>下午檔</meridien>
<programName>《玫瑰劇場》55集劇:闖關東中篇(24)</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 17:31</playTime>
<meridien>下午檔</meridien>
<programName>法治進行時</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 18:00</playTime>
<meridien>晚間檔</meridien>
<programName>新聞晚高峰</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 18:30</playTime>
<meridien>晚間檔</meridien>
<programName>北京新聞</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 18:56</playTime>
<meridien>晚間檔</meridien>
<programName>天氣預報</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 19:00</playTime>
<meridien>晚間檔</meridien>
<programName>轉播CCTV新聞聯播</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 19:31</playTime>
<meridien>晚間檔</meridien>
<programName>看氣象</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 19:40</playTime>
<meridien>晚間檔</meridien>
<programName>專題片:我愛你,中國(15)</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 20:22</playTime>
<meridien>晚間檔</meridien>
<programName>《爸媽都是老黨員》首播慶典</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 21:21</playTime>
<meridien>晚間檔</meridien>
<programName>《紅星劇場》38集劇:咱爸咱媽六十年(1)</programName>
<path>**</path>
</tvProgram>
<tvProgram>
<playTime>2009-9-29 23:25</playTime>
<meridien>晚間檔</meridien>
<programName>重播文藝:花樣年華歌舞大賽(5)</programName>
<path>**</path>
</tvProgram>
</tvProgramTable>
</typeA>
3.鳳凰衛視
<?xml version="1.0" encoding="utf-8" ?>
<typeB version =" 1.0">
<ProgramList>
<Program>
<playTime>2009-9-29 01:30</playTime> <!--播出時間-->
<name>簡單工廠模式</name> <!--節目名稱-->
<path>D:\簡單工廠模式.wmv</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 02:10</playTime> <!--播出時間-->
<name>非凡人物論成功(713)</name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 02:15</playTime> <!--播出時間-->
<name>有報天天讀(28/09/09) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 02:40</playTime> <!--播出時間-->
<name>娛樂大風暴(682) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 03:15</playTime> <!--播出時間-->
<name>上海新長寧集團特約之2009中華小姐環球大賽-美麗前奏(41) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 03:20</playTime> <!--播出時間-->
<name>完全時尚手冊:天橋雲裳(632) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 03:40</playTime> <!--播出時間-->
<name>東風康明斯鳳凰沖擊播:天力士特約之今日看世界(39) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 04:25</playTime> <!--播出時間-->
<name>音樂中國風(442) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 04:35</playTime> <!--播出時間-->
<name>維維健康新概念(193) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 04:40</playTime> <!--播出時間-->
<name>紅牛鳳凰全球連線(28/09/09) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 05:05</playTime> <!--播出時間-->
<name>紅雲紅河時事開講(28/09/09) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
<Program>
<playTime>2009-9-29 05:30</playTime> <!--播出時間-->
<name>別巡檢調查隊(34)(R) </name> <!--節目名稱-->
<path>**</path> <!--節目視頻的本地路徑-->
</Program>
</ProgramList>
</typeB>
代碼:
1.頻道類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 網絡電視精靈
{
public abstract class ChannelBase
{
/// <summary>
/// 頻道類
/// </summary>
///
//頻道名稱
public string Name { get; set; }
//頻道節目集合
public List<TV> List { get; set; }
//頻道xml地址
public string Path { get; set; }
//頻道類型
public string Type { get; set; }
public ChannelBase(string name,string path,string type)
{
this.Name = name;
this.Path = path;
this.Type = type;
this.List = new List<TV>();
}
public ChannelBase()
{
}
public abstract void Fetch();
}
}
2.TV類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 網絡電視精靈
{
public class TV
{
/// <summary>
/// 電視節目類
/// </summary>
///
//節目開始時間
public DateTime PlayTime { get; set; }
//節目名稱
public string ProgramName { get; set; }
//節目地址
public string FilePath { get; set; }
public TV()
{
}
public TV( DateTime playtime,string name,string filepath)
{
this.PlayTime = playtime;
this.ProgramName = name;
this.FilePath = filepath;
}
}
}
3.工廠類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 網絡電視精靈
{
class Factory
{
/// <summary>
/// 工廠類
/// </summary>
/// <param name="type"></param>
/// <param name="name"></param>
/// <param name="path"></param>
/// <returns></returns>
//簡單工廠方法生成頻道對象
public static ChannelBase create(string type, string name, string path)
{
ChannelBase cb = null;
switch (type)
{
case "TypeA":
cb = new BJ(name, path,type);
break;
case "TypeB":
cb = new FH(name, path,type);
break;
}
return cb;
}
}
}
4.管理類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace 網絡電視精靈
{
class Management
{
//提醒類的靜態集合,用於保存添加的提醒
public static List<Remind> Rlist = new List<Remind>();
//管理類方法,處理xml文件,返回處理後的頻道對象的集合
public static List<ChannelBase> load()
{
List<ChannelBase> List = new List<ChannelBase>();
XmlDocument dic = new XmlDocument();
dic.Load("files\\FullChannels.xml");
XmlNode root = dic.DocumentElement;
foreach (XmlNode item in root)
{
ChannelBase cb=Factory.create(item["channelType"].InnerText,item["tvChannel"].InnerText,item["path"].InnerText);
cb.Fetch();
List.Add(cb);
}
return List;
}
//向提醒類集合添加對象的方法
public static bool remind(DateTime playtime, string ProgramName,DateTime reminddatetime)
{
bool flag =true;
foreach (Remind item in Rlist)
{
if (item.ProgramName == ProgramName && item.Reminddatetime == reminddatetime)
{
flag = false;
}
}
if (flag)
{
Remind r = new Remind(playtime, ProgramName, reminddatetime);
Management.Rlist.Add(r);
}
return flag;
}
}
}
5.北京電視台類
sing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace 網絡電視精靈
{
class BJ:ChannelBase
{
/// <summary>
/// 北京電視台類
/// </summary>
public BJ()
{
}
public BJ(string name, string path,string type)
: base(name,path,type)
{
}
//解析北京電視台xml文件方法
public override void Fetch()
{
XmlDocument doc = new XmlDocument();
doc.Load(Path);
XmlNode no = doc.DocumentElement;
foreach (XmlNode item in no)
{
if (item.Name == "tvProgramTable")
{
foreach (XmlNode it in item)
{
TV tv = new TV(Convert.ToDateTime(it["playTime"].InnerText), it["programName"].InnerText, it["path"].InnerText);
this.List.Add(tv);
}
}
}
}
}
}
6.鳳凰衛視類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace 網絡電視精靈
{
class FH:ChannelBase
{
/// <summary>
/// 鳳凰衛視類
/// </summary>
public FH()
{
}
public FH(string name,string path,string type)
: base(name,path,type)
{
}
//解析鳳凰衛視xml文件的方法
public override void Fetch()
{
XmlDocument doc = new XmlDocument();
doc.Load(Path);
XmlNode no = doc.DocumentElement;
foreach (XmlNode item in no.ChildNodes)
{
foreach (XmlNode it in item)
{
TV tv = new TV(Convert.ToDateTime(it["playTime"].InnerText),it["name"].InnerText,it["path"].InnerText);
this.List.Add(tv);
}
}
}
}
}
7.提醒類
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 網絡電視精靈
{
class Remind:TV
{
/// <summary>
/// 提醒類
/// </summary>
///
//提醒時間
public DateTime Reminddatetime { get; set; }
public Remind()
{
}
public Remind(DateTime playtime, string ProgramName, DateTime reminddatetime)
{
this.PlayTime = playtime;
this.ProgramName = ProgramName;
this.Reminddatetime = reminddatetime;
}
}
}
8.主窗體代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 網絡電視精靈
{
public partial class TvShow : Form
{
TreeNode root = null;
public static Remindmg rmg;
public TvShow()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//創建根節點
dataGridView1.AutoGenerateColumns = false;
root = new TreeNode("我的電視台");
tree.Nodes.Add(root);
info();
}
//創建所有電視台的方法
private void info()
{
TreeNode tn = new TreeNode("所有電視台");
tree.Nodes.Add(tn);
List<ChannelBase> list = Management.load();
foreach (ChannelBase item in list)
{
item.Fetch();
TreeNode tn1 = new TreeNode(item.Name);
tn1.Tag = item;
tn.Nodes.Add(tn1);
}
}
private void tree_AfterSelect(object sender, TreeViewEventArgs e)
{
//顯示右鍵菜單的方法
if (tree.SelectedNode.Tag != null)
{
dataGridView1.DataSource = ((ChannelBase)tree.SelectedNode.Tag).List;
}
foreach (TreeNode item in tree.Nodes)
{
foreach (TreeNode item1 in item.Nodes)
{
if (item1.Parent.Text == tree.Nodes[0].Text && item1 == tree.SelectedNode)
{
tree.ContextMenuStrip = contextMenuStrip1;
}
else if (item1.Parent.Text == tree.Nodes[1].Text && item1 == tree.SelectedNode)
{
tree.ContextMenuStrip = contextMenuStrip2;
}
else if (item == tree.SelectedNode)
{
tree.ContextMenuStrip = null;
}
}
}
}
private void tree_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
{
}
private void 加入我的電視台ToolStripMenuItem_Click(object sender, EventArgs e)
{
//將頻道加入我的我的電視台的方法
bool flag = true;
foreach (TreeNode item in tree.Nodes[0].Nodes)
{
if (item.Text == tree.SelectedNode.Text)
{
flag = false;
}
}
if (flag)
{
TreeNode tn = new TreeNode(tree.SelectedNode.Text);
tn.Tag = tree.SelectedNode.Tag;
root.Nodes.Add(tn);
}
else
{
MessageBox.Show("已經添加到我的電視了","提示");
}
}
private void 刪除ToolStripMenuItem_Click(object sender, EventArgs e)
{
//刪除我的頻道的方法
tree.SelectedNode.Remove();
}
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
//添加播放時提醒
DateTime Remind = Convert.ToDateTime(dataGridView1.SelectedRows[0].Cells[0].Value);
Add(Remind);
}
private void Add(DateTime Remind)
{
//添加提醒的方法
DateTime playdatime = Convert.ToDateTime(dataGridView1.SelectedRows[0].Cells[0].Value);
string name = dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
if (Management.remind(playdatime, name, Remind))
{
MessageBox.Show("添加成功", "提示");
updateRmg();
}
else
{
MessageBox.Show("添加失敗,已經添加過該提醒了", "提示");
}
}
//更新提醒列表的方法
public void updateRmg()
{
if (rmg != null)
{
rmg.Remindmginfo();
}
}
private void 提前十分鐘提醒ToolStripMenuItem_Click(object sender, EventArgs e)
{
//提前十分鐘提醒
DateTime Remind = Convert.ToDateTime(dataGridView1.SelectedRows[0].Cells[0].Value).AddMinutes(-10);
Add(Remind);
}
private void 提前三十分鐘提醒ToolStripMenuItem_Click(object sender, EventArgs e)
{
//提前三十分鐘提醒
DateTime Remind = Convert.ToDateTime(dataGridView1.SelectedRows[0].Cells[0].Value).AddMinutes(-30);
Add(Remind);
}
private void timer1_Tick(object sender, EventArgs e)
{
//到時提醒的方法
string time=DateTime.Now.ToString("yyyy-MM-dd hh:mm");
Remind r = null;
foreach (Remind item in Management.Rlist)
{
if ((item.Reminddatetime.ToString("yyyy-MM-dd hh:mm")).Equals(time))
{
MessageBox.Show(item.ProgramName+"馬上就要開始了","提示",MessageBoxButtons.OK);
r = item;
}
}
if (r != null)
{
Management.Rlist.Remove(r);
updateRmg();
}
}
private void 提醒管理ToolStripMenuItem_Click(object sender, EventArgs e)
{
//點擊提醒管理打開提醒窗體
Remindmg from = new Remindmg();
from.Show();
}
}
}
9.提醒窗體代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 網絡電視精靈
{
public partial class Remindmg : Form
{
public Remindmg()
{
InitializeComponent();
}
private void Remindmg_Load(object sender, EventArgs e)
{
//設置不顯示未綁定的列
dataGridView1.AutoGenerateColumns = false;
//獲取提醒窗體對象
TvShow.rmg = this;
Remindmginfo();
}
//綁定數據源
public void Remindmginfo()
{
BindingSource bs = new BindingSource();
bs.DataSource = Management.Rlist;
dataGridView1.DataSource = bs;
}
//刪除的方法
private void 刪除提醒ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (dataGridView1.SelectedRows.Count > 0)
{
Remind r = null;
string name = dataGridView1.SelectedRows[0].Cells["ProgramName"].Value.ToString();
string datetime = dataGridView1.SelectedRows[0].Cells["remindtime"].Value.ToString();
foreach (Remind item in Management.Rlist)
{
if (item.ProgramName == name && item.Reminddatetime.ToString().Equals(datetime))
{
r = item;
}
}
if (r != null
)
{
Management.Rlist.Remove(r);
Remindmginfo();
}
}
}
}
}