zoukankan      html  css  js  c++  java
  • MyKTV点歌系统

    历时一个多礼拜,终于做完了这个项目.说实话,项目不是很完美.那总结还是要做的,总结下知识还是很有必要的

    首先,肯定是先制作窗体

    在制作窗体的时候有各种各样的问题,有时候控件不正确,有时候手贱会把之前建好的控件删掉,反正问题不大,都可以自己解决.

    在窗体建好了之后呢,就开始正式的写代码了,每个窗体的关联,与数据库的连接,每一步都不能错,错了就得费半天劲才能调好

    其实第一天的时候我不知道脑子想什么了,老师明明说的是先写前台,我却写成了后台,这下差距就和别人大了很多.而且在这个时候,我的电脑偏偏出问题了,回家根本就不能写了,只能在学校和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就成功了

  • 相关阅读:
    二叉树的深度(剑指offer)
    平衡二叉树(剑指offer)
    平衡二叉树
    513. Find Bottom Left Tree Value(得到左下角的节点)(树的层次遍历)
    637. Average of Levels in Binary Tree(一棵树每层节点的平均数)(二叉树的层序遍历)
    145. Binary Tree Postorder Traversal(非递归实现二叉树的后序遍历)
    正则表达式式总结
    re模块
    生成器 生成器函数 列表推倒式 生成器表达式
    闭包,迭代器
  • 原文地址:https://www.cnblogs.com/ciyan/p/4691582.html
Copyright © 2011-2022 走看看