你的位置:首页 > ASP.net教程

[ASP.net教程]网络电视精灵的框架及关键代码


效果:

编写节目类 属性:播出时间、时段、名称、视频路径

编写频道基类 属性:频道名称、频道节目单位置、节目列表 抽象方法:Fetch()

编写频道子类 继承“频道基类”,实现Fetch()【只写方法声明】

编写频道工厂类 方法:实现创建频道子类

第一步.创建几个类:

01:创建一个电视类(TvProgram)

该类主要负责定义节目的属性,为后续从

属性为:   

 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文件(北京电视台.

 

04:创建一个B类频道(TypeBChannel)

该类主要负责解析文件(凤凰卫视.)

05:创建一个工厂类(工具类)(ChannelFactory)

该类主要负责频道的选择

总结:ChannelBase,TypeAChannel,TypeBChannel,ChannelFactory四个类主要控制频道信息

06:创建一个管理类(ChannelManager)

创建一个方法LoadAllChannel():解析文件

该类主要作用实质上减轻窗体中的代码量。相当于程序的工具类。

第二步.写代码的核心思路:

01.首先在频道管理类ChannelManager中写一个加载所有频道方法LoadAllChannel;

该方法作用读取FullChannels.文件,并且将读取到的内容赋值给ChannelBase          对象。关键的问题就转化成了如何创建一个ChannelBase对象。我们都知道ChannelBase本身是一个抽象类,无法创建实例。由此,我们想到可以通过其子类来创建对象。由于不同子类实例化需要多次new,我们单独写了一个工厂类(ChannelFafactory),来创建子类实例,但是该子类实例存储在父类变量中。赋值完成后,我们需要将频道对象添加到字典中。那么LoadAllChannel方法结束后,字典中就有

本地硬盘上的

代码:

 public Dictionary<string, ChannelBase> Fulllist    {      get { return fulllist; }      set { fulllist = value; }    }    private string channelPath = "files/FullChannel.";   //构造函数中new   public ChannelManager() {     fulllist = new Dictionary<string, ChannelBase>();   }   //解析   public void ReadFiles() {     fulllist.Clear();     = new = doc.DocumentElement;     foreach (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()    {      = new = doc.DocumentElement;      if (Tvlist == null)      {        Tvlist = new List<TvProgram>();      }      foreach (in root.ChildNodes)      {        TvProgram tvp = new TvProgram();        if (child.Name == "tvProgramTable")        {          foreach (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;      }