一个年轻的码农的一个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]谈谈 ...
随机推荐
- [转] Windows下编译OpenSSL
简述 OpenSSL是一个开源的第三方库,它实现了SSL(Secure SocketLayer)和TLS(Transport Layer Security)协议,被广泛企业应用所采用.对于一般的开发人 ...
- Demo 版
Demo1 美食网站 Demo2 12301智慧旅游公共服务平台 Demo3 react_and_koa example
- Java动态加载JAR包
参考代码: package org; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import ...
- 通过akRegionCode找到对应的程序
在Oracle EBS中,有一些程序是从上一个版本的Web开发框架(AK)转成OAF的,而这部分程序定义的功能与一般的OAF页面不同,OAF页面使用 OA.jsp?page=/oracle/apps/ ...
- 如何删除已安装的Windows服务
1) 开始-运行,输入regedit命令. (Windows键+R,输入regdeit) 2) 回车后会弹出一个窗口:注册编辑器.找到 HKEY_LOCAL_MACHINE\SYSTEM\Curre ...
- iptables过滤设置服务端口
1.为SSH跟换连接端口 修改SSH配置文件:/etc/ssh/sshd_config #找到Port 22,这里是标识默认使用22端口,修改为想要的端口. Port Port 2.查看iptable ...
- Struts2第一个入门案例
一.如何获取Struts2,以及Struts2资源包的目录结构的了解 Struts的官方地址为http://struts.apache.org 在他的主页当中,我们可以通过左侧的Apache ...
- 提升PHP编程效率的20个要素
用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(兄弟连PHP编程: ...
- MySQL ROOT密码更改
MySQLROOT密码 # mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'lo ...
- java 单例模式
懒汉式 public class Singleton{ //@单例类只能有一个实例 //@单例类必须自行创建这个实例 //@单例类必须给所有对象提供这一个实例//必须向整个系统提供这个这个实例 pri ...