話不多少,今天要寫一個小項目。我們寫項目要做好准備。我們要做項目分析。要知道用戶需求,然后在根據需求來規划自己的項目。我們要用自己所學,做最好的程序。盡自己所能完成項目需求。精簡代碼!
我們今天要寫的項目叫網絡電視精靈。首先我們要做到的是要把我們事先寫好的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!
