大家好!初来乍到,这是我在CSDN的第一篇文章,有写的不好的地方请大家及时指出,我会听取大家的建议,积极改正!
最近在用winform学习的知识做KTV项目,要求有前台和后台管理系统,在做的过程总我发现后台系统要比前台系统略微简单些,也就没遇到什么问题,算是一切很顺利的就写完了后台,在写前台的时候遇到了我第一个问题,前台有一个数字点歌功能,需要输入歌曲名称首字母有几个,然后在数据库找到相应的歌曲,最终显示出来。
遇到这个问题我首先把它分成了两步来做,第一步是窗体加载时左边歌曲显示栏里要显示出来歌曲,第二步则是点击搜索,根据搜索框里的数字在数据库里查出找到并显示在左边的歌曲显示栏。
首先第一步,将数据库里的歌曲显示到左侧歌曲显示栏里
我是这么设计的,先拖一个大的Panel面板,然后里面放五个一样的小Panel面板,每一个小的Panel面板中都有一个Label控件和一个Button控件,Label控件用来显示歌曲名称,Button控件用于之后的点歌功能。(注意:拖每一个小的Panel面板的顺序为从下往上,不然会报错)
首先我这里设定的是每五条歌曲为一页,那么我们就要先查出所有数据然后每一页展示五条数据。
在这里要注意我们五条歌曲为一页,那么我们就要写一个判断,超过五条加一页。
//查询总条数 public int QuerySongCount() { DBHelper.OpenConnection(); string sql = "select count(*) from song_info"; SqlCommand command = new SqlCommand(sql, DBHelper.Connection); int count = (int)command.ExecuteScalar(); DBHelper.CloseConnection(); return count; //页数,一页5条 int page = 0; //int page = count%5 == 0 ? count/5 : count / 5 + 1; if (count % 5 == 0) { page = count / 5; } else if (count % 5 != 0) { page = count / 5 + 1; } }
//查询五条歌曲的方法 public void QuerySongList(int page) { DataSet ds = new DataSet(); //临时仓库,数据集 string sql = "select top 5 * from song_info"; string a = this.textBox1.Text; if (page > 1 && a != null) { int start = (page - 1) * 5; sql += " where " + a + " = song_word_count and song_id not in (select top " + start + " song_id from song_info)"; } else { int start = (page - 1) * 5; sql += " where song_id not in (select top " + start + " song_id from song_info)"; } SqlDataAdapter adapter = new SqlDataAdapter(sql, DBHelper.Connection); //放入结果集 adapter.Fill(ds, "song"); //获取dataset临时仓库的值 DataTable dt = ds.Tables["song"]; int i = 0; foreach (DataRow row in dt.Rows) { string name = row["song_name"].ToString(); string url = row["song_url"].ToString(); //一行的panel Panel p = this.panel1.Controls[i] as Panel; //找到一行的panel中的第一个小控件label Label l = p.Controls[1] as Label; l.Text = name; //歌曲名称赋值 l.Tag = url;//Tag:存放数据 i++; } }
在这里有一个小规律:第一页查的是数据库中第1-5条数据,第二页是6-10条,第n页是从第(n-1)*5条开始。
写完这两个方法就要调方法,直接写在窗体加载事件里即可。这样就完成了第一步。
接下来实现第二步功能,根据搜索框里的数字在数据库里查出找到并显示在左边的歌曲显示栏。
需要的控件有:Label ,TextBox,Button三个控件。
在这里我选择了比较笨一点的方法,就是在每一个Button按钮里都写了同样的点击事件。
是这样,每点击一个数字按钮都会在文本框里加上其对应的文本。
然后写筛选的代码,写到搜索按钮的点击事件中。
private void button17_Click(object sender, EventArgs e) { DataSet ds = new DataSet();//数据集临时仓库 string sql = "select top 5 * from song_info where song_word_count=" + this.textBox1.Text; SqlDataAdapter adapter = new SqlDataAdapter(sql, DBHelper.Connection); //放入结果集 adapter.Fill(ds, "song_info"); //获取dataset临时仓库的值 DataTable dt = ds.Tables["song_info"]; int i = 0; foreach (DataRow row in dt.Rows) { string name = row["song_name"].ToString(); //一行 Panel p = this.panel1.Controls[i] as Panel; //找到一行的panel中的第一个小控件label Label l = p.Controls[1] as Label; l.Text = name; i++; } }
这里的代码跟上面差不多,就是加了一个条件。
然后就实现了这个功能。
感谢各位的观看!