
·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> C#畅谈“网络电视”
C#畅谈“网络电视”



以上是大家比较喜欢的网络电视软件,例如:PPTV,BOX央视影音,PPS等。
今天我就和大家来聊一下简单的“网络电视”。虽然和上边的软件没发比,但是正在向着这个目标努力中……
一开始我在做这个项目的时候思路很茫然,就像地上的一团线团一样。
我需要用到哪些方法?需要建几个类?
拿到一个项目的时候首先要分析我想大家都知道
主界面如下:

既然是网络电视,那么肯定有很多的频道供用户去选择。所以肯定有频道类,要定义一个频道的基类(ChannelBase),让所有频道类继承这个基类,提高抽象程度会更方便一些。
频道管理类(ChannelManager)也是必不可少的,要不怎么去管理那么多的频道呢!
选择频道,频道下面就会有节目,节目类也随之而来。
这里我定义了两个频道类(TypeAChannel类,TypeBChannel类),关系如下:
1 public class TypeAChannel:ChannelBase
1 public class TypeBChannel:ChannelBase
频道基类(ChannelBase)代码如下:
1 //频道基类
2 public abstract class ChannelBase
3 {
4 //频道名称
5 public string ChannelName { get; set; }
6 //频道路径
7 public string Path { get; set; }
8 //节目列表,该频道上的所有节目列表
9 public List<TvPRogram> TvList { get; set; }
10 //获取频道列表:通过Fetch方法获取该频道拥有的所有节目列表
11 public abstract void Fetch();
12 //频道类型
13 public string Type { get; set; }
14 }
节目类(TvProgram)代码如下:
1 //节目类
2 public class TvProgram
3 {
4 //播出时间
5 public DateTime PlayTime { get; set; }
6 //早间档,午间档,晚间档
7 public string Shiduan { get; set; }
8 //节目名称
9 public string ProgramName { get; set; }
10 //视频路径
11 public string Path { get; set; }
12 }
接下来可以着手绑定treeView了。
首先先添加根节点:
1 private void LoadRootNode()
2 {
3 TreeNode mineNode = new TreeNode();
4 mineNode.Text = "我的电视台";
5
6 allNode.Text = "所有电视台";
7
8 treeView1.Nodes.Add(mineNode);
9 treeView1.Nodes.Add(allNode);
10 }
treeView里代码如下:
1 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
2 {
3 TreeNode selectNode = treeView1.SelectedNode;
4 if (selectNode.Level==1 && selectNode.Parent.Text=="所有电视台")
5 {
6 ChannelBase channel = (ChannelBase)selectNode.Tag;
7 channel.Fetch();
8
9 List<TvProgram> ProList = channel.TvList;
10 dataGridView1.DataSource = ProList;
11 }
12 }
接下来把LoadRootNode()方法在Load中调用一下:
1 private void Form1_Load(object sender, EventArgs e)
2 {
3 LoadRootNode();
4 ChannelManager manager = new ChannelManager();
5 manager.Paresexml();
6 Dictionary<string,ChannelBase> dic=manager.FullChannel;
7 foreach (var channel in dic.Values)
8 {
9 TreeNode tn = new TreeNode();
10 tn.Text = channel.ChannelName;
11 tn.Tag = channel;
12 allNode.Nodes.Add(tn);
13 }
14 }
到这里treeView已经绑定完成了,那么我上边是不是犯了一个小错误呢?会导致什么后果?
没错,相信大家都猜到了,我在调用Fetch()方法之前,节目列表没有清除,可以用下面的方法:
1 if (channel.TvList != null)
2 {
3 channel.TvList.Clear();
4 }
正确的代码如下:
1 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
2 {
3 TreeNode selectNode = treeView1.SelectedNode;
4 if (selectNode.Level==1 && selectNode.Parent.Text=="所有电视台")
5 {
6 ChannelBase channel = (ChannelBase)selectNode.Tag;
7 if (channel.TvList != null)
8 {
9 channel.TvList.Clear();
10 }
11 channel.Fetch();
12
13 List<TvProgram> ProList = channel.TvList;
14 dataGridView1.DataSource = ProList;
15 }
16 }
频道管理类:
1 //频道管理类
2 public class ChannelManager
3 {
4 public ChannelManager()
5 {
6 fullChannel = new Dictionary<string, ChannelBase>();
7 }
8
9 private Dictionary<string, ChannelBase> fullChannel = new Dictionary<string, ChannelBase>();
10 public Dictionary<string, ChannelBase> FullChannel
11 {
12 get { return fullChannel; }
13 set { fullChannel = value; }
14 }
15 public void PareseXML()
16 {
17 XmlDocument doc = new XmlDocument();
18 doc.Load("FullChannels.xml");
19 XmlNode root = doc.DocumentElement;
20 foreach (XmlNode node in root.ChildNodes)
21 {
22 string type = node["channelType"].InnerText;
23 ChannelBase channel = ChannelFactory.CreatChannel(type);
24 channel.ChannelName = node["tvChannel"].InnerText;
25 channel.Path = node["path"].InnerText;
26 channel.Type = type;
27
28 fullChannel.Add(channel.ChannelName,channel);
29 }
30 }
31 }
这里列举一个频道TypeAChannel类:
1 //A频道类
2 public class TypeAChannel:ChannelBase
3 {
4 //多态,覆盖父类的获取频道列表方法
5 public override void Fetch()
6 {
7 XmlDocument doc = new XmlDocument();
8 doc.Load("北京电视台.xml");
9 if (TvList == null)
10 {
11 TvList = new List<TvProgram>();
12 }
13 //获取根节点
14 XmlNode root = doc.DocumentElement;
15 foreach (XmlNode item in root.ChildNodes)
16 {
17 if (item.Name == "tvProgramTable")
18 {
19 foreach (XmlNode child in item.ChildNodes)
20 {
21 //一个item就是一个tvProgram节点
22 TvProgram program = new TvProgram();
23 program.PlayTime = Convert.ToDateTime(child["playTime"].InnerText);
24 program.Shiduan = child["meridien"].InnerText;
25 program.ProgramName = child["programName"].InnerText;
26 program.Path = child["path"].InnerText;
27 TvList.Add(program);
28 }
29 }
30 }
31 }
32 }
频道TypeBChannel类和TypeAChannel类一样。
至此基本功能已经完成,那么接下来大家也可以接着制作如下功能:

右键我的电视台下的频道会只有删除选项,右键所有电视台会只有加入我的电台选项。
那么还有提醒功能,就是用户可以设一个时间点,到时间了会提醒用户去收看,有兴趣的可以研究一下。