歷時一個多禮拜,終於做完了這個項目.說實話,項目不是很完美.那總結還是要做的,總結下知識還是很有必要的
首先,肯定是先制作窗體
在制作窗體的時候有各種各樣的問題,有時候控件不正確,有時候手賤會把之前建好的控件刪掉,反正問題不大,都可以自己解決.
在窗體建好了之后呢,就開始正式的寫代碼了,每個窗體的關聯,與數據庫的連接,每一步都不能錯,錯了就得費半天勁才能調好
其實第一天的時候我不知道腦子想什么了,老師明明說的是先寫前台,我卻寫成了后台,這下差距就和別人大了很多.而且在這個時候,我的電腦偏偏出問題了,回家根本就不能寫了,只能在學校和Bug做斗爭,
先說掉用窗體吧,一個窗體到下一個窗體怎么調用呢?
很簡單,兩行代碼就可以搞定
FrmOrderBySinger frmSinger = new FrmOrderBySinger();
frmSinger.Show();
然后就可以實現窗體跳轉
看一下我特別丑的界面吧,但是功能還是很全的哦,不要在意外表美,要注重內在美
接下來就是要實現功能了,一個點歌系統,它的界面必須清楚,明朗,要不點歌的人看着會很煩,別說點歌了,肯定看都不會看
歌星點歌里要有更仔細的分類
要有男女組合分類,在更近一層就是地區分類,最后就是歌手名字了,先看一下效果圖吧
點擊歌手,里面就是歌手的所有歌曲了.我下載的歌曲少,所以就只有一首歌曲,重點是實現,而不是歌曲的多少,
這些都是利用一個窗體完成的,就是使用了三個listView控件,使它們在運行在一個窗體中,
他們都是層級關系,一個控件調用另一個控件
其實第二個listView開始,就不是窗體上的圖片了,而是利用代碼搞定的,這就是代碼的神奇之處
下面,就仔細的說說是怎么用代碼實現的
當你點擊男?女?或者組合的時候,就是這些代碼帶你跳轉到下一個ListView控件,圖片就是一個路徑,然后根據路徑就可以把圖片調到ListView中,連接數據庫,把底下的字就可以調用出來了這些代碼就實現了我們所有的需求
if (listView2.SelectedItems[0]!=null)
{
listView2.Visible = false;
lvName.Visible = true;
lvName.Location = listView1.Location;
SingerId = Convert.ToInt32(listView2.SelectedItems[0].Tag);
StringBuilder sb = new StringBuilder();
string sum = SingerType;
if (sum!="組合")
{
sum = SingerType == "女歌手" ? "男" : "女";
}
string sql = string.Format("select singer_name,singer_photo_url,singer_id from singer_info where singertype_id='{0}' and singer_sex='{1}'", SingerId,sum);
SqlCommand cmd = new SqlCommand(sql, db.Conection);
try
{
db.OpenConnection();
SqlDataReader read = cmd.ExecuteReader();
//歌手頭像索引
int imageindex = 0;
//清空圖片集合
imageName.Images.Clear();
//清空listview列表集合
lvName.Items.Clear();
if (read.HasRows)
{
while (read.Read())
{
//圖片的地址
string path = KtvUtil.FilePath + @"\" + Convert.ToString(read["singer_photo_url"]);
//圖片路徑裝載到imagelist
imageName.Images.Add(Image.FromFile(path));
//將類型裝載到集合中去
ListViewItem lvitem = new ListViewItem();
string typename = Convert.ToString(read["singer_name"]);
int typeid = Convert.ToInt32(read["singer_id"]);
lvitem.Text = typename;
lvitem.Tag = typeid;
lvitem.ImageIndex = imageindex;
lvName.Items.Add(lvitem);
imageindex++;
}
read.Close();
}
}
catch (Exception ex)
{
MessageBox.Show("第三個系統報錯!" + ex.Message);
}
接下來,點擊歌手名字,所屬歌手的歌曲就可以顯示出來了
比如,點擊李宇春,她的歌曲就會顯示出來
數據庫里,李宇春就一首歌,如果你想點擊其他的歌曲,可以用KTV后台來添加,咱們現在這個是前台
如果你點擊歌曲的話,歌曲就會同時播放,
先看一下效果圖吧
這就是播放歌曲的控件,下面就說代碼是怎么實現的
//當前播放的歌曲
private SongList song;
public void palySong()
{
//把播放類的播放方法賦給當前的播放歌曲
this.song = PalyList.GetSong();
//當歌曲不為空的時候
if (song!=null)
{
//調取歌曲的播放狀態
this.song.PalyState();
//歌曲的路徑
Player1.URL = KtvUtil.SongPath+"\\"+ this.song.SongUl1;
}
}
這個就可以實現歌曲播放了,就這邊像是切歌啊,重唱啊,就一塊說了吧
如果點擊切歌的話,就把當前歌曲-1就可以了,代碼如下:
if (MessageBox.Show("確定要切歌嗎?","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning)==DialogResult.OK)
{
PalyList.CutSong(-1);
}
最好有一個提示框,要是顧客有時候點錯了呢,對吧!
重唱呢,就是在把唱歌的方法重復一遍就好了
palySong();
這個就是剛剛播放歌曲的方法 .
然后呢,我們要說的是拼音點歌,其實拼音點歌比較簡單,就是利用模糊查詢就可以實現
ab = textBox1.Text;
string sql = "select singer_info.singer_name,song_info.song_name,song_url from singer_info,song_info where singer_info.singer_id=song_info.singer_id";
if (ab!=string.Empty)
{
sql = string.Format(sql+" and song_info.song_ab like '{0}%'",ab);
}
sda.SelectCommand = new SqlCommand(sql,db.Conection);
if (ds.Tables["songinfo"]!=null)
{
ds.Tables["songinfo"].Clear();
}
sda.Fill(ds,"songinfo");
DataTable table=ds.Tables["songinfo"];
this.dataGridView1.DataSource = ds.Tables["songinfo"];
}
這些代碼就可以是實現模糊查詢
接下來就說分類點歌吧,分類點歌呢,需要四步來完成,哪四步呢?
先看下效果圖吧
點擊情歌,就會出現對應的歌曲
第一步判斷datagridView有沒有選中的行
第二步從實例化SongList類
第三步調取歌曲song類的字段進行賦值(從datagridview中的列賦值);
第四部把從datagridview中獲取到的數據添加到播放類里的數組中
int index = 0;
string sql = "select songtype_id,songtype_name,songtype_URL from song_type";
SqlCommand cmd = new SqlCommand(sql, db.Conection);
db.OpenConnection();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
string path = KtvUtil.FilePath + "\\"+Convert.ToString(reader["songtype_URL"]);
imageList1.Images.Add(Image.FromFile(path));
ListViewItem lvitem = new ListViewItem();
string typename = Convert.ToString(reader["songtype_name"]);
int typeid = Convert.ToInt32(reader["songtype_id"]);
lvitem.Text = typename;
lvitem.Tag = typeid;
lvitem.ImageIndex = index;
this.listView1.Items.Add(lvitem);
index++;
}
}
reader.Close();
db.CloseConnection();
this.dataGridView1.Visible = false;
string sql = "SELECT song_name,singer_name FROM singer_info,song_info WHERE singer_info.singer_id=song_info.singer_id AND songtype_id={0}";
sql = string.Format(sql + " AND songtype_id={0}", Convert.ToInt32(listView1.SelectedItems[0].Tag));
sda.SelectCommand = new SqlCommand(sql, db.Conection);
if (ds.Tables["num"] != null)
{
ds.Tables["num"].Clear();
}
sda.Fill(ds, "num");
this.dataGridView1.DataSource = ds.Tables["num"];
接下里要說的就是金榜排行
它是呢,根據點擊次數排行,利用Order By進行排序,點擊次數越多,排行越靠前
if (this.dataGridView1.SelectedRows[0] != null)
{
SongList song = new SongList();
//歌曲名稱
song.SongName1 = this.dataGridView1.SelectedRows[0].Cells[0].Value.ToString();
//歌曲路徑
song.SongUl1 = this.dataGridView1.SelectedRows[0].Cells[1].Value.ToString();
PalyList.AddSong(song);
}
string sql = "select song_name,singer_name,song_play_count,song_url from song_info,singer_info where song_info.singer_id=singer_info.singer_id order by song_play_count desc";
if (ds.Tables["sum"]!=null)
{
ds.Tables["sum"].Clear();
}
sda.SelectCommand = new SqlCommand(sql,db.Conection);
sda.Fill(ds,"sum");
this.dataGridView1.DataSource = ds.Tables["sum"];
最后呢,就是字數點歌了
if (ds.Tables["num"] != null)
{
ds.Tables["num"].Clear();
}
string sql = "select song_info.song_name,singer_info.singer_name,song_info.song_url from song_info,singer_info where song_info.singer_id=singer_info.singer_id ";
sql = string.Format(sql + " and song_info.song_word_count={0}", mains.ToString());
sda.SelectCommand = new SqlCommand(sql,db.Conection);
sda.Fill(ds,"num");
this.dataGridView1.DataSource=ds.Tables["num"];
這就實現了整個TKV前台的操作了,一個完整的KTV就成功了