MyKTV前後臺點歌管理系統

来源:http://www.cnblogs.com/weiguangyi/archive/2016/01/22/5150117.html
-Advertisement-
Play Games

前臺管理主界面:主要代碼: 1 2 private void MainForm_Load(object sender, EventArgs e) 3 { 4 // 載入時,運行播放窗體 5 FrmPlay play...


光陰似箭,歲月如梭!S1結束了 ,最後留給大家的就一個KTV項目了。

前臺管理

主界面:

主要代碼:

 1   
 2         private void MainForm_Load(object sender, EventArgs e)
 3         {
 4             // 載入時,運行播放窗體
 5             FrmPlay playForm = new FrmPlay();
 6             playForm.Show();
 7 
 8             // 啟動定時器
 9             this.timer1.Start();  
10 
11             // 讀取資源路徑
12             DBHelper dbHelper = new DBHelper();
13             string sql = "select resource_path from resource_path where resource_type = 'singer_photo'";
14             SqlCommand command = new SqlCommand(sql, dbHelper.Connection);
15             
16             // 讀取歌手照片路徑
17             try
18             {
19                 dbHelper.OpenConnection();
20                 KTVUtil.singerPhotoPath = command.ExecuteScalar().ToString();
21             }
22             catch (Exception ex)
23             {
24                 MessageBox.Show("資源路徑發生錯誤!", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
25             }
26             finally
27             {
28                 dbHelper.CloseConnection();
29             }
30 
31             // 讀取歌曲路徑
32             sql = "select resource_path from resource_path where resource_type = 'song'";
33             command.CommandText = sql;
34             try
35             {
36                 dbHelper.OpenConnection();
37                 KTVUtil.songPath = command.ExecuteScalar().ToString();
38             }
39             catch (Exception ex)
40             {
41                 MessageBox.Show("路徑錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error);
42             }
43             finally
44             {
45                 dbHelper.CloseConnection();
46             }
47         }
1 /// <summary>
2 /// 顯示當前播放的歌曲名字
3 /// </summary>
4 public void ShowPlayingSongName()
5 {
6 this.lblPlayingSong.Text = PlayList.PlayingSongName();
7 this.lblNextSong.Text = PlayList.NextSongName();
8 }

 

 同一窗體顯示不同界面

如果在一個窗體中顯示不同的界面呢??

我們可以轉換一下思路,所謂界面不同就是容器不同

解決方案:通過控制Form窗體中ListView控制項的顯示和隱藏來實現多界面窗體

歌星點歌

 點擊第一個LIstView,彈出第二個ListView解析:1.隱藏第一個ListView,顯示第二個ListView 

 1         // 點擊後,顯示歌手類別
 2         private void lvOrder_Click(object sender, EventArgs e)
 3         {
 4             if (lvOrder.SelectedItems[0] != null)
 5             {
 6                 // 隱藏歌手性別,顯示歌手類別
 7                 pnlSingerSex.Visible = false;
 8                 pnlSingerType.Location = pnlSingerSex.Location;
 9                 pnlSingerType.Dock = DockStyle.Fill;
10                 pnlSingerType.Visible = true;
11                 this.singerSex = Convert.ToString(lvOrder.SelectedItems[0].Tag);  // 記錄選擇的性別
12             }      
13     
14             // 讀取歌手類別
15             DBHelper dbHelper = new DBHelper();
16             string sql = "select * from singer_type";
17             try
18             {
19                 // 查詢資料庫
20                 SqlCommand command = new SqlCommand(sql, dbHelper.Connection);
21                 dbHelper.OpenConnection();//相當於con.open
22                 SqlDataReader reader = command.ExecuteReader();
23 
24                 // 迴圈將類別讀取出來添加到ListView中
25                 lvSingerType.Items.Clear();
26                 int i = 0;
27                 while (reader.Read())
28                 {
29                     ListViewItem item = new ListViewItem();
30                     item.Text = Convert.ToString(reader["singertype_name"]);
31                     item.Tag = Convert.ToInt32(reader["singertype_id"]);
32                     item.ImageIndex = i;
33                     lvSingerType.Items.Add(item);
34                     i++;
35                 }
36                 reader.Close();
37             }
38             catch (Exception ex)
39             {
40                 Console.WriteLine(ex.Message);
41                 MessageBox.Show("錯誤!");
42                 
43             }
44             finally
45             {
46                 dbHelper.CloseConnection();
47             }
48         }

  需要將【男歌手】漢字傳遞到第二個ListView上 顯示5個國家的信息(包括文本和圖片)

 需要將【男歌手】漢字傳遞到第二個ListView上   .顯示5個國家的信息(包括文本和圖片)

點擊第二個ListVIew,填出第三個ListView

    // 點擊類別後,顯示對應類別下的歌手列表
        private void lvSingerType_Click(object sender, EventArgs e)
        {
            // 隱藏歌手類別,顯示歌手列表
            pnlSingerType.Visible = false;
            pnlSingerList.Location = pnlSingerSex.Location;
            pnlSingerList.Dock = DockStyle.Fill;
            pnlSingerList.Visible = true;
            this.singerTypeId = Convert.ToInt32(lvSingerType.SelectedItems[0].Tag); // 保存選中的類別編號
            
            // 讀取資料庫,讀出歌手信息
            DBHelper dbHelper = new DBHelper();
            StringBuilder sql = new StringBuilder();
            sql.AppendFormat("select singer_id,singer_name,singer_photo_url from singer_info where singertype_id={0} and singer_gender='{1}'",
                this.singerTypeId,this.singerSex);
           
            try
            {
                SqlCommand command = new SqlCommand(sql.ToString(),dbHelper.Connection);
                dbHelper.OpenConnection();
                SqlDataReader reader = command.ExecuteReader();

                int imageIndex = 0; // 代表歌手頭像的索引
                ilSinger.Images.Clear();

                // 迴圈讀出歌手信息添加到窗體中顯示
                lvSinger.Items.Clear();
                while (reader.Read())
                {
                    // 將歌手頭像放在ImageList控制項中
                    string photoURL = KTVUtil.singerPhotoPath + "\\" + Convert.ToString(reader["singer_photo_url"]);
                    ilSinger.Images.Add(Image.FromFile(photoURL));

                    // 將歌手添加到ListView中
                    ListViewItem item = new ListViewItem();
                    item.Text = Convert.ToString(reader["singer_name"]);
                    item.Tag = Convert.ToString(reader["singer_id"]);                   
                    item.ImageIndex = imageIndex;
                    lvSinger.Items.Add(item);

                    imageIndex++;
                }
                reader.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                MessageBox.Show("錯誤!");
            }
            finally
            { 
                dbHelper.CloseConnection(); 
            } 
        }

第三個ListView出來後,點擊其中的一個歌手,彈出該歌手演唱的所有歌曲
  1.  1   // 點擊歌手姓名,打開歌曲列表視窗
     2         private void lvSinger_Click(object sender, EventArgs e)
     3         {
     4             // 讀取資料庫,讀出該歌手的所有歌曲
     5             DBHelper dbHelper = new DBHelper();
     6             StringBuilder sb = new StringBuilder();
     7             sb.AppendFormat("select song_id,song_name, singer_name='{0}',song_url  from song_info where singer_id={1}",
     8                 lvSinger.SelectedItems[0].Text, Convert.ToInt32(lvSinger.SelectedItems[0].Tag));
     9 
    10             FrmSongList songList = new FrmSongList();
    11             songList.Sql = sb.ToString();
    12             songList.Previous = PrevioisForm.Singer; // 指定返回的窗體是按歌手點歌
    13             songList.Show();
    14             this.Close();
    15         }

 我們都知道ListView綁定首列的數據是通過

 1 ListViewItem lvitem = new ListViewItem(stuno);
 2 顯示地區圖片的代碼:  SqlDataReader dr = command.ExecuteReader();
 3 
 4  
 5 
 6                 // 迴圈將類別讀取出來添加到ListView中
 7 
 8                 lvlisttwo.Items.Clear();
 9 
10                 int i = 0;
11 
12                 while (dr.Read())
13 
14                 {
15 
16                     ListViewItem item = new ListViewItem();
17 
18                     item.Text = Convert.ToString(dr["singertype_name"]);
19 
20                     item.Tag = Convert.ToInt32(dr["singertype_id"]);
21 
22                     item.ImageIndex = i;
23 
24                     lvlisttwo.Items.Add(item);
25 
26                     i++;
27 
28                 }
29 
30       dr.Close();

 詳細分析:

顯示歌手的圖片的代碼

 1 SqlDataReader dr = cmd.ExecuteReader();
 2 
 3                 int imageIndex = 0; // 代表歌手頭像的索引
 4 
 5                 imglistthree.Images.Clear();
 8 
 9                 // 迴圈讀出歌手信息添加到窗體中顯示
10 
11                 lvlistthree.Items.Clear();
12 
13                 while (dr.Read())
14 
15                 {
16 
17                     // 將歌手頭像放在ImageList控制項中
18 
19                     string photoURL = KTVUtil.singerPhotoPath + "\\" + Convert.ToString(dr["singer_photo_url"]);
20 
21                     imglistthree.Images.Add(Image.FromFile(photoURL));
24 
25                     // 將歌手添加到ListView中
26 
27                     ListViewItem item = new ListViewItem();
28 
29                     item.Text = Convert.ToString(dr["singer_name"]);
30 
31                     item.Tag = Convert.ToString(dr["singer_id"]);
32 
33                     item.ImageIndex = imageIndex;
34 
35                     lvlistthree.Items.Add(item);
36 
37  
38 
39                     imageIndex++;
40 
41                 }
42 
43                 dr.Close();
44 
45             }

10 .ListView控制項首列不能居中問題

  1. 我也沒找到解決方法,能做的,也許就是把第一列寬度設為 0,不用第一列,從第二列開始用。此時 ListView1.Items[i].Text 也不能用了,因為它對應的是 ListView1[i].SubItems[0].Text。
  2. 設置ToolStrip對應項圖片的大小,通過ImageScalingSize來設置。
  3. 04.Panel不能實現同一窗體不同界面。

17. 實現播放歌曲功能 

01.點擊某歌曲後,將選擇的歌曲添加到已點列表

02.在已點列表中放入一個Timer控制項,實時檢測每首歌曲的狀態

03.在播放視窗中放入一個Timer控制項,實時檢測需要播放的歌曲

 1      private void PlayForm_Load(object sender, EventArgs e)
 2         {
 3             this.PlaySong();
 4             this.timer1.Start();
 5         }
 6 
 7         /// <summary>
 8         /// 播放歌曲
 9         /// </summary>
10         private void PlaySong()
11         {
12             this.song = PlayList.GetPlayingSong(); // 獲取當前要播放的歌曲
13             if (song != null)
14             {
15                 this.song.SetSongPlayed();             // 將當前歌曲播放狀態設為已播放
16                 this.wmpSong.URL = KTVUtil.songPath + "\\" + this.song.SongURL;  // 得到當前播放歌曲的路徑
17             }            
18         }
19 
20         private void timer1_Tick(object sender, EventArgs e)
21         {
22             if(this.song == null)
23             {
24                 this.PlaySong();
25             }
26             if (this.wmpSong.playState == WMPLib.WMPPlayState.wmppsStopped)
27             {
28                 this.song = null; // 將歌曲設為空
29                 PlayList.MoveOn();
30             }
31             // 切歌
32             if (this.song != null && this.song.PlayState == SongPlayState.cut)
33             {
34                 this.wmpSong.URL = "";
35                 this.song = null;
36             }
37         }

實現播放列表操作:

   1.KTVUtil 類:

1 class KTVUtil
2 
3     {
4 
5         public static string singerPhotoPath = "";  // 歌手照片路徑
6 
7         public static string songPath = "";         // 歌曲路徑
8 
9     }

2.編寫歌曲類(Song.cs)

 1 代碼例子:enum SongPlayState
 2 
 3     {
 4 
 5         unplayed, played, again, cut
 6 
 7     }
 8 
 9     // 歌曲類
10 
11     class Song
12 
13     {
14 
15         //歌曲名稱
16 
17         public string SongName
18 
19         {
20 
21             get { return songName; }
22 
23             set { songName = value; }
24 
25         }
26 
27         //歌曲存放路徑
28 
29         public string SongURL
30 
31         {
32 
33             get { return songURL; }
34 
35             set { songURL = value; }
36 
37         }
38 
39         // 歌曲播放狀態
40 
41         internal SongPlayState PlayState
42 
43         {
44 
45             get { return playState; }
46 
47             set { playState = value; }
48 
49         }
50 
51         private string songName;
52 
53         private string songURL;
54 
55         // 歌曲播放狀態,預設為未播放狀態
56 
57         private SongPlayState playState = SongPlayState.unplayed;
58 
59         //將歌曲狀態改為已播放
60 
61         public void SetSongPlayed()
62 
63         {
64 
65             this.playState = SongPlayState.played;
66 
67         }
68 
69         // 將歌曲狀態改為再撥放一次
70 
71         public void SetPlayAgain()
72 
73         {
74 
75             this.playState = SongPlayState.again;
76 
77         }
78 
79         // 將歌曲狀態改為切歌
80 
81         public void SetSongCut()
82 
83         {
84 
85             this.playState = SongPlayState.cut;

3.編寫播放列表類(PlayList.cs),提供播放列表的各種方法

代碼例子:// 播放列表管理

  1  
  2     class PlayList
  3 
  4     {
  5 
  6         // 歌曲播放列表數組
  7 
  8         private static Song[] songList = new Song[50];
  9 
 10         // 當前播放的歌曲在數組中的索引   
 11 
 12         private static int songIndex = 0;
 13 
 14  // 播放列表數組
 15 
 16         public static Song[] SongList
 17 
 18         {
 19 
 20             get { return PlayList.songList; }
 21 
 22         }
 23 
 24         //當前播放歌曲的索引
 25 
 26         public static int SongIndex
 27 
 28         {
 29 
 30             get { return PlayList.songIndex; }
 31 
 32         }
 33 
 34         // 當前播放的歌曲名稱
 35 
 36         public static string PlayingSongName()
 37 
 38         {
 39 
 40             string songName = ""; // 歌曲名稱
 41 
 42             if (SongList[SongIndex] != null)
 43 
 44             {
 45 
 46                 songName = SongList[SongIndex].SongName;
 47 
 48             }
 49 
 50             return songName;
 51 
 52         }
 53 
 54         //獲取當前播放的歌曲
 55 
 56         public static Song GetPlayingSong()
 57 
 58         {
 59 
 60             if (SongList[songIndex] != null)
 61 
 62            {
 63                return SongList[songIndex];
 64             }
 65 
 66             else
 67 
 68             {
 69                 return null;
 70 
 71             }
 72 
 73         }
 74 
 75         //下一首要播放的歌曲名稱
 76 
 77         public static string NextSongName()
 78 
 79         {
 80 
 81             string songName = ""; // 歌曲名稱
 82 
 83             if (SongList[SongIndex + 1] != null)
 84 
 85             {
 86                 songName = SongList[SongIndex + 1].SongName;
 87             }
 88             return songName;
 89 
 90         }
 91 
 92  
 93 
 94         // 點播,及添加播放,一首歌曲
 95 
 96         public static bool AddSong(Song song)
 97 
 98         {
 99 
100             //預設為沒有添加播放歌曲
101 
102             bool success = false;
103 
104             //for遍歷Song[],
105 
106             for (int i = 0; i < SongList.Length; i++)
107             {
108                 if (SongList[i] == null)
109 
110                 {
111 
112                     SongList[i] = song;
113 
114                     // Console.WriteLine(song.SongName);
115 
116                     //返回要播放的歌曲,
117 
118                     success = true;
119 
120                     break;
121                 }
122             }
123     return success;
124 
125         }
126     // 切歌 要切歌曲的編號,如果是切當前播放的歌曲傳入-1
127 
128         public static void CutSong(int index)
129 
130         {
131 
132             int i;  // 迴圈變數,代表切歌的位置
133 
134             if (index == -1)
135 
136             {
137                 i = SongIndex;
138             }
139             else
140             {
141                 i = index; // 從切歌的位置開始,將歌曲逐個向前移一個位置
142             }
143                     SongList[i].SetSongCut();
144             while (SongList[i] != null)
145             {
146                 SongList[i] = SongList[i + 1];
147                 i++;
148       

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

-Advertisement-
Play Games
更多相關文章
  • 一、簡介 GitLab是利用 Ruby on Rails 一個開源的版本管理系統,實現一個自托管的Git項目倉庫,可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能,能夠瀏覽源代碼,管理缺陷和註釋。可以管理團隊對倉庫的訪問,它非常易於瀏覽提交過的版本並提供一個文件歷史庫。團隊...
  • 該隨筆為個人原創,後期會根據項目實踐實時更新,如若轉載,請註明出處,方便大家獲得最新博文!註:安裝Nginx需要Linux系統已經安裝openssl-fips-2.0.2.tar.gzzlib-1.2.7.tar.gzpcre-8.21.tar.gz第一步:從http://nginx.org/dow...
  • 1、配置redis master,redis slave(配置具體操作見上文http://www.cnblogs.com/wangchaozhi/p/5140469.html)。redis master ip:127.0.0.1:port 6379(預設配置文件即可)redis slave1 ip:...
  • 作為一個網站開發者,使用asp.net開髮網站,由於添加功能模塊不便利,所以我開始學習mvc框架。 今天是我學習mvc框架的第一天,首先就是連接EF連接資料庫(Sql Server2012資料庫),下麵我使用圖片和文字來描述我的過程。1.首先創建控制台應用程式(使用的框架是4.5),然後再控制...
  • https://ajaxcontroltoolkit.codeplex.com/警告 7 未能找到引用的組件“Antlr3.Runtime”。 警告 6 未能找到引用的組件“HtmlAgilityPack”。 警告 10 未能找到引用的組件“HtmlAgilityPack”。 警告 1 未能找到引用...
  • 10-9. 在多對多關係中為插入和刪除使用存儲過程問題想要在一個無載荷的多對多關係中使用存儲過程(存儲過程隻影響關係的連接表)解決方案假設有一個多對多關係的作者( Author)表和書籍( Book)表. 用連接表AuthorBook來做多對多關係,如 Figure 10-11.所示:Figure ...
  • 第一章 初識Windows程式01.淺談控制台應用 解析:控制台應用程式:dos視窗中顯示 Windows窗體應用程式:有控制項參與的,支持事件的一種程式02.關於窗體項目的註意點: /*01.一個解決方案下可以包含多個項目, * 一個項目下可以包含多個窗體 * 02.如何設置一個項目下的某個窗體為啟...
  • ADO.NET操作使用ADO.NET的方式操作資料庫時,對於經常需要操作不同資料庫的同學,需要對不同的資料庫翻來覆去地寫操作類。<br 對ADO.NET,操作資料庫需要有幾個核心的東西(以MySql為例): MySqlConnection 負責mysql的連接,在操作mysql前,需要先獲得連接.....
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...