话不多少,今天要写一个小项目。我们写项目要做好准备。我们要做项目分析。要知道用户需求,然后在根据需求来规划自己的项目。我们要用自己所学,做最好的程序。尽自己所能完成项目需求。精简代码!

我们今天要写的项目叫网络电视精灵。首先我们要做到的是要把我们事先写好的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!

一个年轻的码农的一个C#项目的更多相关文章

  1. Android码农如何一个星期转为iOS码农(不忽悠)

    WeTest 导读 作为一个android客户端开发,如果你不懂点ios开发,怎么好意思说自己是客户端开发呢,本文讲解如何让android开发码农在一个星期上手IOS开发 --<记录自己IOS开 ...

  2. 一个普通 iOS 码农的几个小项目相关知识点总结

    题记:在开发的路途上,有的人走的很深很远,而对于停留在初级阶段的我来说,还要学的.经历的还有很多... list sqlite 数据库中,当把表里的数据都清空时,下次插入的数据的 id 主键不会从 0 ...

  3. 2020互联网寒冬之下,作为一个Android老码农,是如何进入腾讯的?

    由于众所周知的原因,原生Android开发如今已经日渐凋敝,作为一个Android程序员,不仅要会Java,Kotlin,JavaScript,Css,Html,还要会Flutter,C++,FFmp ...

  4. 老码农教你在 StackOverflow 上谈笑风生

    作为一个高大上的码农,你肯定用到过 StackOverflow,必须的.会有人否定这个断言么?那他恐怕不是真正的码农,或者说还没入门.StackOverflow 对于码农的重要性,基本就和诸葛亮对刘备 ...

  5. 做为一个.net码农,打开公司的一个项目,大叔我哭了

    先说下背景,楼主在上海,之前一直是做BS互联网开发的,今年进入这家公司,是做软件产品的小外企. 然后,啥也不说了,直接上图吧: 因为一个屏幕没有办法显示出来,所以我截了3张图,然后拼成一张,这还是我花 ...

  6. 管理与技术未必不可兼得,一个20年IT老兵的码农生涯

    作者|康德胜 我是一个喜欢写代码但几乎不太有机会写代码的CTO,也是一个看得懂财务报表.通过所有CFA(金融特许分析师)考试并获得FRM(金融风险经理)认证的拿到金融MBA的CTO,如果我有幸被称作码 ...

  7. 工业界 vs. 学术界: 一个年轻员工的视角

    本文发表于<中国计算机学会通讯>2015年第5期,转载已获得授权 作者:菲利普·郭 (Philip Guo),美国罗切斯特大学助理教授 译者:​王长虎,微软亚洲研究院主管研究员 如果你即将 ...

  8. 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用

    因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码  https ...

  9. [ASP.NET]分析MVC5源码,并实现一个ASP.MVC

    本节内容不是MVC入门教程,主要讲MVC原理,实现一个和ASP.NET MVC类似基本原理的项目. MVC原理是依赖于ASP.NET管道事件基础之上的.对于这块,可阅读上节内容 [ASP.NET]谈谈 ...

随机推荐

  1. Oracle 中 decode 函数用法

    Oracle 中 decode 函数用法 含义解释:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下:IF 条件=值1 THEN RETURN(翻译 ...

  2. Unity3D 动态改变地形

    直接获取TerrainData进行修改即可 using System.Collections; using UnityEngine; using UnityEditor; public class D ...

  3. mysql获取一个表中的下一个自增(id)值的方法

    SELECT Auto_increment FROM information_schema.`TABLES` WHERE Table_Schema='数据库名' AND table_name = '表 ...

  4. [Machine Learning] logistic函数和softmax函数

    简单总结一下机器学习最常见的两个函数,一个是logistic函数,另一个是softmax函数,若有不足之处,希望大家可以帮忙指正.本文首先分别介绍logistic函数和softmax函数的定义和应用, ...

  5. 【转】FlashBack总结之闪回查询与闪回表

    本文主要介绍利用UNDO表空间的闪回技术,主要包括:闪回表,闪回版本查询,闪回事务查询,闪回查询.这些闪回技术实现从回滚段中读取表中一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错 ...

  6. Jquery制作--焦点图左右轮播

    公司项目经常用到轮播焦点图,于是自己写了一个纯jq形式的横向轮播焦点图,可点击小圆点或者左右按钮进行切换,属于定宽类型.改成自适应宽度的也不难,将css里面的bannerCon宽度改为百分比,再在js ...

  7. discuz首页设置默认地址不带forum.php后缀的方法

    最近在研究discuz,上传安装几部搞定,打开首页跳到含有"/forum.php"的网址,到管理中心改了好一会儿也没好.那么如何实现discuz首页设置不带forum.php后缀呢 ...

  8. 数据库操作,jdbc的CRUD

    用Java代码操作数据库,可以用JDBC.首先要加载驱动,之后建立连接,再然后就可以对数据库进行操作. 1.建立连接.此处用的是MySQL数据库 public class DBUtil { publi ...

  9. WebService -- Java 实现之 CXF ( 使用:Spring+CXF+Tomcat发布webService)

    1. 新建一个Maven项目,选择webapp模板,命名为WS_Spring_CXF_Tomcat 2. 在POM.xml中添加Spring和CXF的依赖 <!-- 添加 Spring depe ...

  10. linux下用c实现ls命令

    struct dirent中的几个成员: d_type:4表示为目录,8表示为文件 d_reclen:16表示子目录或文件,24表示非子目录 d_name:目录或文件的名称 #include < ...