話不多少,今天要寫一個小項目。我們寫項目要做好准備。我們要做項目分析。要知道用戶需求,然后在根據需求來規划自己的項目。我們要用自己所學,做最好的程序。盡自己所能完成項目需求。精簡代碼!
我們今天要寫的項目叫網絡電視精靈。首先我們要做到的是要把我們事先寫好的XML文件解析好放到TreeView空間上顯示。,並選擇一個Treeview的節點顯示其對應的信息到DateGridView上!
有幾個細節要求寫到再說!下面有彩蛋!!!
做好的窗體是這個樣子的!
啟動是這個樣子的
所有的類是這個樣子的
每個類的代碼和注釋
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chap_網絡電視精靈 { /// <summary> /// 電視頻道父類,抽象類 /// </summary> public abstract class ChannelBase { //這是一堆自動屬性,很簡單就是要來接收Xml文件的信息的! public string ChannelName { get; set; } public string Path { get; set; } public string ChannelType { get; set; } public List<TvProgram> list { get; set; } public abstract void Fetch(); //數據類型為List<TvProgram>的單列泛型集合 private List<TvProgram> ProgramList = new List<TvProgram>(); public List<TvProgram> ProgramList1 { get { return ProgramList; } set { ProgramList = value; } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chap_網絡電視精靈 { public class ChannelFactory { /// <summary> /// 工廠類 /// </summary> /// <param name="type"></param> /// <returns></returns> public static ChannelBase CreateChannel(string type) { ChannelBase channel = null; switch(type) { case "TypeA": channel = new TypeAChannel(); break; case "TypeB": channel = new TypeBChannel(); break; default: break; } return channel; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace Chap_網絡電視精靈 { /// <summary> /// 節目管理類 /// </summary> class ChannelManager { //單列泛型集合 private List<ChannelBase> list = new List<ChannelBase>(); public List<ChannelBase> List { get { return list; } set { list = value; } } //解析XML文件的方法 public void ResolveChannels() { //1.1 我將解析好的Data中轉存放到泛型集合 //List<自定義類> XmlDocument doc = new XmlDocument(); doc.Load("FullChannels.xml"); //找根節點 XmlNode root = doc.DocumentElement; foreach (XmlNode item in root.ChildNodes) { //一個item代表什么 Channel ChannelBase channel = Factory.CreateFactory(item["channelType"].InnerText); channel.ChannelType = item["channelType"].InnerText; channel.ChannelName = item["tvChannel"].InnerText; channel.Path = item["path"].InnerText; //歸屬到一個集合中 list.Add(channel); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chap_網絡電視精靈 { /// <summary> /// 簡單工廠類 /// </summary> class Factory { //一個靜態的返回值為ChannelBase類型的方法 public static ChannelBase CreateFactory(string type) { ChannelBase types = null; switch (type) { case "TypeA": types = new TypeAChannel(); break; case "TypeB": types = new TypeBChannel(); break; } return types; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Chap_網絡電視精靈 { /// <summary> /// 電視頻道類 /// </summary> public class TvProgram { //節目名稱 public string ProgramName { get; set; } //時段 public string Meridien { get; set; } //節目路徑 public string Path { get; set; } //時間 public DateTime PlayTime { get; set; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace Chap_網絡電視精靈 { /// <summary> /// A類頻道類 /// </summary> class TypeAChannel : ChannelBase { //重寫父類的抽象方法,解析XML文件並綁定到泛型集合上 public override void Fetch() { XmlDocument doc = new XmlDocument(); doc.Load("北京電視台.xml"); XmlNode root = doc.DocumentElement; //找根節點 foreach (XmlNode item in root.ChildNodes)//遍歷子節點 { if(item.Name.Equals("tvProgramTable"))//判斷條件是節點的Name是否是"tvProgramTable" { foreach (XmlNode items in item.ChildNodes)//遍歷子節點的子節點 { TvProgram Tp = new TvProgram(); Tp.PlayTime = Convert.ToDateTime(items["playTime"].InnerText); Tp.Meridien = items["meridien"].InnerText; Tp.Path = items["path"].InnerText; Tp.ProgramName = items["programName"].InnerText; ProgramList1.Add(Tp);//綁定到集合 } } } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace Chap_網絡電視精靈 { class TypeBChannel : ChannelBase { //解析XML文件的方法 public override void Fetch() { //1.1 我將解析好的Data中轉存放到泛型集合 //List<自定義類> XmlDocument doc = new XmlDocument(); doc.Load("鳳凰衛視.xml"); //找根節點 XmlNode root = doc.DocumentElement; foreach (XmlNode item in root.ChildNodes)//遍歷子節點 { if (item.Name.Equals("ProgramList"))//判斷條件是節點的Name是否是"tvProgramTable" { foreach (XmlNode items in item.ChildNodes)//遍歷子節點的子節點 { TvProgram Tp = new TvProgram(); Tp.PlayTime = Convert.ToDateTime(items["playTime"].InnerText); Tp.Path = items["path"].InnerText; Tp.ProgramName = items["name"].InnerText; ProgramList1.Add(Tp);//綁定到集合 } } } } } }
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; using System.Xml; namespace Chap_網絡電視精靈 { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } bool flag = false; private void FrmMain_Load(object sender, EventArgs e) { Insert(); flag = true; }
//綁定TreeView的數據 public void Insert() { TreeNode minenode = new TreeNode(); minenode.Text = "我的電視台"; //bind tvList.Nodes.Add(minenode); //根節點 TreeNode root = new TreeNode(); root.Text = "所有電視台"; //bind tvList.Nodes.Add(root); ChannelManager manager = new ChannelManager(); manager.ResolveChannels(); List<ChannelBase> list = manager.List; foreach (ChannelBase item in list) { TreeNode tn = new TreeNode(); tn.Text = item.ChannelName; tn.Tag = item; root.Nodes.Add(tn); } } private void tvList_AfterSelect(object sender, TreeViewEventArgs e) { if(flag) {
//讓右鍵選擇菜單分開顯示 if (tvList.SelectedNode.Level == 0) { ctms.Items[0].Visible = false; ctms.Items[1].Visible = false; } else if (tvList.SelectedNode.Parent.Text == "我的電視台") { ctms.Items[0].Visible = true; ctms.Items[1].Visible = false; } else if (tvList.SelectedNode.Parent.Text == "所有電視台") { ctms.Items[0].Visible = false; ctms.Items[1].Visible = true; } TreeNode selectNode = tvList.SelectedNode; if (selectNode.Tag == null) { return; } ChannelBase channel = (ChannelBase)selectNode.Tag; //給LIst集合填充數據 channel.Fetch(); List<TvProgram> list = channel.ProgramList1; clear(list); } } public void clear(List<TvProgram> list) { dgvList.AutoGenerateColumns = false; dgvList.DataSource = new BindingList<TvProgram>(list); } private void dgvList_CellContentClick(object sender, DataGridViewCellEventArgs e) { } private void 加入我的電視台ToolStripMenuItem_Click(object sender, EventArgs e) {
//右鍵加入我的電視台 ChannelBase channel = (ChannelBase)tvList.SelectedNode.Tag; TreeNode node = new TreeNode(); node.Text = channel.ChannelName; node.Tag = channel; tvList.Nodes[0].Nodes.Add(node); } private void 刪除ToolStripMenuItem_Click(object sender, EventArgs e) { //刪除所選中的節點 XmlDocument doc = new XmlDocument(); doc.Load("FullChannels.xml"); //找根節點 () XmlNode root = doc.DocumentElement; foreach (XmlNode item in root.ChildNodes) { if (item["tvChannel"].InnerText == tvList.SelectedNode.Text) { tvList.SelectedNode.Remove(); break; } } } } }
我是彩蛋!!!
所有代碼都在上面了,最后總結一下思路!我們首先把電視頻道的XML文件解析到單列泛型集合里,然后把集合的數據綁定到TreeView控件上並綁定Tag值為ChannelBase對象;然后通過選中的節點的Tag值拿到電視節目解析完的泛型集合來綁定DateGridView!