亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

初識XML及簡單工廠運用--網絡電視精靈

2019-11-14 15:55:59
字體:
來源:轉載
供稿:網友

網絡電視精靈

任務描述

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-29 06:02</playTime><!--節目播出時間-->      <meridien>早間檔</meridien><!--時段-->      <programName>重播:國際雙行線</programName><!--節目名稱-->      <path>E:/</path><!--節目視頻的本地路徑-->    </tvProgram>    <tvProgram>      <playTime>2013-9-29 07:00</playTime>      <!--節目播出時間-->      <meridien>早間檔</meridien>      <!--時段-->      <programName>北京您早</programName>      <!--節目名稱-->      <path>E:/</path>      <!--節目視頻的本地路徑-->    </tvProgram>    <tvProgram>      <playTime>2013-9-29 09: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-29 01:30</playTime>      <!--節目播出時間-->      <meridien>早間檔</meridien>      <!--時段-->      <programName>重播:國際雙行線</programName>      <!--節目名稱-->      <path>E:/</path>      <!--節目視頻的本地路徑-->    </tvProgram>  </tvProgramTable></typeB>
鳳凰衛視.xml

2. 將”FullChannels.xml”文件中所有的頻道添加到窗體的TreeView控件中.

3. 在TreeView控件中選取頻道,將該頻道的節目列表顯示在窗體的DataGrideView控件中.

項目框架的搭建

分析網絡精靈的大致結構,創建對應的類

1. 創建對應的類

  

ChannelFactory(簡單工廠):通過簡單工廠創建頻道子類

public class ChannelFactory    {       //通過工廠創建頻道子類       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;       }    }
ChannelFactory

 

ChannelManager(頻道管理類):解析” FullChannels.xml”文件,創建存儲所有頻道信息的集合,并將頻道名添加到TreeView控件中

核心思路

1. 創建了道管理類,添加一個加載所有頻道信息的方法(代碼之后添加)LoadAllChannel()
當我們選取某一節點時實際獲取到的是該節點Text值對應的頻道對象.所以使用Dctionary<>來存儲所有的頻道對象

       public ChannelManager()       {           fullChannels = new Dictionary<string, ChannelBase>();       }       //定義一個容器,承載所有的頻道集合(Key:頻道名稱  Value:頻道對象)       private Dictionary<string, ChannelBase> fullChannels ;       public Dictionary<string, ChannelBase> FullChannels       {           get { return fullChannels; }           set { fullChannels = value; }       }
fullChannels

2. 接下來就是給窗體中的TreeView控件中添加數據,分析:通過foreach將字典中的集合數據拆解,每一項對應的就是一個TreeNode對象,我們需要的是向”所有電視臺”節點下添加電視臺的名稱屬性.而名稱屬性對應的就是一個Channel對象,我們用Tag屬性存儲.

       //01.寫一個方法來解析xml,并且來給箱子中裝數據       public void ParseXmlToDictionary()       {           XmlDocument doc=new XmlDocument();           doc.Load("files/Fullchannels.xml");           //獲取根節點           XmlNode root=doc.DocumentElement;           foreach (XmlNode item in root.ChildNodes)           {                            //一個item代表一個Channel節點               //獲取類型               string type=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
        private void FrmMain_Load(object sender, EventArgs e)        {           //將ChannelManage類當中的容器FullChannels中的數據拎到TreeView上,            //根據思路,集合中每一項的Value值都是一個頻道對應,沒遍歷到一個            //頻道對象,我們就形成TV上的一個TreeNode            //01.加載根節點的方法            LoadRootNode();            //02.將集合中的數據拆解成是“所有電臺下的”多個子節點            ChannelManager manager=new ChannelManager();            manager.ParseXmlToDictionary();            Dictionary<string,ChannelBase> dic=manager.FullChannels;            foreach (var channel in dic.Values)            {                //轉化過程                TreeNode tn=new TreeNode();                tn.Text = channel.ChannelName;                tn.Tag = channel;                //讓tn加到所有電臺下                allNode.Nodes.Add(tn);            }        }
節點對象的綁定

3. 將當前選中的電臺的節目列表顯示在dgv(DataGrideView)中顯示出來,只需要將dgv的datasource屬性設為當前選中電視臺的節目列表list<Progeram>即可.

(我們在選取節點時應清楚一件事,在我們點擊節點已獲取到該電視臺的節目列表,獲取信息應該發生在我們點擊節點的時候還是應該發生在選取之后)

        private void tvChannel_AfterSelect(object sender, 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;            }            else if (tvAllChannel.SelectedNode.Level == 1 && tvAllChannel.SelectedNode.Parent.Text == "我的電視臺")            {                ctxAddToMyChannels.Items[0].Visible = false;                ctxAddToMyChannels.Items[1].Visible = false;                ctxAddToMyChannels.Items[2].Visible = false;            }            else if (tvAllChannel.SelectedNode.Text == "所有電視臺")            {                ctxAddToMyChannels.Items[0].Visible = false;                ctxAddToMyChannels.Items[1].Visible = false;                ctxAddToMyChannels.Items[3].Visible = false;
節點右鍵菜單項

到了這里,這個小項目可以說已經告一段落,之后學習過IO流會繼續對該項目進行優化.或許我所做的并不完美,存在著許多代碼的復用和冗余,也希望看過的各位進行提點,幫助我獲取更多更優的解決方案.小子在此先行謝過了~~~


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美亚洲成人免费| 日韩高清人体午夜| 亚洲国产欧美一区| 亚洲国产精品yw在线观看| 国产欧美一区二区三区久久人妖| 狠狠干狠狠久久| 欧美激情第三页| 久久久免费高清电视剧观看| 久久久久久久一区二区| 亚洲国产91色在线| 免费91在线视频| 欧美国产视频一区二区| 国产精品v日韩精品| 欧美中文在线视频| 欧美日韩中文字幕在线| 久久婷婷国产麻豆91天堂| 国产激情综合五月久久| 国产精品三级网站| 欧美性videos高清精品| 国产视频精品在线| 另类天堂视频在线观看| 亚洲视频免费一区| 一区二区三区视频观看| 国产精品久久久久不卡| 欧美午夜女人视频在线| 亚洲3p在线观看| 日韩成人av在线| 国产精品青青在线观看爽香蕉| 亚洲国产精品成人va在线观看| 欧美日韩国产中文字幕| 亚洲韩国欧洲国产日产av| 久久91亚洲人成电影网站| 国产精品免费观看在线| 久久久久久久999精品视频| 亚洲一区二区三区视频播放| 91久久国产精品| 欧美精品激情视频| 97久久伊人激情网| 欧美激情网站在线观看| 久久福利视频导航| 青青草原成人在线视频| 欧美在线一级视频| 97视频在线观看视频免费视频| 91精品国产91久久久久久| 亚洲欧美www| 欧美精品videos| 搡老女人一区二区三区视频tv| 亚洲色图日韩av| 欧美大胆在线视频| 国产日韩中文在线| 欧洲成人在线观看| 中文字幕亚洲无线码a| 国产精品丝袜久久久久久高清| 欧美一区视频在线| 亚洲男人天天操| 午夜精品一区二区三区在线| 国产精品美女免费| 国产日韩在线播放| 亚洲社区在线观看| 国产成人涩涩涩视频在线观看| 亚洲国产精品字幕| …久久精品99久久香蕉国产| 亚洲国产欧美一区二区丝袜黑人| 成人国产精品av| 欧美香蕉大胸在线视频观看| 一本大道香蕉久在线播放29| 精品在线小视频| 欧美丝袜一区二区| 久久香蕉精品香蕉| 伊人男人综合视频网| 欧美成人性色生活仑片| 国产精品自拍视频| …久久精品99久久香蕉国产| 色爱av美腿丝袜综合粉嫩av| 亚洲国产精彩中文乱码av在线播放| 91久久久久久久久久| 久久人人爽人人| 亚洲国产欧美一区二区丝袜黑人| 91精品国产乱码久久久久久久久| 国产福利精品av综合导导航| 国内精品久久影院| 亚洲美女激情视频| 在线观看亚洲区| 欧美激情中文字幕在线| 久久青草精品视频免费观看| 亚洲视频电影图片偷拍一区| 久久香蕉国产线看观看av| 久久精品2019中文字幕| 最近2019年手机中文字幕| 81精品国产乱码久久久久久| 久久久精品一区二区| 欧美理论电影在线播放| 亚洲国产第一页| 欧美乱妇高清无乱码| 精品偷拍各种wc美女嘘嘘| 国产精品va在线| 欧美日韩国产在线| 精品女同一区二区三区在线播放| 国产精品观看在线亚洲人成网| 日韩不卡在线观看| 欧美激情精品在线| 久久久精品999| 欧美成人黄色小视频| 久久人人爽人人爽人人片av高清| 日韩精品极品视频免费观看| 欧美激情一区二区三级高清视频| 亚洲精选在线观看| 亚洲成人久久久久| 欧美精品在线网站| 成人综合网网址| 国产91久久婷婷一区二区| 91中文字幕在线观看| 亚洲影院在线看| 久久视频在线观看免费| 亚洲精品久久久久久久久久久| 色黄久久久久久| 国产精品一区二区3区| 一本色道久久88综合日韩精品| 国产精品扒开腿做爽爽爽的视频| 91精品国产综合久久久久久蜜臀| 国产一区二区三区视频免费| 亚洲新中文字幕| 欧美一级成年大片在线观看| 欧美激情国产精品| 亚洲女人天堂成人av在线| 亚洲欧美在线第一页| 亚洲最大的免费| 97国产真实伦对白精彩视频8| 国产热re99久久6国产精品| 欧美日韩国产成人在线观看| 久久精品99无色码中文字幕| 国产精品www色诱视频| 亚洲福利影片在线| 国产成人+综合亚洲+天堂| 在线观看中文字幕亚洲| 久久久精品久久久久| 成人欧美在线观看| 久久久www成人免费精品张筱雨| 亚洲欧美日韩中文在线制服| 国产日产欧美a一级在线| 日韩在线视频线视频免费网站| 在线观看久久av| 国产精品91在线| 亚洲第一福利网站| 91在线精品播放| 欧美视频中文字幕在线| 中文字幕最新精品| 日韩欧美国产中文字幕| 国产97在线视频| 国产精品偷伦免费视频观看的| 欧美大尺度在线观看| 久久精品电影一区二区| 久久久国产一区| 日韩风俗一区 二区| 亚洲综合精品伊人久久| 欧美精品日韩三级| 亚洲欧美日韩精品| 亚洲黄色在线观看| 久久国产精品免费视频| 久久激情视频免费观看| 精品久久久一区| 久久久久这里只有精品| 国产精品精品视频| 亚洲欧美制服另类日韩|