博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
S1的小成果:MyKTV系统
阅读量:5037 次
发布时间:2019-06-12

本文共 36353 字,大约阅读时间需要 121 分钟。

转眼之间,已经到了2016年,即新的一年了!S1也结束了,收获的也不多 ,想想最后留给大家的就一个KTV项目了。

希望大家看时有所收获

          现在我们一起来看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 /// 2 /// 显示当前播放的歌曲名字3 /// 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 }

 ListView控件首列不能居中问题

我也没找到解决方法,能做的,也许就是把第一列宽度设为 0,不用第一列,从第二列开始用。

此时 ListView1.Items[i].Text 也不能用了,因为它对应的是 ListView1[i].SubItems[0].Text。

设置ToolStrip对应项图片的大小,通过ImageScalingSize来设置。

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         ///  8         /// 播放歌曲 9         /// 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 KTVUtil2 3     {4 5         public static string singerPhotoPath = "";  // 歌手照片路径6 7         public static string songPath = "";         // 歌曲路径8 9     }

2.编写歌曲类(Song)

1 代码例子:enum SongPlayState 2  3     { 4  5         unplayed, played, again, cut 6  7     } 8  9     // 歌曲类10 11     class Song12 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),提供播放列表的各种方法

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

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 // 如果到达数组最后一个元素,就将最后一个元素指向空 149 if (i == SongList.Length) 150  { 151 SongList[i] = null; 152  } 153 154  } 155 156  } 157 // 重放当前歌曲 158 public static void PlayAgain() 159  { 160 if (SongList[songIndex] != null) 161  { 162  SongList[songIndex].SetPlayAgain(); 163  } 164  } 165 // 播放下一首 166 public static void MoveOn() 167 168  { 169 if (SongList[songIndex] != null && SongList[songIndex].PlayState == SongPlayState.again) 170  { 171  SongList[songIndex].SetSongPlayed(); 172  } 173 else 174  { 175 songIndex++; 176 177 } }

 去Time控件:在Tick事件中写代码

代码例子:  // 定时扫描歌曲列表,显示当前播放歌曲的名称

1   private void PlaySong() 2  3         { 4             this.song = PlayList.GetPlayingSong(); // 获取当前要播放的歌曲 5  6             if (song != null) 7             { 8  9                 this.song.SetSongPlayed();             // 将当前歌曲播放状态设为已播放10                 this.Winplaymedia.URL = KTVUtil.songPath + "\\" + this.song.SongURL;  // 得到当前播放歌曲的路径11 12             }13 14  } 15 private void timer1_Tick(object sender, EventArgs e) 16 17  { 18 19 // 在文本框中显示当前播放的歌曲名字 20 21 this.txtplay.Text = PlayList.PlayingSongName(); 22 23 this.txtnextsong.Text = PlayList.NextSongName(); 24 25 if (this.song == null) 26 27  { 28 this.PlaySong(); 29  } 30 31 if (this.Winplaymedia.playState == WMPLib.WMPPlayState.wmppsStopped) 32 33  { 34 35 this.song = null; // 将歌曲设为空 36 37  PlayList.MoveOn(); 38 39  } 40 41 // 切歌 42 43 if (this.song != null && this.song.PlayState == SongPlayState.cut) 44 45  { 46 47 this.Winplaymedia.URL = ""; 48 49 this.song = null; 50 51 }

在Load时中启动计时器:

代码例子:

  this.time.Start();

01:切歌:

1 代码例子:  DialogResult re = MessageBox.Show("确定要切歌吗?", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);2 3             if (re == DialogResult.OK)4 5             {6 7                 PlayList.CutSong(-1);8 9             }

02:重唱:

代码例子: 

1 PlayList.PlayAgain();2 3             PlaySong();4 5

移动窗体的代码: 

1   private Point mouseOffset;        //记录鼠标指针的坐标        2  3         private bool isMouseDown = false; //记录鼠标按键是否按下 4  5         private void pnlon_MouseDown(object sender, MouseEventArgs e) 6  7         { 8  9             int xOffset;10 11             int yOffset;12 13             if (e.Button == MouseButtons.Left)14 15  { 16 xOffset = -e.X - SystemInformation.FrameBorderSize.Width; 17 18 yOffset = -e.Y - SystemInformation.CaptionHeight - SystemInformation.FrameBorderSize.Height; 19 20 mouseOffset = new Point(xOffset, yOffset); 21 22 isMouseDown = true; 23 24  } 25 26  } 27 private void pnlon_MouseMove(object sender, MouseEventArgs e) 28 29  { 30 if (isMouseDown) 31 32  { 33 Point mousePos = Control.MousePosition; 34 35 mousePos.Offset(mouseOffset.X + 5, mouseOffset.Y + 30); 36 Location = mousePos; 37 38  } 39 40  } 41 42 43 44 private void pnlon_MouseUp(object sender, MouseEventArgs e) 45 46  { 47 // 修改鼠标状态isMouseDown的值 48 49 // 确保只有鼠标左键按下并移动时,才移动窗体 50 51 if (e.Button == MouseButtons.Left) 52 53  { 54 55 isMouseDown = false; 56 57  } 58 59  } 60

拼音点歌

1  // 查询歌曲显示在窗体中 2         private void btnSearch_Click(object sender, EventArgs e) 3         {                        4             DBHelper dbHelper = new DBHelper(); 5             DataSet dataSet = new DataSet(); 6             StringBuilder sb = new StringBuilder(); 7             sb.Append("select song_id,song_name,singer_name,song_url  from song_info inner join singer_info on singer_info.singer_id=song_info.singer_id "); 8 sb.AppendFormat("where song_name like '%{0}%' or song_ab like '{0}'",this.txtSongName.Text); 9 10  Console.WriteLine(sb.ToString()); 11 12 SqlDataAdapter adapter = new SqlDataAdapter(sb.ToString(), dbHelper.Connection); 13 14 // 清空当前列表 15 if (dataSet.Tables["songList"] != null) 16  { 17 dataSet.Tables["songList"].Clear(); 18  } 19 20 adapter.Fill(dataSet, "songList"); 21 this.dgvSong.DataSource = dataSet.Tables["songList"]; 22  } 23 24 private void tsbtnExit_Click(object sender, EventArgs e) 25  { 26 this.Close(); 27  } 28 29 private void dgvSong_CellClick(object sender, DataGridViewCellEventArgs e) 30  { 31 if (dgvSong.SelectedRows[0].Cells["songName"]!=null) 32  { 33 // 创建一个歌曲对象,并将当权选中的歌曲名和路径赋给该对象 34 Song song = new Song(); 35 song.SongName = dgvSong.SelectedRows[0].Cells["songName"].Value.ToString(); 36 song.SongURL = dgvSong.SelectedRows[0].Cells["songURL"].Value.ToString(); 37  PlayList.AddSong(song); 38 39 // 更新数据库,将选中的歌曲点播次数加1 40 int songId = Convert.ToInt32(dgvSong.SelectedRows[0].Cells["songId"].Value); 41 string sql = string.Format("update song_info set song_play_count=song_play_count+1 where song_id={0}", songId); 42 DBHelper dbHelper = new DBHelper(); 43 try 44  { 45 SqlCommand command = new SqlCommand(sql, dbHelper.Connection); 46  dbHelper.OpenConnection(); 47  command.ExecuteNonQuery(); 48  } 49 catch (Exception ex) 50  { 51  Console.WriteLine(ex.Message); 52 MessageBox.Show("错误!"); 53  } 54 finally 55  { 56  dbHelper.CloseConnection(); 57  } 58  } 59 }

实现分类点歌功能

1         // 窗体加载时,显示歌曲类别 2         private void OrderBySongTypeForm_Load(object sender, EventArgs e) 3         { 4             // 读取歌曲类别 5             DBHelper dbHelper = new DBHelper(); 6             string sql = "select * from song_type"; 7             try 8             { 9                 // 查询数据库10                 SqlCommand command = new SqlCommand(sql, dbHelper.Connection); 11  dbHelper.OpenConnection(); 12 SqlDataReader reader = command.ExecuteReader(); 13 14 // 循环将类别读取出来添加到ListView中 15 this.lvSongType.Items.Clear(); 16 int i = 0; 17 while (reader.Read()) 18  { 19 ListViewItem item = new ListViewItem(); 20 item.Text = Convert.ToString(reader["songtype_name"]); 21 item.Tag = Convert.ToInt32(reader["songtype_id"]); 22 item.ImageIndex = i; 23 this.lvSongType.Items.Add(item); 24 i++; 25  } 26  reader.Close(); 27  } 28 catch (Exception ex) 29  { 30  Console.WriteLine(ex.Message); 31 MessageBox.Show("cuowu!"); 32 33  } 34 finally 35  { 36  dbHelper.CloseConnection(); 37  } 38  } 39 40 private void lvSongType_Click(object sender, EventArgs e) 41  { 42 // 读取数据库,读出该歌手的所有歌曲 43 DBHelper dbHelper = new DBHelper(); 44 StringBuilder sb = new StringBuilder(); 45 sb.Append("select song_id,song_name, singer_name,song_url from song_info inner join singer_info on song_info.singer_id=singer_info.singer_id "); 46 sb.AppendFormat("where songtype_id={0}",Convert.ToInt32(lvSongType.SelectedItems[0].Tag)); 47  Console.WriteLine(sb.ToString()); 48 FrmSongList songList = new FrmSongList(); 49 songList.Sql = sb.ToString(); 50 songList.Previous = PrevioisForm.SongType; 51  songList.Show(); 52 this.Close(); 53 }

字数点歌

1   private void OrderByWordCountForm_Load(object sender, EventArgs e) 2         { 3             // 将字数列表添加到窗体中             4             for (int i = 0; i < 12; i++) 5             { 6                 // 循环生成字数项添加到窗体中 7                 ListViewItem item = new ListViewItem(); 8                 item.Text = (i + 1)+"个字"; 9 item.Tag = i + 1; 10  lvWordCount.Items.Add(item); 11  } 12 13  } 14 15 private void lvWordCount_Click(object sender, EventArgs e) 16  { 17 if (lvWordCount.SelectedItems[0] != null) 18  { 19 // 读取数据库,读出该歌手的所有歌曲 20 DBHelper dbHelper = new DBHelper(); 21 StringBuilder sb = new StringBuilder(); 22 sb.Append("select song_id,song_name, singer_name,song_url from song_info inner join singer_info on song_info.singer_id=singer_info.singer_id "); 23 sb.AppendFormat("where song_word_count={0}", Convert.ToInt32(lvWordCount.SelectedItems[0].Tag)); 24  Console.WriteLine(sb.ToString()); 25 FrmSongList songList = new FrmSongList(); 26 songList.Sql = sb.ToString(); 27 songList.Previous = PrevioisForm.WordCount; 28  songList.Show(); 29 this.Close(); 30  } 31 }

已点歌曲:

1      //刷新歌曲列表 2  3   private void timer1_Tick(object sender, EventArgs e){  4  5  this.newSonglist(); 6  7 } 8  9    private void newSonglist()10 11         {12 13             // 清空原列表14 15  lvlist.Items.Clear(); 16 17 int index = 0; 18 19 while (PlayList.SongList[index] != null) 20 21  { 22 23 ListViewItem item = new ListViewItem(); 24 25 //获取歌曲的名称 26 27 item.Text = PlayList.SongList[index].SongName; 28 29 item.Tag = index; 30 31 //歌曲的播放状态 32 33 string playState = PlayList.SongList[index].PlayState == SongPlayState.unplayed ? "未播放" : "已播放"; 34 35  item.SubItems.Add(playState); 36 37  lvlist.Items.Add(item); 38 39 index++; 40 41  } 42 43  } 44 45 //切割 46 47 private void tsbtnCut_Click_1(object sender, EventArgs e) 48 49  { 50 51 int songId = -1; // 切歌的编号 52 53 DialogResult re = MessageBox.Show("确定要切歌吗?", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); 54 55 if (re == DialogResult.OK) 57  { 58 59 if (this.lvlist.SelectedItems.Count > 0) 60 61  { 62 63 songId = Convert.ToInt32(this.lvlist.SelectedItems[0].Tag); 64 65  } 66 67  PlayList.CutSong(songId); 68 69 this.newSonglist(); 70 71  } 72 73

歌曲列表:

1    // 窗体加载时查询歌曲列表 2         private void SongListForm_Load(object sender, EventArgs e) 3         { 4             DBHelper dbHelper = new DBHelper(); 5             DataSet dataSet = new DataSet(); 6             SqlDataAdapter adapter = new SqlDataAdapter(this.Sql,dbHelper.Connection); 7             adapter.Fill(dataSet, "songList"); 8 dgvSong.DataSource = dataSet.Tables["songList"]; 9  } 10 11 // 点播一首歌曲 12 private void dgvSong_CellClick(object sender, DataGridViewCellEventArgs e) 13  { 14 // 创建一个歌曲对象,并将当权选中的歌曲名和路径赋给该对象 15 Song song = new Song(); 16 song.SongName = dgvSong.SelectedRows[0].Cells["songName"].Value.ToString(); 17 song.SongURL = dgvSong.SelectedRows[0].Cells["songURL"].Value.ToString(); 18  PlayList.AddSong(song); 19 20 // 更新数据库,将选中的歌曲点播次数加1 21 int songId = Convert.ToInt32(dgvSong.SelectedRows[0].Cells["songId"].Value); 22 string sql = string.Format("update song_info set song_play_count=song_play_count+1 where song_id={0}", songId); 23 DBHelper dbHelper = new DBHelper(); 24 try 25  { 26 SqlCommand command = new SqlCommand(sql, dbHelper.Connection); 27  dbHelper.OpenConnection(); 28  command.ExecuteNonQuery(); 29  } 30 catch (Exception ex) 31  { 32  Console.WriteLine(ex.Message); 33 MessageBox.Show("错误!"); 34  } 35 finally 36  { 37  dbHelper.CloseConnection(); 38  } 39 }

                                                      后台管理

KTVUtil 类:

1 public   class  KTVUtil 2  3     { 4  5         //保存歌曲的目录 6  7         public static string songURL = ""; 8  9         //保存歌手图片的目录10 11         public static string singer_photoURL = "";12 13 }

主窗体的Load事件:

1  private void frmKTV_Load(object sender, EventArgs e) 2  3         { 4  5   6  7             // 歌曲路径 8  9             string sql = "select resource_path from Resource_path where resource_id=2";10 11             KTVUtil.songURL = song_path(sql);12 13             // 歌手图片路径14 15             string sql1 = "select resource_path from Resource_path where resource_id=1";16 17             KTVUtil.singer_photoURL = song_path(sql1); 18 19  } 20 21 //路径 22 23 private string song_path(string sql) 24 25  { 26 27 SqlConnection con = new SqlConnection(DBHelp.str); 28 29 SqlCommand cmd = new SqlCommand(sql, con); 30 31 string path = ""; 32 33 34 35  con.Open(); 36 37 SqlDataReader dr = cmd.ExecuteReader(); 38 39 40 41 if (dr != null) 42 43  { 44 45 if (dr.HasRows) 46 47  { 48 49 while (dr.Read()) 50 51  { 52 53 path = dr["resource_path"].ToString();

增加修改歌手信息:

1 获取图片的代码:  2  3   //相对路径 4  5         public string FileName; 6  7         //绝对路径 8  9         public string Path;10 11  //获取12 13         private void btnLiu_Click(object sender, EventArgs e)14 15         {16 17             DialogResult result = open.ShowDialog(); 18 19 20 21 if (result == DialogResult.OK)//获取路径 22 23  { 24 25 //相对路径 26 27 FileName = open.SafeFileName; 28 29 //绝对路径 30 31 Path = open.FileName; 32 33 pic.Image = Image.FromFile(Path); 39  } 40 41  } 42 43 //复制图片的路径 44 45 if (Path != null) 46 47  { 48 49 if (Path != KTVUtil.singer_photoURL + FileName) 50 51  { 52 53 File.Copy(Path, KTVUtil.singer_photoURL + FileName, true); 54 55  } 56 57  } 58 59 60 61 private void 修改ToolStripMenuItem_Click(object sender, EventArgs e) 62 63  { 64 65 if (dgvlist.SelectedRows[0].Cells[0].Value.ToString() != "") 66 67  { 68 69 //获取选中行的歌曲编号 70 71 int songid = Convert.ToInt32(dgvlist.SelectedRows[0].Cells["song_id"].Value); 72 73 FrmAddSong frm = new FrmAddSong(); 74 75 frm.songid = songid; 76 77  frm.Show(); 78 79  } 80 81 else 82 83  { 84 85 MessageBox.Show("选歌曲"); 86 87 }

查询,删除,歌手信息

 

1    public void deletesonginfo()  2         {  3             //获取选中行的歌手编号  4             singer_id = Convert.ToInt32(dgvlist.SelectedRows[0].Cells["siigid"].Value);  5             string sql = "delete song_info where singer_id=" + singer_id + "";  6   7             SqlCommand cmd = new SqlCommand(sql, con);  8  con.Open(); 9  cmd.ExecuteNonQuery(); 10  con.Close(); 11 12  } 13 //删除歌手 14 public void deletesingerinfo() 15  { 16 //获取选中行的歌手编号 17 singer_id = Convert.ToInt32(dgvlist.SelectedRows[0].Cells["siigid"].Value); 18 string sql1 = "select song_id from song_info where singer_id=" + singer_id + ""; 19 SqlConnection con1 = new SqlConnection(DBHelp.str); 20 SqlCommand cmd1 = new SqlCommand(sql1, con1); 21  con1.Open(); 22 int song_id = Convert.ToInt32(cmd1.ExecuteScalar()); 23  con1.Close(); 24 if (song_id != 0) 25  { 26 MessageBox.Show("删除该歌手的歌曲信息"); 27 28  } 29 else 30  { 31 string sql = "delete dbo.singer_info where singer_id=" + singer_id + " "; 32 33 SqlCommand cmd = new SqlCommand(sql, con); 34  con.Open(); 35 int count = cmd.ExecuteNonQuery(); 36 if (count > 0) 37  { 38 MessageBox.Show("成功!"); 39 string RowFilter = ""; 40  SelectInfo(RowFilter); 41  } 42 else 43  { 44 MessageBox.Show("失败!"); 45  } 46 47  con.Close(); 48 49  } 50 51  } 52 //给dgvlist控件绑定数据的方法 53 public void SelectInfo(string RowFilter) 54  { 55 dgvlist.AutoGenerateColumns = false; 56 //歌手姓名,歌手类型,歌手性别,歌手描述 57 58 string sql = "select singer_info.singertype_id,singer_name,singer_id,singertype_name,singer_gender,singer_description from dbo.singer_info,dbo.singer_type where singer_info.singertype_id=singer_type.singertype_id "; 59 SqlDataAdapter da = new SqlDataAdapter(sql, con); 60 DataSet ds = new DataSet(); 61 try 62  { 63 da.Fill(ds, "info"); 64 DataView dv = new DataView(ds.Tables["info"]); 65 dv.RowFilter = RowFilter; 66 dgvlist.DataSource = dv; 67  } 68 catch (Exception) 69  { 70 71 MessageBox.Show("网络异常!"); 72  } 73 finally 74  { 75  con.Close(); 76  } 77  } 78 private void btnselect_Click(object sender, EventArgs e) 79  { 80 81 if (txtname.Text == "" && cboty.Text == "全部") 82  { 83 string RowFilter = ""; 84  SelectInfo(RowFilter); 85  } 86 else if (txtname.Text != "") 87  { 88 //获取要查询歌手的姓名 89 name = txtname.Text; 90 //获取要查询的歌手类型 91 int type = Convert.ToInt32(cboty.SelectedValue); 92 string RowFilter = "singer_name like '%" + name + "%'"; 93  SelectInfo(RowFilter); 94 95  } 96 else 97  { 98 99 //获取要查询歌手的姓名 100 name = txtname.Text; 101 //获取要查询的歌手类型 102 int type = Convert.ToInt32(cboty.SelectedValue); 103 string RowFilter = "singer_name like '%" + name + "%' and singertype_id=" + type + ""; 104  SelectInfo(RowFilter); 105  } 106 107  } 108 //给歌手类型下拉框绑定数据的方法 109 public void LoadINGO() 110  { 111 112 string sql = "select * from dbo.singer_type"; 113 SqlDataAdapter da = new SqlDataAdapter(sql, con); 114 DataSet ds = new DataSet(); 115 try 116  { 117 da.Fill(ds, "info"); 118 cboty.DataSource = ds.Tables["info"]; 119 cboty.DisplayMember = "singertype_name"; 120 cboty.ValueMember = "singertype_id"; 121 DataRow row = ds.Tables["info"].NewRow(); 122 row["singertype_id"] = -1; 123 row["singertype_name"] = "全部"; 124 ds.Tables["info"].Rows.InsertAt(row, 0); 125 cboty.SelectedIndex = 0; 126 127 128  } 129 catch (Exception) 130  { 131 132 MessageBox.Show("网路异常!"); 133  } 134 finally 135  { 136  con.Close(); 137  } 138  } 139 private void FrmSelectSinger_Load(object sender, EventArgs e) 140  { 141 142 // 给歌手类型下拉框绑定数据的方法 143  LoadINGO(); 144 //给dgvlist控件绑定数据 145 string RowFilter = ""; 146  SelectInfo(RowFilter); 147  } 148 149 private void 删除ToolStripMenuItem_Click_1(object sender, EventArgs e) 150  { 151 if (dgvlist.SelectedRows[0].Cells[0].Value.ToString() != "") 152  { 153 DialogResult result = MessageBox.Show("确定删除?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); 154 if (result == DialogResult.OK) 155  { 156 //删除歌手信息的方法 157  deletesonginfo(); 158  deletesingerinfo(); 159 string RowFilter = ""; 160 SelectInfo(RowFilter);

增加歌曲和修改歌曲:

1 public int songid; 2  3         public string Path; 4  5         //相对路径 6  7         public string txtxdpath; 8  9   //新增歌曲信息的方法10 11         public void addinfo()12 13         {14 15             //获取歌曲名称16 17             string song_name = txtname.Text; 18 19 //获取拼音缩写信息 20 21 string py = txtsuo.Text; 22 23 //获取歌曲类型对应的隐藏值 24 25 int type_id = Convert.ToInt32(cboty.SelectedValue); 26 27 //获取歌手姓名对应的编号 28 29 int singe_id = Convert.ToInt32(txtsername.Tag); 30 31 //获取歌曲文件名 32 33 string url = txtsongurl.Text; 34 35 //获取歌曲名称的长度 36 37 int length = song_name.Length; 38 39 //拼接sql语句 40 41 string sql = "insert into song_info values('" + song_name + "','" + py + "'," + length + "," + type_id + "," + singe_id + ",'" + url + "',default)"; 42 43 SqlCommand cmd = new SqlCommand(sql, con); 44 45  con.Open(); 46 47 int result = cmd.ExecuteNonQuery(); 48 49 if (result > 0) 50 51  { 52 53 MessageBox.Show("保存成功!"); 54 55 if (Path != null) 56 57  { 58 59 if (Path != KTVUtil.songURL + txtxdpath) 60 61  { 62 63 File.Copy(Path, KTVUtil.songURL + txtxdpath, true); 64 65  } 66  } 67 68  } 69 70 else 71 72 {

查询,删除歌曲信息

1   //删除歌曲信息的方法  2         public void deletesong()  3         {  4   5             if (dgvlist.SelectedRows[0].Cells[0].Value.ToString() != "")  6             {  7                 //获取选中行的歌曲编号  8                 int song_id = Convert.ToInt32(dgvlist.SelectedRows[0].Cells["song_id"].Value);  9                 DialogResult result = MessageBox.Show("删除?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); 10 if (result == DialogResult.OK) 11  { 12 SqlConnection con = new SqlConnection(DBHelp.str); 13 string sql = "delete song_info where song_id=" + song_id + ""; 14 SqlCommand cmd = new SqlCommand(sql, con); 15 16  con.Open(); 17 int count = cmd.ExecuteNonQuery(); 18 if (count > 0) 19  { 20 MessageBox.Show("成功!"); 21 string RowFilter=""; 22  LoadAllINFO(RowFilter); 23  } 24 else 25  { 26 MessageBox.Show("失败!"); 27  } 28 29  con.Close(); 30 31  } 32 33  } 34 else 35  { 36 37 MessageBox.Show("选歌曲"); 38 39  } 40  } 41 //给歌曲类型下拉框赋值的方法 42 public void LoadINFO() 43  { 44 45 SqlConnection con = new SqlConnection(DBHelp.str); 46 string sql = "select * from song_type"; 47 SqlDataAdapter da = new SqlDataAdapter(sql, con); 48 DataSet ds = new DataSet(); 49 50 da.Fill(ds, "info"); 51 cbolist.DataSource = ds.Tables["info"]; 52 cbolist.DisplayMember = "songtype_name"; 53 cbolist.ValueMember = "songtype_id"; 54 55 DataRow row = ds.Tables["info"].NewRow(); 56 row["songtype_id"] = -1; 57 row["songtype_name"] = "全部"; 58 ds.Tables["info"].Rows.InsertAt(row, 0); 59 cbolist.SelectedIndex = 0; 60 61 62 63 64  con.Close(); 65 66 67  } 68 69 //给dgvlist绑定数据的方法 70 public void LoadAllINFO(string RowFilter) 71  { 72 //取消英文列自动生成 73 dgvlist.AutoGenerateColumns = false; 74 SqlConnection con = new SqlConnection(DBHelp.str); 75 string sql = "select song_id,song_name,songtype_name,song_play_count,song_info.songtype_id from song_info,song_type where song_info.songtype_id=song_type.songtype_id"; 76 SqlDataAdapter da = new SqlDataAdapter(sql, con); 77 DataSet ds = new DataSet(); 78 79 da.Fill(ds, "info"); 80 DataView dv = new DataView(ds.Tables["info"]); 81 dv.RowFilter = RowFilter; 82 dgvlist.DataSource = dv; 83 84  con.Open(); 85 86 87  } 88 private void btnselect_Click(object sender, EventArgs e) 89  { 90 91 92 if (txtname.Text == "" && cbolist.Text == "全部") 93  { 94 string RowFilter = ""; 95  LoadAllINFO(RowFilter); 96  } 97 else if (txtname.Text != "") 98  { 99 //获取歌曲名称 100 string song_name = txtname.Text; 101 //获取歌曲类型对应的隐藏值 102 int type_id = Convert.ToInt32(cbolist.SelectedValue); 103 string RowFilter = "song_name like '%" + song_name + "%'"; 104  LoadAllINFO(RowFilter); 105 106  } 107 else 108  { 109 110 //获取歌曲名称 111 string song_name = txtname.Text; 112 //获取歌曲类型对应的隐藏值 113 int type_id = Convert.ToInt32(cbolist.SelectedValue); 114 string RowFilter = "song_name like '%" + song_name + "%' and songtype_id =" + type_id + ""; 115  LoadAllINFO(RowFilter); 116 117  } 118  } 119 120 private void 修改ToolStripMenuItem_Click(object sender, EventArgs e) 121  { 122 if (dgvlist.SelectedRows[0].Cells[0].Value.ToString() != "") 123  { 124 //获取选中行的歌曲编号 125 int songid = Convert.ToInt32(dgvlist.SelectedRows[0].Cells["song_id"].Value); 126 FrmAddSong frm = new FrmAddSong(); 127 frm.songid = songid; 128  frm.Show(); 129  } 130 else 131  { 132 MessageBox.Show("选歌曲"); 133  } 134  } 135 136 private void 删除ToolStripMenuItem_Click(object sender, EventArgs e) 137  { 138 139 //删除歌曲信息的方法 140  deletesong(); 141  } 142 143 private void frmselectSong_Load(object sender, EventArgs e) 144  { 145 //给歌曲类型下拉框赋值 146  LoadINFO(); 147 //给dgvlist绑定数据 148 string RowFilter = ""; 149  LoadAllINFO(RowFilter); 150 }

歌曲路径:

1    private void frmAddSongURL_Load(object sender, EventArgs e) 2  3         { 4  5             string sql = "select resource_path from Resource_path where resource_id=2"; 6  7             txtoldurl.Text = song_path(sql); 8  9         }10 11 //给当前路径赋值12 13         private string song_path(string sql) 14 15  { 16 17 18 19 SqlCommand cmd = new SqlCommand(sql, con); 20 21 string path = ""; 22 23 try 24 25  { 26 27  con.Open(); 28 29 SqlDataReader dr = cmd.ExecuteReader(); 30 31 32 33 if (dr != null) 34 35  { 36 37 if (dr.HasRows) 38 39  { 40 41 while (dr.Read()) 42 43  { 44 45 path = dr["resource_path"].ToString(); 46 47  } 48 49 50 51 DialogResult re = MessageBox.Show("修改路径?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 52 53 if (re == DialogResult.Yes) 54 55  { 56 57 58 59  Directory.Delete(txtnewurl.Text); 60 61  Directory.Move(txtoldurl.Text, txtnewurl.Text); 62 63 string newUrl = txtnewurl.Text; 64 65 SqlConnection con = new SqlConnection(DBHelp.str); 66 67 string sql = "update Resource_path set resource_path='" + newUrl + "' where resource_type='song'"; 68 69 SqlCommand cmd = new SqlCommand(sql, con); 70 71 try 72 73  { 74 75  con.Open(); 76 77 int count = cmd.ExecuteNonQuery(); 78 79 if (count > 0) 80 81 //浏览新路径 82 83 private void btnLiu_Click(object sender, EventArgs e) 84 85  { 86 87 88 89 DialogResult result = brow.ShowDialog(); 90 91 if (result == DialogResult.OK) 92 93  { 94 95 txtnewurl.Text = brow.SelectedPath + "\\"; 96 97 }
1 //歌曲的文件名: 2  3 //浏览 4  5   private void btnLiu_Click(object sender, EventArgs e) 6  7         { 8  9             open.Filter = "歌曲文件|*.mp3;";10 11             DialogResult result = open.ShowDialog();12 13             if (result == DialogResult.OK)//获取路径14 15             {16 17                 //相对路径18 19                 txtxdpath = open.SafeFileName; 20 21 txtsongurl.Text = txtxdpath; 22 23 //绝对路径 24 25 Path = open.FileName; 26 27 28 29 int dot = txtxdpath.LastIndexOf('.'); 30 31 string fileType = txtxdpath.Substring(dot + 1); 32 33 if (fileType != "mp3") 34 35  { 36 37 MessageBox.Show("文件类型不对!");

 

歌手图片的路径:

1 //给当前路径赋值 2  3         private string song_path(string sql) 4  5         { 6  7             SqlConnection con = new SqlConnection(DBHelp.str); 8  9             SqlCommand cmd = new SqlCommand(sql, con);10 11             string path = "";12 13  14 15  con.Open(); 16 17 SqlDataReader dr = cmd.ExecuteReader(); 18 19 20 21 if (dr != null) 22 23  { 24 25 if (dr.HasRows) 26 27  { 28 29 while (dr.Read()) 30 31  { 32 33 path = dr["resource_path"].ToString(); 34 35  } 36 37 private void btnSa_Click(object sender, EventArgs e) 38 39  { 40 41 // 如果新路径为空,提示 42 43 if (this.txtnewurl.Text.Trim() == "") 44 45  { 46 47 MessageBox.Show("请选择新路径!"); 48 49  } 50 51 else 52 53  { 54 55 // 用户确认修改 56 57 if (MessageBox.Show("确定要修改路径吗?", "操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) 58 59  { 60 61 62 63  Directory.Delete(txtnewurl.Text); 64 65  Directory.Move(txtoldurl.Text, txtnewurl.Text); 66 67 string newUrl = txtnewurl.Text; 68 69 SqlConnection con = new SqlConnection(DBHelp.str); 70 71 string sql = "update Resource_path set resource_path='" + newUrl + "' where resource_type='singer_photo'"; 72 73 SqlCommand cmd = new SqlCommand(sql, con); 74 75  con.Open(); 76 77 int count = cmd.ExecuteNonQuery(); 78 79 if (count > 0) 80 81  { 82 83 //浏览 84 85 private void btnLiu_Click(object sender, EventArgs e) 86 87  { 88 89 DialogResult result = brow.ShowDialog(); 90 91 if (result == DialogResult.OK) 92 93  { 94 95 txtnewurl.Text = brow.SelectedPath + "\\"; 96 97 }

汉字转拼音首字母

1   public static string GetChineseSpell(string strText) 2         { 3             if (strText == null || strText.Length == 0) 4                 return strText; 5             System.Text.StringBuilder myStr = new System.Text.StringBuilder(); 6             foreach (char vChar in strText) 7  { 8 // 若是字母则直接输出 9 if ((vChar >= 'a' && vChar <= 'z') || (vChar >= 'A' && vChar <= 'Z')) 10 myStr.Append(char.ToUpper(vChar)); 11 else if ((int)vChar >= 19968 && (int)vChar <= 40869) 12  { 13 // 若字符Unicode编码在编码范围则 查汉字列表进行转换输出 14 foreach (string strList in strChineseCharList) 15  { 16 if (strList.IndexOf(vChar) > 0) 17  { 18 myStr.Append(strList[0]); 19 break; 20  } 21  } 22  } 23  } 24 return myStr.ToString(); 25 }// GetChineseSpell 26 27

 这可是我辛辛苦苦的成果哦,虽然这不算什么,但我还希望大家看看就能收获一些知识,就开心了。

 

 

转载于:https://www.cnblogs.com/weiguangyi/p/5175446.html

你可能感兴趣的文章
ssm中实现excle导入导出
查看>>
2011-07-06 11:19 Hibernate提供了3种检索策略
查看>>
CSS Hacker
查看>>
有关Botton的用法(一)
查看>>
前端jquery一些基本语法
查看>>
单表入库最快的方法
查看>>
线性的数据结构
查看>>
使用MQ消息队列的优缺点
查看>>
SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)
查看>>
Win8Metro(C#)数字图像处理--2.5图像亮度调整
查看>>
SQLServer2005数据库快照的简单使用
查看>>
ASP.NET MVC 5 入门教程 (4) View和ViewBag
查看>>
T-SQL性能调整——信息收集
查看>>
Powerdesigner 16.5 从SQL Server 2012做逆向工程时提示:Unable to list tables问题
查看>>
NSIS:卸载时选择组件
查看>>
程序员最新笑话集锦
查看>>
10.29
查看>>
Linux(CentOS)下安装Zend Framework
查看>>
ArcEngine 数据导入经验(一)
查看>>
LINQ 【增、删、改、查】数据绑定
查看>>