一个年轻的码农的一个C#项目
话不多少,今天要写一个小项目。我们写项目要做好准备。我们要做项目分析。要知道用户需求,然后在根据需求来规划自己的项目。我们要用自己所学,做最好的程序。尽自己所能完成项目需求。精简代码!
我们今天要写的项目叫网络电视精灵。首先我们要做到的是要把我们事先写好的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#项目的更多相关文章
- Android码农如何一个星期转为iOS码农(不忽悠)
WeTest 导读 作为一个android客户端开发,如果你不懂点ios开发,怎么好意思说自己是客户端开发呢,本文讲解如何让android开发码农在一个星期上手IOS开发 --<记录自己IOS开 ...
- 一个普通 iOS 码农的几个小项目相关知识点总结
题记:在开发的路途上,有的人走的很深很远,而对于停留在初级阶段的我来说,还要学的.经历的还有很多... list sqlite 数据库中,当把表里的数据都清空时,下次插入的数据的 id 主键不会从 0 ...
- 2020互联网寒冬之下,作为一个Android老码农,是如何进入腾讯的?
由于众所周知的原因,原生Android开发如今已经日渐凋敝,作为一个Android程序员,不仅要会Java,Kotlin,JavaScript,Css,Html,还要会Flutter,C++,FFmp ...
- 老码农教你在 StackOverflow 上谈笑风生
作为一个高大上的码农,你肯定用到过 StackOverflow,必须的.会有人否定这个断言么?那他恐怕不是真正的码农,或者说还没入门.StackOverflow 对于码农的重要性,基本就和诸葛亮对刘备 ...
- 做为一个.net码农,打开公司的一个项目,大叔我哭了
先说下背景,楼主在上海,之前一直是做BS互联网开发的,今年进入这家公司,是做软件产品的小外企. 然后,啥也不说了,直接上图吧: 因为一个屏幕没有办法显示出来,所以我截了3张图,然后拼成一张,这还是我花 ...
- 管理与技术未必不可兼得,一个20年IT老兵的码农生涯
作者|康德胜 我是一个喜欢写代码但几乎不太有机会写代码的CTO,也是一个看得懂财务报表.通过所有CFA(金融特许分析师)考试并获得FRM(金融风险经理)认证的拿到金融MBA的CTO,如果我有幸被称作码 ...
- 工业界 vs. 学术界: 一个年轻员工的视角
本文发表于<中国计算机学会通讯>2015年第5期,转载已获得授权 作者:菲利普·郭 (Philip Guo),美国罗切斯特大学助理教授 译者:王长虎,微软亚洲研究院主管研究员 如果你即将 ...
- 二维码合成,将苹果和安卓(ios和android)合成一个二维码,让用户扫描一个二维码就可以分别下载苹果和安卓的应用
因为公司推广的原因,没有合适的将苹果和安卓(ios和android)合成一个二维码的工具. 因为这个不难,主要是根据浏览器的UA进行判断,所以就自己开发了一个网站 网站名称叫:好推二维码 https ...
- [ASP.NET]分析MVC5源码,并实现一个ASP.MVC
本节内容不是MVC入门教程,主要讲MVC原理,实现一个和ASP.NET MVC类似基本原理的项目. MVC原理是依赖于ASP.NET管道事件基础之上的.对于这块,可阅读上节内容 [ASP.NET]谈谈 ...
随机推荐
- SFDC中的DEBUG
SFDC的顾问初期,基本都是做一些配置的工作,权限,字段,工作流和审批流之类.那么在这些工作流或者审批流没有按照你预想的来运行而且你检查了多遍后没有找到问题所在的时候.你就需要DEBUG了. 做过开发 ...
- SQL 归来
1. PL/SQL 转义 select order#, ……… from **** select col1 from A where col2 like '%\_keywors%' escape ' ...
- [Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!
引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI ...
- linux文件及文件夹权限
以前上学的时候简单了解了下linux,现在对它的认识也只停留在一些小白命令上.以为我只要不是做服务器端开发的应该不会去碰吧,工作了才知道做开发的多少还是要熟悉一些linux的,至少你的项目会部署在li ...
- qq空间等闪动的文字怎么做?
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- php-fpm启动,重启,终止操作
最近安装了mysqli扩展,重启了nginx后,phpinfo()没有显示出mysqli,后来搞不出原因,直接使用了pdo连接数据库.直到今天安装redis后phpinfo()没有显示redis,内心 ...
- Eclispe远程调试tomcat设置
首先在catelina.sh中添加 JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=23787,server=y,su ...
- ROLAP和MOLAP的概念和差别
ROLAP和MOLAP的概念和差别OLAP(on-Line Analysis Processing)是使分析人员.管理人员或执行人员能够从多角度对信息进行快速.一致.交互地存取,从而获得对数据的更深入 ...
- 鼠标上下滑动总是放大缩小页面,按住ctrl+0
鼠标上下滑动总是放大缩小页面,可能是ctrl键失灵了,幸好键盘有两个ctrl键,按住ctrl+0,页面就正常了,吓死宝宝了,~~~~(>_<)~~~~
- kali 安装ss代理客户端的方法(纯属个人总结)
1.声明版本,因为别的版本没测试过 2.下载客户端安装包 wget https://github.com/shadowsocks/shadowsocks/archive/master.zip 这个是代 ...