分享
 
 
 

网络电视精灵

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: |||超大  

网络电视精灵任务描述1. 解析xml文件中的数据

三个简单的xml文件;

<?xml version="1.0"encoding="utf-8"?>

<TVChannele>

<Channel>

<channelType>TypeA</channelType>

<tvChannel>北京电视台</tvChannel>

<path>files/北京电视台.xml</path>

</Channel>

<Channel>

<channelType>TypeB</channelType>

<tvChannel>凤凰卫视</tvChannel>

<path>files/凤凰卫视.xml</path>

</Channel>

</TVChannele>

FullChannels

<?xml version="1.0"encoding="utf-8"?>

<typeA version ="1.0">

<channelName>北京电视台</channelName><!--电视台-->

<tvPRogramTable>

<tvProgram>

<playTime>2013-9-2906:02</playTime><!--节目播出时间-->

<meridien>早间档</meridien><!--时段-->

<programName>重播:国际双行线</programName><!--节目名称-->

<path>E:\</path><!--节目视频的本地路径-->

</tvProgram>

<tvProgram>

<playTime>2013-9-2907:00</playTime>

<!--节目播出时间-->

<meridien>早间档</meridien>

<!--时段-->

<programName>北京您早</programName>

<!--节目名称-->

<path>E:\</path>

<!--节目视频的本地路径-->

</tvProgram>

<tvProgram>

<playTime>2013-9-2909:02</playTime>

<!--节目播出时间-->

<meridien>早间档</meridien>

<!--时段-->

<programName>重播:《红星剧场》32集剧:勇者无敌</programName>

<!--节目名称-->

<path>E:\</path>

<!--节目视频的本地路径-->

</tvProgram>

</tvProgramTable>

</typeA>

北京电视台.xml

<?xml version="1.0"encoding="utf-8"?>

<typeB version ="1.0">

<channelName>凤凰电视台</channelName>

<!--电视台-->

<tvProgramTable>

<tvProgram>

<playTime>2013-9-2901:30</playTime>

<!--节目播出时间-->

<meridien>早间档</meridien>

<!--时段-->

<programName>重播:国际双行线</programName>

<!--节目名称-->

<path>E:\</path>

<!--节目视频的本地路径-->

</tvProgram>

</tvProgramTable>

</typeB>

凤凰卫视.xml

2. 将”FullChannels.xml”文件中所有的频道添加到窗体的TreeView控件中.

3. 在TreeView控件中选取频道,将该频道的节目列表显示在窗体的DataGrideView控件中.

项目框架的搭建分析网络精灵的大致结构,创建对应的类

1. 创建对应的类

ChannelFactory(简单工厂):通过简单工厂创建频道子类

publicclassChannelFactory

{//通过工厂创建频道子类publicstaticChannelBase CreateChannel(stringtype)

{

ChannelBase channel=null;switch(type)

{case"TypeA":

channel=newTypeAChannel();

break;case"TypeB":

channel=newTypeBChannel();

break;default:

break;

}returnchannel;

}

}

ChannelFactory

ChannelManager(频道管理类):解析” FullChannels.xml”文件,创建存储所有频道信息的集合,并将频道名添加到TreeView控件中

核心思路1. 创建了道管理类,添加一个加载所有频道信息的方法(代码之后添加)LoadAllChannel()

当我们选取某一节点时实际获取到的是该节点Text值对应的频道对象.所以使用Dctionary<>来存储所有的频道对象

publicChannelManager()

{

fullChannels=newDictionary<string, ChannelBase>();

}//定义一个容器,承载所有的频道集合(Key:频道名称 Value:频道对象)privateDictionary<string, ChannelBase>fullChannels ;publicDictionary<string, ChannelBase>FullChannels

{get{returnfullChannels; }set{ fullChannels =value; }

}

fullChannels

2. 接下来就是给窗体中的TreeView控件中添加数据,分析:通过foreach将字典中的集合数据拆解,每一项对应的就是一个TreeNode对象,我们需要的是向”所有电视台”节点下添加电视台的名称属性.而名称属性对应的就是一个Channel对象,我们用Tag属性存储.

//01.写一个方法来解析xml,并且来给箱子中装数据publicvoidParseXmlToDictionary()

{

XmlDocument doc=newXmlDocument();

doc.Load("files/Fullchannels.xml");//获取根节点XmlNode root=doc.DocumentElement;foreach(XmlNode iteminroot.ChildNodes)

{//一个item代表一个Channel节点//获取类型stringtype=item["channelType"].InnerText;

ChannelBase channel=ChannelFactory.CreateChannel(type);//名称channel.ChannelName = item["tvChannel"].InnerText;

channel.Path= item["path"].InnerText;

channel.Type=type;

fullChannels.Add(channel.ChannelName,channel);

}

}

ParseXmlToDictionary

privatevoidFrmMain_Load(objectsender, EventArgs e)

{//将ChannelManage类当中的容器FullChannels中的数据拎到TreeView上,//根据思路,集合中每一项的Value值都是一个频道对应,没遍历到一个//频道对象,我们就形成TV上的一个TreeNode//01.加载根节点的方法LoadRootNode();//02.将集合中的数据拆解成是“所有电台下的”多个子节点ChannelManager manager=newChannelManager();

manager.ParseXmlToDictionary();

Dictionary<string,ChannelBase> dic=manager.FullChannels;foreach(varchannelindic.Values)

{//转化过程TreeNode tn=newTreeNode();

tn.Text=channel.ChannelName;

tn.Tag=channel;//让tn加到所有电台下allNode.Nodes.Add(tn);

}

}

节点对象的绑定

3. 将当前选中的电台的节目列表显示在dgv(DataGrideView)中显示出来,只需要将dgv的datasource属性设为当前选中电视台的节目列表list<Progeram>即可.

(我们在选取节点时应清楚一件事,在我们点击节点已获取到该电视台的节目列表,获取信息应该发生在我们点击节点的时候还是应该发生在选取之后)

privatevoidtvChannel_AfterSelect(objectsender, TreeViewEventArgs e)

{//01.获取到用户选择的节点TreeNode selectedNode =tvChannel.SelectedNode;if(selectedNode.Level==1&&selectedNode.Parent.Text=="所有电视台")

{

ChannelBase channel=(ChannelBase)selectedNode.Tag;//清集合if(channel.TvList!=null)

{

channel.TvList.Clear();

}

channel.Fetch();

List<TvProgram> proList =channel.TvList;

dgvProgList.DataSource=proList;

}

}

tvChannel_AfterSelect

写到这里,如果运行一下程序,会报错误

.

我们仔细回想一下,我们在给TreeView控件添加节点的时候,给节点的TAG属性绑定了具体的频道对象.可是TreeView在窗体显示前,第一个节点会被默认选中

所以我们要对其进行优化,也就是当窗体在打开时,对默认选取的节点经行判断

if(selectedNode.Level==1&&selectedNode.Parent.Text=="所有电视台")

默认选取节点判断

我们会发现当我们多次点击同一电视台,该电视台的节目信息会在dgv中进行多次添加,所以进行以下处理

//清集合if(channel.TvList!=null)

{

channel.TvList.Clear();

}

清理节目列表

4. 节点右键菜单的添加,在TreeView控件中不同的节点对应了不同的右键菜单,当我们点击”我的电视台”下的字节点时,右键菜单只能为删除,而当我点击”所有电视台”下的子节点时,右键菜单为添加到”我的电视台”和”删除,如果我们使用多个ContextMenuStrip对不同节点经行绑定,会造成冗余,我们可不可以使用一个ContextMenuStrip绑定到多个节点并使其显示不同的菜单呢?答案是肯定的,我们需要用到ContextMenuStrip的一个属性:Visible.

我们要在选取节点后对选取到的节点经行判断,并选择显示该节点的右键菜单项

if(tvAllChannel.SelectedNode.Level ==1&& tvAllChannel.SelectedNode.Parent.Text =="所有电视台")

{

ctxAddToMyChannels.Items[2].Visible =false;

ctxAddToMyChannels.Items[3].Visible =false;

}elseif(tvAllChannel.SelectedNode.Level ==1&& tvAllChannel.SelectedNode.Parent.Text =="我的电视台")

{

ctxAddToMyChannels.Items[0].Visible =false;

ctxAddToMyChannels.Items[1].Visible =false;

ctxAddToMyChannels.Items[2].Visible =false;

}elseif(tvAllChannel.SelectedNode.Text =="所有电视台")

{

ctxAddToMyChannels.Items[0].Visible =false;

ctxAddToMyChannels.Items[1].Visible =false;

ctxAddToMyChannels.Items[3].Visible =false;

节点右键菜单项

到了这里,这个小项目可以说已经告一段落,之后学习过IO流会继续对该项目进行优化.或许我所做的并不完美,存在着许多代码的复用和冗余,也希望看过的各位进行提点,帮助我获取更多更优的解决方案.小子在此先行谢过了~~~

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有