前台管理
主界面:
主要代码:
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 try18 {19 dbHelper.OpenConnection();20 KTVUtil.singerPhotoPath = command.ExecuteScalar().ToString();21 }22 catch (Exception ex)23 {24 MessageBox.Show("资源路径发生错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);25 }26 finally27 {28 dbHelper.CloseConnection();29 }30 31 // 读取歌曲路径32 sql = "select resource_path from resource_path where resource_type = 'song'";33 command.CommandText = sql;34 try35 {36 dbHelper.OpenConnection();37 KTVUtil.songPath = command.ExecuteScalar().ToString();38 }39 catch (Exception ex)40 {41 MessageBox.Show("路径错误", MessageBoxButtons.OK, MessageBoxIcon.Error);42 }43 finally44 {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 try18 {19 // 查询数据库20 SqlCommand command = new SqlCommand(sql, dbHelper.Connection);21 dbHelper.OpenConnection();//相当于con.open22 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 finally45 {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 // 点击歌手姓名,打开歌曲列表窗口 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 }
1. 我们都知道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控件首列不能居中问题
- 我也没找到解决方法,能做的,也许就是把第一列宽度设为 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 /// <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 KTVUtil2 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 Song12 13 {14 15 //歌曲名称16 17 public string SongName18 19 {20 21 get { return songName; }22 23 set { songName = value; }24 25 }26 27 //歌曲存放路径28 29 public string SongURL30 31 {32 33 get { return songURL; }34 35 set { songURL = value; }36 37 }38 39 // 歌曲播放状态40 41 internal SongPlayState PlayState42 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 // 切歌 要切歌曲的编号,如果是切当前播放的歌曲传入-1127 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 else140 {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 else174 {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 61
拼音点歌
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 // 更新数据库,将选中的歌曲点播次数加140 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 try44 {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 finally55 {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 finally35 {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 // 更新数据库,将选中的歌曲点播次数加121 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 try25 {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 finally36 {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:增加修改歌手信息:
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 else82 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 try116 {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 finally135 {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 else71 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 else108 {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 else131 {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 try24 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 try72 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 else52 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
这可是我辛辛苦苦的成果哦,希望大家认真看,会有收获的
原标题:MyKTV前后台点歌管理系统
关键词: