namespace MyKTVClient
{
public partial class FrmOrderBySinger : Form
{
private string singerSex = "男"; // 当前选择的歌手性别
private int singerTypeId = 0; // 当前选择的歌手类型的编号

public FrmOrderBySinger()
{
InitializeComponent();
}

// 点击后,显示歌手类别
private void lvOrder_Click(object sender, EventArgs e)
{
if (lvOrder.SelectedItems[0] != null)
{
// 隐藏歌手性别,显示歌手类别
pnlSingerSex.Visible = false;
pnlSingerType.Location = pnlSingerSex.Location;
pnlSingerType.Dock = DockStyle.Fill;
pnlSingerType.Visible = true;
this.singerSex = Convert.ToString(lvOrder.SelectedItems[0].Tag); // 记录选择的性别
}

// 读取歌手类别
DBHelper dbHelper = new DBHelper();
string sql = "select * from singer_type";
try
{
// 查询数据库
SqlCommand command = new SqlCommand(sql, dbHelper.Connection);
dbHelper.OpenConnection();//相当于con.open
SqlDataReader reader = command.ExecuteReader();

// 循环将类别读取出来添加到ListView中
lvSingerType.Items.Clear();
int i = 0;
while (reader.Read())
{
ListViewItem item = new ListViewItem();
item.Text = Convert.ToString(reader["singertype_name"]);
item.Tag = Convert.ToInt32(reader["singertype_id"]);
item.ImageIndex = i;
lvSingerType.Items.Add(item);
i++;
}
reader.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
MessageBox.Show("系统错误,请联系服务人员!");

}
finally
{
dbHelper.CloseConnection();
}
}

// 点击类别后,显示对应类别下的歌手列表
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();
}
}

// 点击歌手姓名,打开歌曲列表窗口
private void lvSinger_Click(object sender, EventArgs e)
{
// 读取数据库,读出该歌手的所有歌曲
DBHelper dbHelper = new DBHelper();
StringBuilder sb = new StringBuilder();
sb.AppendFormat("select song_id,song_name, singer_name='{0}',song_url from song_info where singer_id={1}",
lvSinger.SelectedItems[0].Text, Convert.ToInt32(lvSinger.SelectedItems[0].Tag));

FrmSongList songList = new FrmSongList();
songList.Sql = sb.ToString();
songList.Previous = PrevioisForm.Singer; // 指定返回的窗体是按歌手点歌
songList.Show();
this.Close();
}

// 关闭当前窗体,显示主界面
private void tsbtnHome_Click(object sender, EventArgs e)
{
this.Close();
}

// 重新播放当前歌曲
private void tsbtnAgain_Click(object sender, EventArgs e)
{
PlayList.PlayAgain();
}

// 切歌
private void tsbtnCut_Click(object sender, EventArgs e)
{
if (MessageBox.Show("确定要切歌吗?", "操作提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
{
PlayList.CutSong(-1);
}
}

// 打开已点歌曲窗体
private void tsbtnOrdered_Click(object sender, EventArgs e)
{
FrmOrderedSongList orderedForm = new FrmOrderedSongList();
orderedForm.Show();
}

// 呼叫服务
private void tsbtnService_Click(object sender, EventArgs e)
{
MessageBox.Show("您发出了呼叫服务!");
}

// 处理返回按钮的事件
private void tsbtnExit_Click(object sender, EventArgs e)
{
if (this.pnlSingerList.Visible)
{
this.pnlSingerType.Visible = true;
this.pnlSingerList.Visible = false;
}
else if (this.pnlSingerType.Visible)
{
this.pnlSingerSex.Visible = true;
this.pnlSingerType.Visible = false;
}
else if (this.pnlSingerSex.Visible)
{
this.Close();
}
}

private void lvSinger_SelectedIndexChanged(object sender, EventArgs e)
{

}

}
}
辅助类:
song类:
namespace MyKTVClient
{
enum SongPlayState
{
unplayed,played,again,cut
}

/// <summary>
/// 歌曲类
/// </summary>
class Song
{
/// <summary>
/// 歌曲名称
/// </summary>
public string SongName
{
get { return songName; }
set { songName = value; }
}

/// <summary>
/// 歌曲存放路径
/// </summary>
public string SongURL
{
get { return songURL; }
set { songURL = value; }
}

/// <summary>
/// 歌曲播放状态
/// </summary>
internal SongPlayState PlayState
{
get { return playState; }
set { playState = value; }
}

private string songName;
private string songURL;
private SongPlayState playState = SongPlayState.unplayed; // 歌曲播放状态

/// <summary>
/// 将歌曲状态改为已播放
/// </summary>
public void SetSongPlayed()
{
this.playState = SongPlayState.played;
}

/// <summary>
/// 将歌曲状态改为再拨放一次
/// </summary>
public void SetPlayAgain()
{
this.playState = SongPlayState.again;
}

/// <summary>
/// 将歌曲状态改为切歌
/// </summary>
public void SetSongCut()
{
this.playState = SongPlayState.cut;
}
}
}
PlayList类:
namespace MyKTVClient
{
/// <summary>
/// 播放列表管理
/// </summary>
class PlayList
{
private static Song[] songList = new Song[50]; // 歌曲播放列表数组
private static int songIndex = 0; // 当前播放的歌曲在数组中的索引

/// <summary>
/// 播放列表数组
/// </summary>
public static Song[] SongList
{
get { return PlayList.songList; }
}

/// <summary>
/// 当前播放歌曲的索引
/// </summary>
public static int SongIndex
{
get { return PlayList.songIndex; }
}

/// <summary>
/// 当前播放的歌曲名称
/// </summary>
/// <returns>歌曲名称</returns>
public static string PlayingSongName()
{
string songName = ""; // 歌曲名称
if (SongList[SongIndex] != null)
{
songName = SongList[SongIndex].SongName;
}

return songName;
}

/// <summary>
/// 获取当前播放的歌曲
/// </summary>
/// <returns>当前要播放的歌曲</returns>
public static Song GetPlayingSong()
{
if (SongList[songIndex] != null)
{
return SongList[songIndex];
}
else
{
return null;
}
}

/// <summary>
/// 下一首要播放的歌曲名称
/// </summary>
/// <returns>歌曲名称</returns>
public static string NextSongName()
{
string songName = ""; // 歌曲名称
if (SongList[SongIndex+1] != null)
{
songName = SongList[SongIndex+1].SongName;
}

return songName;
}

/// <summary>
/// 点播一首歌曲
/// </summary>
/// <param name="song">新点播的歌曲</param>
public static bool AddSong(Song song)
{
bool success = false;
for (int i = 0; i < SongList.Length; i++)
{
if (SongList[i] == null)
{
SongList[i] = song;
Console.WriteLine(song.SongName);
success = true;
break;
}
}

return success;
}

/// <summary>
/// 切歌
/// </summary>
/// <param name="index">要切歌曲的编号,如果是切当前播放的歌曲传入-1</param>
public static void CutSong(int index)
{
int i; // 循环变量,代表切歌的位置
if (index == -1)
{
i = SongIndex;
}
else
{
i = index; // 从切歌的位置开始,将歌曲逐个向前移一个位置
}

SongList[i].SetSongCut();
while (SongList[i] != null)
{
SongList[i] = SongList[i + 1];
i++;

// 如果到达数组最后一个元素,就将最后一个元素指向空
if (i == SongList.Length)
{
SongList[i] = null;
}
}
}

/// <summary>
/// 重放当前歌曲
/// </summary>
public static void PlayAgain()
{
if (SongList[songIndex] != null)
{
SongList[songIndex].SetPlayAgain();
}
}

/// <summary>
/// 播放下一首
/// </summary>
public static void MoveOn()
{
if (SongList[songIndex] != null && SongList[songIndex].PlayState == SongPlayState.again)
{
SongList[songIndex].SetSongPlayed();
}
else
{
songIndex++;
}
}
}
}

MyKTV的更多相关文章

  1. 欢迎进入MyKTV前后台点歌系统展示

    一个项目,一分收获:一个项目,一些资源.Ktv项目也是一样的,所以我想分享我的收获,让你们获得你需要的资源. 一. 那MyKTV点歌系统具体的功能有哪些呢?我们就来看看吧! 1.MyKTV前台功能: ...

  2. 欢迎进入MyKTV点歌系统展示

    一个项目,一分收获:一个项目,一些资源.Ktv项目也是一样的,所以我想分享我的收获,让你们获得你需要的资源. 一. 那MyKTV点歌系统具体的功能有哪些呢?我们就来看看吧! 1.MyKTV前台功能: ...

  3. MyKTV项目总结

    今天和大伙分享一下我的KTV系统,我想大家都有自己独特的魅力,都有自己的风采,都有自己骄傲的一部分. 在这里我就抛砖引玉,聊聊我的KTV项目,希望大家能给出自己的建议.. 首先,我们先了解一下:当我们 ...

  4. C#Windows窗体应用程序MyKTV项目

    后台管理其中有一个添加歌手信息和歌曲信息的窗体要点击按钮并上传文件,因为对那些文件流什么的不懂,所以用了老师教的最简单的判断方法,但此方法只是按后缀名判断文件的样式,如果后缀名乱改就不行了! 此时需要 ...

  5. MyKTV项目,走起!

    MyKTV项目,走起! 第一部分:这个项目对于新手来说有一点难度,但是当你理清类之间的关系和怎样去实现功能后就会感觉轻松很多. 话不多说,先上类图: 接着是数据库表间关系: 本项目要实现以下功能: 明 ...

  6. S1的小成果:MyKTV系统

    转眼之间,已经到了2016年,即新的一年了!S1也结束了,收获的也不多 ,想想最后留给大家的就一个KTV项目了. 希望大家看时有所收获           现在我们一起来看KTV前台管理 主界面的运行 ...

  7. .NET小项目之MyKtv(歌曲播放功能实现)

    在KTV点歌系统中我们根据需求获取到歌手的歌曲信息,点击歌手的歌曲将其添加到一点歌曲列表中看似简单的一个操作其实涉及很多内容,这也是写这篇Blog的目的—分析歌曲播放的原理. 原理分析 我们应该清楚, ...

  8. MyKTV系统项目的感想

    不粉身碎骨,何以脱胎换骨! 3月11号,我们迎来S1的尾巴.这期间有温暖,默契,有项目.一切刚刚好.刚刚正式接到KTV这个微微型的项目的时候,还是很害怕的,虽然老师在前两天就已经提到也讲到,KTV系统 ...

  9. 平凡的KTV后台,不平凡的KTV数据

    之前就是说过“一个项目有很多重要的步骤以及功能”,那我们现在就来看看对于KTV项目来说:后台是处于什么样的重要作用! 首先就得了解KTV后台的一些功能了: 1.歌曲管理 .歌手管理 .设置资源路径 2 ...

随机推荐

  1. [.net 面向对象编程基础] (16) 接口

    [.net 面向对象编程基础] (16) 接口 关于“接口”一词,跟我们平常看到的电脑的硬件“接口”意义上是差不多的.拿一台电脑来说,我们从外面,可以看到他的USB接口,COM接口等,那么这些接口的目 ...

  2. Git Day01,仓库,commit,版本切换

    1st,创建版本库:  2nd,添加文件:  3rd,修改文件,并提交: 4th,版本切换:git log查看版本:版本回退: 又回到原始版本了: 回到“未来”: 今天就到这里,明天继续.Git确实挺 ...

  3. swift 字符串和数字相互转化

    //NSString 类型 转为整型,浮点型, var test:NSString = "3.3" println("test\(test)") println ...

  4. Logstash为什么那么慢?—— json序列化

    今天跟峡谷金桥聊天,询问起Logstash的性能,金桥提示说Logstash中json的序列化是浪费性能的一方面.于是便有了下面的测试: 第一步,造数据 首先需要造一份数据,数据可以通过logstas ...

  5. [Java面试九]脚本语言知识总结.

    核心内容概述 1.JavaScript加强,涉及到ECMAScript语法.BOM对象.DOM对象以及事件. 2.Ajax传统编程. 3.jQuery框架,九种选择器为核心学习内容 4.JQuery ...

  6. atitit。企业的价值观 员工第一 vs 客户第一.docx

    atitit.企业的价值观 员工第一 vs 客户第一.docx 1. 客户第一的说法是错误的,员工优先是正确的,理念与价值观1 1.1. 任何一个组织,应该组织成员优先级要比外部成员高才对1 1.2. ...

  7. Atitti css3 新特性attilax总结

    Atitti css3 新特性attilax总结 图片发光效果2 透明渐变效果2 文字描边2 背景拉伸2 CSS3 选择器(Selector)4 @Font-face 特性7 Word-wrap &a ...

  8. 《鸟哥的linux私房菜》 - linux命令温故而知新

    在公司的某角落里,看到了<鸟哥的linux私房菜>,顿时想看看是什么鬼. 其他时候还要自己去买才有,现在正好,比图书馆方便.看完了,写点啥! 编辑器很重要,一个vim就主要是我的使用方向: ...

  9. 学习ASP.NET MVC(四)——我的第一个ASP.NET MVC 实体对象

    今天我将根据数据库中的表结构添加一些类.这些类将成为这个ASP.NET MVC应用程序中“模型”的一部分.       我们使用Entity Framework(实体框架)来定义和使用这些模型类,并且 ...

  10. JS生成1000个数字加字母的不重复的随机字符串

    周五,快下班了,正收拾东西准备走人,项目经理突然让我给他做个Excel,1000个数字加字母组合的密码,不重复,下班前给. 我直接懵了,Excel不会,估计是要写个什么命令才能生成出来,于是想着有没有 ...