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. javascript 设计模式-----观察者模式

    观察者模式在设计模式中被重点提到,因为它应用的场景非常多,而且在模块化设计当中扮演着非常重要的角色.MVC模式中最底层的就是观察者模式,当下流行的javascript框架backbone就是很好地运用 ...

  2. AndroidPn源码分析(一)

    好了,开始研究源码了.目前对androidpn,只限于使用过它,跑了一下demo.现在开始研究一下源码. (一)入口 当服务器端启动的时候,控制台会打印一些log,除了spring和hibernate ...

  3. java实现输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

    package JingDian; import java.util.Scanner; public class charKind { public static void main(String[] ...

  4. DISCUZ 自定义模板

    DISCUZ 自定义模板 模板安装和维护 安装新模板 将模板template打包放在对应目录:template/ 后台 -> 界面 -> 风格管理 , 安装模板 后台 -> 界面 - ...

  5. Git学习笔记(2)——版本的回退,和暂存区的理解

    本文主要记录了版本的回退,以及工作区,暂存区概念的理解. //开始之前,先回顾上次的内容,修改文件如下,并提交到版本库. Git is a distributed version control sy ...

  6. OpenJDK将对Android开发产生怎样的影响?

    转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/182.html?1456926201 Google已决定将从下一版本的Android开始采 ...

  7. WindowManager 实现悬浮窗 详解

    WindowManager 实现悬浮窗 详解 一:对于想直接看效果的,可以看看我的demo app. 链接:http://sj.qq.com/myapp/detail.htm?apkName=com. ...

  8. Atitit 颜色平均值cloor grb hsv模式的区别对比

    Atitit 颜色平均值cloor grb hsv模式的区别对比 使用hsv模式平均后会变得更加的靓丽一些..2 public class imgT { public static void main ...

  9. vuejs学习网站推荐

    vuejs学习网站推荐 https://coligo.io/

  10. 网站CSS写在html里面的好处

    这是应付超大流量的一种优化方案.为提高速度,他们的外部连接文件一般都存储在单独的服务器上,例如img.****.com,如果这个服务器挂掉 ,整个首页就挂掉了.放在页面内,比较安全.用户访问页面时,不 ...