網路電視精靈的框架及關鍵代碼

来源:http://www.cnblogs.com/whyhappy/archive/2016/03/16/5285460.html
-Advertisement-
Play Games

效果: 編寫節目類 屬性:播出時間、時段、名稱、視頻路徑 編寫頻道基類 屬性:頻道名稱、頻道節目單位置、節目列表 抽象方法:Fetch() 編寫頻道子類 繼承“頻道基類”,實現Fetch()【只寫方法聲明】 編寫頻道工廠類 方法:實現創建頻道子類 第一步.創建幾個類: 01:創建一個電視類(TvPr


效果:

編寫節目類 屬性:播出時間、時段、名稱、視頻路徑

編寫頻道基類 屬性:頻道名稱、頻道節目單位置、節目列表 抽象方法:Fetch()

編寫頻道子類 繼承頻道基類,實現Fetch()【只寫方法聲明】

編寫頻道工廠類 方法:實現創建頻道子類

第一步.創建幾個類:

01創建一個電視類(TvProgram)

該類主要負責定義節目的屬性,為後續從xml文件(FullChannnels.xml)中讀取的內容提供存放位置。

屬性為:   

 public DateTime PlayTime { get; set; }
        public string SomeTime { get; set; }
        public string Name { get; set; }
        public string Path { get; set; }

02:創建一個頻道基類(ChannelBase)(父類或是超類),且此類為抽象類

屬性為:

   public string ChannelName{get; set; }

        public string Path { get; set; }

        public string Type { get; set; }

        public List<TvProgram> Tvlist { get; set; }

 

方法:

        public abstract List<TvProgram> Fetch();

03:創建一個A類頻道(TypeAChannel)

該類主要負責解析XM文件(北京電視臺.xml)

 

04:創建一個B類頻道(TypeBChannel)

該類主要負責解析XML文件(鳳凰衛視.xml

05:創建一個工廠類(工具類)(ChannelFactory

該類主要負責頻道的選擇

總結:ChannelBase,TypeAChannel,TypeBChannel,ChannelFactory四個類主要控制頻道信息

06:創建一個管理類(ChannelManager)

創建一個方法LoadAllChannel():解析文件

該類主要作用實質上減輕窗體中的代碼量。相當於程式的工具類。

第二步.寫代碼的核心思路:

01.首先在頻道管理類ChannelManager中寫一個載入所有頻道方法LoadAllChannel;

該方法作用讀取FullChannels.xml文件,並且將讀取到的內容賦值給ChannelBase          對象。關鍵的問題就轉化成瞭如何創建一個ChannelBase對象。我們都知道ChannelBase本身是一個抽象類,無法創建實例。由此,我們想到可以通過其子類來創建對象。由於不同子類實例化需要多次new,我們單獨寫了一個工廠類(ChannelFafactory),來創建子類實例,但是該子類實例存儲在父類變數中。賦值完成後,我們需要將頻道對象添加到字典中。那麼LoadAllChannel方法結束後,字典中就有

XML文檔中的數據。也就是我們實現了將

本地硬碟上的xml文件中的數據讀取到了內容中的一個字典集合中。

代碼:

 public Dictionary<string, ChannelBase> Fulllist
       {
            get { return fulllist; }
            set { fulllist = value; }
        }
        private string channelPath = "files/FullChannel.xml";
      //構造函數中new
      public ChannelManager() {
          fulllist = new Dictionary<string, ChannelBase>();
      }
      //解析xml文件
      public void ReadFiles() {
          fulllist.Clear();
          XmlDocument doc = new XmlDocument();
          doc.Load(channelPath);
          XmlNode root = doc.DocumentElement;
          foreach (XmlNode item in root.ChildNodes)
          {
              ChannelBase channelSB = ChannelFactory.CreateFile(item["channelType"].InnerText);
              channelSB.Type = item["channelType"].InnerText;
              channelSB.ChannelName = item["tvChannel"].InnerText;
              channelSB.Path=item["Path"].InnerText;
              fulllist.Add(channelSB.ChannelName,channelSB);
          }

   02:將集合中的數據綁定到ListView中

將字典集合中的數據通過Foreach拆解,每迴圈一項,都創建一個TreeNode對象。

並且將集合中的屬性賦值給節點對應的屬性。然後將拼接處的節點添加到TreeView上

。這裡需要註意的是,如何找到TreeView控制項中的【所有電視臺】這個節點,因為

我們需要在該節點上添加頻道名稱

核心代碼如下:

ChannelManager manager = new ChannelManager();
            manager.ReadFiles();
            Dictionary<string, ChannelBase> dsc = manager.Fulllist;
            foreach (ChannelBase item in dsc.Values)
            {
                TreeNode td = new TreeNode();
                td.Text = item.ChannelName;
                //頻道對象
                td.Tag = item;
                tvlist.Nodes[1].Nodes.Add(td);
            }

03:A類頻道(TypeAChannel)

 public override List<TvProgram> Fetch()
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(Path);
            XmlNode root = doc.DocumentElement;
            if (Tvlist == null)
            {
                Tvlist = new List<TvProgram>();
            }
            foreach (XmlNode child in root.ChildNodes)
            {
                TvProgram tvp = new TvProgram();
                if (child.Name == "tvProgramTable")
                {
                    foreach (XmlNode two in child.ChildNodes)
                    {
                        tvp.PlayTime = Convert.ToDateTime(two["PlayTime"].InnerText);
                        tvp.SomeTime = two["meridien"].InnerText;
                        tvp.Name = two["programName"].InnerText;
                        tvp.Path = two["path"].InnerText;
                        Tvlist.Add(tvp);
                    }                
                }
            }
            return this.Tvlist;

 

         04:B類頻道(TypeBChannel)和A類解析方法是一樣的。

05:進行頻道的選擇:

   工廠類(工具類)(ChannelFactory

代碼:

public static ChannelBase CreateFile(string type) {
          ChannelBase cb = null;
          switch (type)
          {
              case "TypeA":
                  cb = new TypeAChannel();
                  break;
              case "TypeB":
                  cb = new TypeBChannel();
                  break;
              default:
                  break;
          }              
          return cb;
      }

07:把數據綁定到dataGriv中,在Afterselect事件中寫

代碼:

TreeNode selectNode = tvlist.SelectedNode;
            if (selectNode.Level==1&&selectNode.Parent.Text=="所有電視臺")
            {
                ChannelBase channel = (ChannelBase)selectNode.Tag;
                if (channel.Tvlist != null)
                {
                    channel.Tvlist.Clear();
                }
                //方式一:
                //List<TvProgram> tvlist1 = new List<TvProgram>();
                //dgvlist.DataSource = tvlist1;
                    //方式二:
                dgvlist.DataSource =channel.Fetch();
            }

08:實現添加電臺和刪除電臺

添加:

 TreeNode selectNOde = tvlist.SelectedNode;

            ChannelBase channel = (ChannelBase)selectNOde.Tag; 

                tn.Text = channel.ChannelName;

                tn.Tag = channel;

                my.Nodes.Add(tn);

刪除:

my.Nodes.Remove(tn);

09.

001:

當在我的電臺中沒有頻道時,沒有刪除功能,更不能有添加功能

如果有了已添加的頻道,才有刪除功能。但此時也不能有添加功能。

002:

當在所有電臺中時,沒有刪除功能,只有添加功能。

代碼如下:

  TreeNode select = tvlist.SelectedNode;
            if (select!=null&&select.Level==1)
            {
                if (select.Parent.Text=="我的電視臺")
                {
                    tvment.Items[0].Visible = false;            
                    tvment.Items[1].Visible = true;
                }
                else
                {
                    tvment.Items[0].Visible = true;
                   tvment.Items[1].Visible = false;
                }
            }
            else
            {
                tvment.Items[0].Visible = false;
                tvment.Items[1].Visible = false;
            }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 初學者對 : Controller where T : class,new() 不理解 ,我是初學者的時候也一樣不理解,在此做個簡單的解釋:這是類型參數約束,.NET支持的類型參數約束有以下五種: where T : struct | T必須是一個結構類型 where T : class | T必須
  • 異常處理彙總-前端系列 http://www.cnblogs.com/dunitian/p/4523015.html 舉個例子 重點:display:flex (參考:http://www.360doc.com/content/14/0811/01/2633_400926000.shtml) 效果
  • 一、前言 異常處理是每個系統必不可少的一個重要部分,它可以讓我們的程式在發生錯誤時友好地提示、記錄錯誤信息,更重要的是不破壞正常的數據和影響系統運行。異常處理應該是一個橫切點,所謂橫切點就是各個部分都會使用到它,無論是分層中的哪一個層,還是具體的哪個業務邏輯模塊,所關註的都是一樣的。所以,橫切關註點
  • 本文闡述C#中相等性比較,其中主要集中在下麵兩個方面 ==和!=運算符,什麼時候它們可以用於相等性比較,什麼時候它們不適用,如果不使用,那麼它們的替代方式是什麼? 什麼時候,需要自定一個類型的相等性比較邏輯 在闡述相等性比較,以及如何自定義相等性比較邏輯之前,我們首先瞭解一下值類型比較和引用類型比較
  • CheckBox控制項,由於它的值是選擇與非選擇。因此在提交數據時,想讓用戶必須選擇CheckBox,普通情況之下,不好做驗證。 但我們可以使用asp:CustomValidator來驗證,不過還得寫自定義驗證Javascript代碼,可參考如下:
  • Mysql操作 調用
  • 項目中用到了EF Code First和遷移,但發現有些方面似懂非懂。比如:如何在遷移文件中控制遷移過程?如果在遷移文件中執行SQL語句?如何使用Update-Database的其它參數?資料庫在生產環境的時候如何遷移?於是就有了下麵的這些體驗:enable-migration第一次生成資料庫時使用
  • 摘要: 介紹緩存的基本概念和常用的緩存技術,給出了各種技術的實現機制的簡單介紹和適用範圍說明,以及設計緩存方案應該考慮的問題(共17頁) · 性能——將相應數據存儲起來以避免數據的重覆創建、處理和傳輸,可有效提高性能。比如將不改變的數據緩存起來,例如國家列表等,這樣能明顯提高web程式的反應速度;
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...