C#编程基础——综合项目实践:KTV点歌系统项目第五课:制作歌曲管理窗体 - Go语言中文社区

C#编程基础——综合项目实践:KTV点歌系统项目第五课:制作歌曲管理窗体


1、制作歌曲管理窗体

制作效果:

前期准备:设计歌曲管理窗体FrmSongInfo

歌曲管理窗体FrmSongInfo控件属性设置
控件 命名(Name属性) 说明(其他属性设置)
窗体 FrmSongInfo Text:歌曲信息管理
分组框控件GroupBox 默认名称即可,不用修改 Text:(删除默认Text属性值,使其为空)
用来输入编号信息的文本框控件TextBox txtId

Enable:false

用来显示歌曲名称的文本框控件TextBox txtName  
用来显示拼音文本的框控件TextBox txtPinyin  
用来显示类型的组合框控件ComboBox cboType DropDownStyle:DropDownList
用来显示歌手的组合框控件ComboBox cboSinger 考虑歌手较多时选择困难,因此歌手可以手动输入
用来显示文件路径的文本框控件TextBox txtFileName  
选择文件按钮控件Button btnFile  
保存按钮控件Button btnSave  
删除按钮控件Button btnDelete  
重置按钮控件Button btnReset  
展示歌曲信息的数据网格视图控件DataGridView dgvSong

BackgroundColor:White

ReadOnly:true

SelectionMode:FullRowSelect

打开文件对话框控件OpenFileDialog ofdFile 直接将该控件拖放到窗体上即可,它显示在窗体下方

 

第一步:分析该控件的功能。在此窗体,我们希望管理员可以实时添加歌曲信息到数据库里。那么在添加歌曲信息的时候,

  • 编号:是标识列,所以不允许我们填写内容,
  • 歌曲名称:是需要我们填写的,
  • 拼音缩写:需要我们自己填写
  • 类型:这里我们希望调用数据库表里已有的信息(当时设计歌手数据表的时候,类型一列是外键,引用了歌手类型表中的主键),可以自己写一个方法来实现这个功能
  • 歌手:希望调用数据库表里已有的歌手信息(通过方法实现),同时也可以自己输入歌手名字
  • 文件路径:通过按钮,获取歌曲在电脑中的路径
  • 按钮:不同按钮通过添加Click事件来实现具体功能
  • DataGridView:展示数据库表里的歌曲信息,可以自己写一个方法来实现这个功能

第二步:在窗体设计界面,选中窗体以后,单击鼠标右键——【查看代码】,可以进入该窗体的代码编写模式。

我们先写三个方法,分别用来实现类型调用、歌手调用和歌曲信息展示的功能。

流程:直接声明方法即可。

        //1、需要显示歌曲、调用歌手、调取歌曲类型,因此先写3个方法,分别用来获取这些信息
        //1.1声明一个方法bindSongs(),用来获取表中关于歌曲的信息
        private void bindSongs()
        {
            //声明一个字符串,用来查询数据库中指定的数据(这里用到三表连接查询)
            String sql = "select s.id 编号,s.name 歌曲名称,s.pinyin 拼音缩写,t.songType 类型,si.name 歌手,s.songURL 文件路径,s.playCount 点播数 from tb_songs s ,tb_songTypes t ,tb_singers si where s.songTypeId=t.id and s.singerId=si.id; ";
            DataSet dataSet = DatabaseHelper.executeQuery(sql);//将查询的数据,填充到临时仓库中
            dgvSong.DataSource = dataSet.Tables[0];//将临时仓库中的数据,做为DataGridView控件的数据源
        }
        //1.2声明一个方法bindSongType(),用来获取表中关于歌曲类型的信息
        private void bindSongType()
        {
            string sql = "select * from tb_songTypes";//声明一个字符串,用来从数据库查询提取数据
            DataSet dataSet = DatabaseHelper.executeQuery(sql);//使用DatabaseHelper类的executeQuery()方法,获取数据,并将数据存放在临时仓库里
            cboType.DataSource = dataSet.Tables[0];//将临时仓库中的数据,作为“类型”组合框的数据源
            cboType.DisplayMember = "songType";//当选中其中一个选项时,用户看到的内容
            cboType.ValueMember = "id";//该选项的对应值
        }
        //1.3声明一个方法bindSinger(),用来获取表中关于歌手的信息
        private void bindSinger()
        {
            string sql = "select * from tb_singers";
            DataSet dataSet = DatabaseHelper.executeQuery(sql);
            cboSinger.DataSource = dataSet.Tables[0];
            cboSinger.DisplayMember = "name";
            cboSinger.ValueMember = "id";
        }

第三步:方法写好了,要使用它,才会起作用。这里我们希望当窗体打开完成之后,就可以实现类型的选择、歌手信息的展示。因此我们要在窗体的Load事件里,使用这三个方法

流程:回到窗体设计界面,双击窗体,进入窗体Load事件,编写代码:

        //2、在窗体的Load时间中使用这三个方法
        private void FrmSongInfo_Load(object sender, EventArgs e)
        {
            bindSongs();
            bindSongType();
            bindSinger();
        }

注意:此时启动运行的话,由于数据库里没有相关数据,因此类型下拉菜单里没有内容,同时歌曲信息展示控件里也没有内容。

建议:在SSMS中,向自己的数据库表中添加一些数据。

--歌曲信息管理窗体做好以后,创建歌曲类型表tb_songTypes中添加几行数据
insert into tb_songTypes(songType)
select '流行歌曲' union
select '民谣' union
select '摇滚' ;

第四步:给【选择文件】按钮,添加点击事件。回到窗体设计界面,双击【选择文件】按钮,进入事件,编写代码。

        //3、给按钮“选择文件”,添加点击事件
        private void btnFile_Click(object sender, EventArgs e)
        {
            if (ofdFile.ShowDialog() == DialogResult.OK)
            {
                //显示歌曲文件的路径
                txtFileName.Text = ofdFile.FileName;
            }
        }

代码分析:这里用到了两个控件:打开文件夹对话框控件OpenFieldDialog和显示文件路径的文本框控件TextBox

功能实现分析:当用户点击【打开文件】按钮时,我们需要打开电脑资源文件管理器,然后用户从电脑中浏览所需要的歌曲文件(.mp3等),点击确定以后,将用户所选的文件路径实时显示在文本框控件上。

 

第五步:给【保存】按钮,添加点击事件。回到窗体设计界面,双击【保存】按钮,进入事件,编写代码。

        //4、给按钮“保存”,添加点击事件
        private void btnSave_Click(object sender, EventArgs e)
        {
            //4.1保存之前,要先判断用户是否输入信息
            if (txtName.Text.Trim() == "")
            {
                MessageBox.Show("请填写歌曲名称");
                return;
            }
            string sql = "";//4.2先声明一个空的String类型变量,用来存放查询字符串
            //4.3判断id输入框里是否有内容,如果没有,就是要插入新的数据。有就是更新已有的数据
            if (txtId.Text.Trim() == "")
            {
                sql = string.Format("insert into  tb_songs(name,pinyin,songTypeId,singerId,songURL) values('{0}','{1}',{2},{3},'{4}')",
                    txtName.Text, txtPinyin.Text, cboType.SelectedValue, cboSinger.SelectedValue,txtFileName.Text);
            }
            else
            {
                sql = string.Format("update songs set name='{0}',pinyin='{1}',songTypeId={2},singerId={3},songURL='{4}' where id={5}",
                    txtName.Text, txtPinyin.Text, cboType.SelectedValue, cboSinger.SelectedValue, txtFileName.Text, txtId.Text);
            }
            //4.4更新数据库
            int count = DatabaseHelper.executeNonQuery(sql);
            if (count > 0)
            {
                bindSongs();
            }
        }

代码分析:用户点击【保存】按钮时,要进行一个判断,

首先判断用户是否输入对应内容,如果指定信息(歌曲名称)没有输入,则提示用户,必须输入XXX信息。

如果已输入指定信息,则进行下一步验证(是添加一条新的数据到数据库,还是更新数据库里已有的一条数据,这里需要写对应的SQL语句。

最后判断是否要更新数据。

 

第六步:给【删除】按钮,添加点击事件。回到窗体设计界面,双击【删除】按钮,进入事件,编写代码。

        //5、给按钮“删除”,添加点击事件
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (txtId.Text.Trim() == "")
            {
                MessageBox.Show("请选择歌曲");
                return;
            }
            DialogResult result = MessageBox.Show("是否确定删除该歌曲?", "", MessageBoxButtons.OKCancel);
            if (result == DialogResult.OK)
            {
                string sql = string.Format("delete from tb_songs where id={0}", txtId.Text);
                DatabaseHelper.executeNonQuery(sql);
                bindSongs();
            }
        }

 

第七步:给【重置】按钮,添加点击事件。回到窗体设计界面,双击【重置】按钮,进入事件,编写代码。

        //6、给按钮“重置”,添加点击事件
        private void btnReset_Click(object sender, EventArgs e)
        {
            //清空控件里的数据
            txtId.Text = "";
            txtName.Text = "";
            txtPinyin.Text = "";
            cboType.Text = "";
            cboSinger.Text = "";
            txtFileName.Text = "";
        }

 

第八步:给DataGridView控件,添加CellClick事件。回到窗体设计界面,选中DataGridView控件以后,在【属性】——【事件】面板,双击CellClick事件,进入事件,编写代码。

        //7、给控件DataGridView,添加CellClick事件
        private void dgvSong_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //显示点击歌曲的信息
            txtId.Text = dgvSong.SelectedRows[0].Cells["编号"].Value.ToString();
            txtName.Text = dgvSong.SelectedRows[0].Cells["歌曲名称"].Value.ToString();
            txtPinyin.Text = dgvSong.SelectedRows[0].Cells["拼音缩写"].Value.ToString();
            cboType.Text = dgvSong.SelectedRows[0].Cells["类型"].Value.ToString();
            cboSinger.Text = dgvSong.SelectedRows[0].Cells["歌手"].Value.ToString();
            txtFileName.Text = dgvSong.SelectedRows[0].Cells["文件路径"].Value.ToString();
        }

注意:该窗体制作完成后,要去验证

启动运行,从后台登录,并添加一些歌曲数据。

 

歌曲管理窗体FrmSongInfo的完整代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KTV_MS
{
    public partial class FrmSongInfo : Form
    {
        public FrmSongInfo()
        {
            InitializeComponent();
        }
        //1、需要显示歌曲、调用歌手、调取歌曲类型,因此先写3个方法,分别用来获取这些信息
        //1.1声明一个方法bindSongs(),用来获取表中关于歌曲的信息
        private void bindSongs()
        {
            //声明一个字符串,用来查询数据库中指定的数据(这里用到三表连接查询)
            String sql = "select s.id 编号,s.name 歌曲名称,s.pinyin 拼音缩写,t.songType 类型,si.name 歌手,s.songURL 文件路径,s.playCount 点播数 from tb_songs s ,tb_songTypes t ,tb_singers si where s.songTypeId=t.id and s.singerId=si.id; ";
            DataSet dataSet = DatabaseHelper.executeQuery(sql);//将查询的数据,填充到临时仓库中
            dgvSong.DataSource = dataSet.Tables[0];//将临时仓库中的数据,做为DataGridView控件的数据源
        }
        //1.2声明一个方法bindSongType(),用来获取表中关于歌曲类型的信息
        private void bindSongType()
        {
            string sql = "select * from tb_songTypes";//声明一个字符串,用来从数据库查询提取数据
            DataSet dataSet = DatabaseHelper.executeQuery(sql);//使用DatabaseHelper类的executeQuery()方法,获取数据,并将数据存放在临时仓库里
            cboType.DataSource = dataSet.Tables[0];//将临时仓库中的数据,作为“类型”组合框的数据源
            cboType.DisplayMember = "songType";//当选中其中一个选项时,用户看到的内容
            cboType.ValueMember = "id";//该选项的对应值
        }
        //1.3声明一个方法bindSinger(),用来获取表中关于歌手的信息
        private void bindSinger()
        {
            string sql = "select * from tb_singers";
            DataSet dataSet = DatabaseHelper.executeQuery(sql);
            cboSinger.DataSource = dataSet.Tables[0];
            cboSinger.DisplayMember = "name";
            cboSinger.ValueMember = "id";
        }

        //2、在窗体的Load时间中使用这三个方法
        private void FrmSongInfo_Load(object sender, EventArgs e)
        {
            bindSongs();
            bindSongType();
            bindSinger();
        }

        //3、给按钮“选择文件”,添加点击事件
        private void btnFile_Click(object sender, EventArgs e)
        {
            if (ofdFile.ShowDialog() == DialogResult.OK)
            {
                //显示歌曲文件的路径
                txtFileName.Text = ofdFile.FileName;
            }
        }
        

        //4、给按钮“保存”,添加点击事件
        private void btnSave_Click(object sender, EventArgs e)
        {
            //4.1保存之前,要先判断用户是否输入信息
            if (txtName.Text.Trim() == "")
            {
                MessageBox.Show("请填写歌曲名称");
                return;
            }
            string sql = "";//4.2先声明一个空的String类型变量,用来存放查询字符串
            //4.3判断id输入框里是否有内容,如果没有,就是要插入新的数据。有就是更新已有的数据
            if (txtId.Text.Trim() == "")
            {
                sql = string.Format("insert into  tb_songs(name,pinyin,songTypeId,singerId,songURL) values('{0}','{1}',{2},{3},'{4}')",
                    txtName.Text, txtPinyin.Text, cboType.SelectedValue, cboSinger.SelectedValue,txtFileName.Text);
            }
            else
            {
                sql = string.Format("update songs set name='{0}',pinyin='{1}',songTypeId={2},singerId={3},songURL='{4}' where id={5}",
                    txtName.Text, txtPinyin.Text, cboType.SelectedValue, cboSinger.SelectedValue, txtFileName.Text, txtId.Text);
            }
            //4.4更新数据库
            int count = DatabaseHelper.executeNonQuery(sql);
            if (count > 0)
            {
                bindSongs();
            }
        }

        //5、给按钮“删除”,添加点击事件
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (txtId.Text.Trim() == "")
            {
                MessageBox.Show("请选择歌曲");
                return;
            }
            DialogResult result = MessageBox.Show("是否确定删除该歌曲?", "", MessageBoxButtons.OKCancel);
            if (result == DialogResult.OK)
            {
                string sql = string.Format("delete from tb_songs where id={0}", txtId.Text);
                DatabaseHelper.executeNonQuery(sql);
                bindSongs();
            }
        }
        //6、给按钮“重置”,添加点击事件
        private void btnReset_Click(object sender, EventArgs e)
        {
            //清空控件里的数据
            txtId.Text = "";
            txtName.Text = "";
            txtPinyin.Text = "";
            cboType.Text = "";
            cboSinger.Text = "";
            txtFileName.Text = "";
        }



        //7、给控件DataGridView,添加CellClick事件
        private void dgvSong_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            //显示点击歌曲的信息
            txtId.Text = dgvSong.SelectedRows[0].Cells["编号"].Value.ToString();
            txtName.Text = dgvSong.SelectedRows[0].Cells["歌曲名称"].Value.ToString();
            txtPinyin.Text = dgvSong.SelectedRows[0].Cells["拼音缩写"].Value.ToString();
            cboType.Text = dgvSong.SelectedRows[0].Cells["类型"].Value.ToString();
            cboSinger.Text = dgvSong.SelectedRows[0].Cells["歌手"].Value.ToString();
            txtFileName.Text = dgvSong.SelectedRows[0].Cells["文件路径"].Value.ToString();
        }
    }
}

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/dnruanjian/article/details/93737076
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-18 23:25:09
  • 阅读 ( 1243 )
  • 分类:研发管理

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢