社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
制作效果:
前期准备:设计歌曲管理窗体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 | 直接将该控件拖放到窗体上即可,它显示在窗体下方 |
第一步:分析该控件的功能。在此窗体,我们希望管理员可以实时添加歌曲信息到数据库里。那么在添加歌曲信息的时候,
第二步:在窗体设计界面,选中窗体以后,单击鼠标右键——【查看代码】,可以进入该窗体的代码编写模式。
我们先写三个方法,分别用来实现类型调用、歌手调用和歌曲信息展示的功能。
流程:直接声明方法即可。
//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();
}
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!