1.闲话
我做的是手机百科系统(什么玩意。。。)主要是学生管理系统什么的做的人太多了,所以随便选了一个题材
2.界面展示
(数据随便插的勿喷)
3.所用控件
datagridview输出数据,combobox作为选项卡,linklabel超链接。
4.代码分析并展示各控件的作用
4.1 combobox
combobox可以利用其中的数据对数据库进行操作,也可以输出数据库中的内容,这里我主要利用的是利用其中的数据对数据库进行select
大部分没什么好说的,比较值得注意的一点是第一个和第二个combobox的作用,如果我第一个选了华为,那么第二个只会显示华为的系列,若我选择小米,则只显示小米的系列,实现代码如下
private void company_SelectedIndexChanged(object sender, EventArgs e)
{
series.Items.Clear();
if (company.SelectedItem == "全部")
{
series.Items.Add("全部");
}
if (company.SelectedItem == "华为")
{
series.Items.Add("全部");
series.Items.Add("p系列");
series.Items.Add("荣耀系列");
series.Items.Add("mate系列");
series.Items.Add("青春系列");
series.Items.Add("保时捷系列");
}
if (company.SelectedItem == "苹果")
{
series.Items.Add("全部");
series.Items.Add("max系列");
series.Items.Add("plus系列");
series.Items.Add("苹果系列");
series.Items.Add("X系列");
}
if (company.SelectedItem == "小米")
{
series.Items.Add("全部");
series.Items.Add("max系列");
series.Items.Add("红米系列");
series.Items.Add("小米系列");
}
if (company.SelectedItem == "三星")
{
series.Items.Add("全部");
series.Items.Add("note系列");
series.Items.Add("A系列");
series.Items.Add("S系列");
}
}
值得注意的一点是这些代码要放在第一个combobox里,因为这些事件的函数关系问题,如果把代码放到series里的话,添加出来的项目显示不出来,所以实现不了后续功能。
linklabel
linklabel可以实现超链接,本身相当于一个点击事件,我把它设了一个超链接
private void linkLabel2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
Process.Start("http://detail.zol.com.cn/cell_phone/index1175779.shtml");
}
4.2datagridview控件
这个控件可以实现很多的功能,可以用它向数据库输入信息,可以添加按钮,可以展示信息,相当imba的控件
可惜由于时间原因(其实是懒),我最后只利用了它的展示信息的功能,是我这个项目的遗憾之一。
代码如下:
sql = sql5;//sql是最终的查询语句
SqlDataAdapter output = new SqlDataAdapter(sql, mycon);
DataSet sdt = new DataSet();
output.Fill(sdt);
DataTable stable = sdt.Tables[0];
result.Rows.Clear();
string toall = Convert.ToString(sdt.Tables[0].Rows.Count);//统计查询出来的数目
textBox2.Text = toall;//展示查询出来的数目
for (int i = 0; i < sdt.Tables[0].Rows.Count; i++)
{
result.Rows.Add( sdt.Tables[0].Rows[i][0], sdt.Tables[0].Rows[i][1], sdt.Tables[0].Rows[i][2], sdt.Tables[0].Rows[i][3], sdt.Tables[0].Rows[i][4], sdt.Tables[0].Rows[i][5]);
}
4.3查询功能的实现:
由于我设计项目的原因,手机有多个属性,用户查询可能只需要其中两三个属性就可以进行查询了,那么查询语句怎么写?要写多少个if?其中几个空白的怎么搞,不能查询语句中间放个*吧。
想了想,也没太简单的办法,但是多重查询下来代码可能会过长,所以我用sql1,2,3,4,5等作为中间查询语句,把查询结果继承下来,并用变量代替语句解决了代码过长问题
其中代码如下
if (company.SelectedItem == "全部"|| company.SelectedItem == null)
{
sql1 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone]";
sql11= "select 手机名称 from [phone]";
}
else
{
sql1 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone],[pandc] where [pandc].厂商名 ='" + company.SelectedItem + "'and [phone].手机名称=[pandc].手机名";
sql11= "select 手机名称 from [phone],[pandc] where [pandc].厂商名 ='" + company.SelectedItem + "'and [phone].手机名称=[pandc].手机名";
}
if (series.SelectedItem =="全部"||series.SelectedItem == null)
{
sql2 = sql1;
sql22 = sql11;
}
else
{
sql2 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone],[pandc] where [pandc].所属系列 ='" + series.SelectedItem + "'and [phone].手机名称=[pandc].手机名 and [phone].手机名称 in ("+ sql11 +")";
sql22= "select 手机名称 from [phone],[pandc] where [pandc].所属系列 ='" + series.SelectedItem + "'and [phone].手机名称=[pandc].手机名 and [phone].手机名称 in (" + sql11 + ")";
}
if(price.SelectedItem== "1000以下")
{
sql3 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where [phone].价格 <1000 and [phone].手机名称 in (" + sql22 + ")";
sql33= "select 手机名称 from [phone] where [phone].价格 <1000 and [phone].手机名称 in (" + sql22 + ")";
}
else if(price.SelectedItem=="1000-2000")
{
sql3 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where [phone].价格>=1000 and [phone].价格<=2000 and [phone].手机名称 in (" + sql22 + ")";
sql33 = "select 手机名称 from [phone] where [phone].价格>=1000 and [phone].价格<=2000 and [phone].手机名称 in (" + sql22 + ")";
}
else if (price.SelectedItem == "2000-3000")
{
sql3 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where [phone].价格>=2000 and [phone].价格<=3000 and [phone].手机名称 in (" + sql22 + ")";
sql33 = "select 手机名称 from [phone] where [phone].价格>=2000 and [phone].价格<=3000 and [phone].手机名称 in (" + sql22 + ")";
}
else if (price.SelectedItem == "3000-4000")
{
sql3 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where [phone].价格>=3000 and [phone].价格<=4000 and [phone].手机名称 in (" + sql22 + ")";
sql33 = "select 手机名称 from [phone] where [phone].价格>=3000 and [phone].价格<=4000 and [phone].手机名称 in (" + sql22 + ")";
}
else if (price.SelectedItem == "4000-5000")
{
sql3 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where [phone].价格>=4000 and [phone].价格<=5000 and [phone].手机名称 in (" + sql22 + ")";
sql33 = "select 手机名称 from [phone] where [phone].价格>=4000 and [phone].价格<=5000 and [phone].手机名称 in (" + sql22 + ")";
}
else if (price.SelectedItem == "5000以上")
{
sql3 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where [phone].价格>=5000 and [phone].手机名称 in (" + sql22 + ")";
sql33 = "select 手机名称 from [phone] where [phone].价格>=5000 and [phone].手机名称 in (" + sql22 + ")";
}
else if(price.SelectedItem == "全部"|| price.SelectedItem == null)
{
sql3 = sql2;
sql33 = sql22;
}
if(CPU.SelectedItem=="全部"|| CPU.SelectedItem == null)
{
sql4 = sql3;
sql44 = sql33;
}
else
{
sql4 = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where [phone].cpu='"+ CPU.SelectedItem +"' and [phone].手机名称 in (" + sql33 + ")";
sql44= "select 手机名称 from [phone] where [phone].cpu='" + CPU.SelectedItem + "' and [phone].手机名称 in (" + sql33 + ")";
}
if(photo.SelectedItem=="全部"|| photo.SelectedItem == null)
{
sql5 = sql4;
}
else
{
sql5= "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where [phone].摄像头='" + photo.SelectedItem + "' and [phone].手机名称 in (" + sql44 + ")";
}
sql = sql5;
,
ps:之所以引入sql11,22,33等是因为出现了这个错误
System.Data.SqlClient.SqlException:“当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。”
这个错误就是说如果select A,B,C from table where A in ()的话就会出错,所以只能select A from table where A in ()这个样子,但是我输出结果肯定是要ABCDE的,所以我取了个中间变量解决了这个问题。
4.4按名字查找
到这里就简单多了,直接放button事件的代码
string constr = "server=.;database=housework;integrated security=SSPI";
SqlConnection mycon = new SqlConnection(constr);
SqlCommand checkCmd = mycon.CreateCommand();
mycon.Open();
string name = textBox1.Text;
string sql = "select 手机名称,cpu,系统,价格,摄像头,内存 from [phone] where 手机名称='"+ name +"'";
SqlDataAdapter output = new SqlDataAdapter(sql, mycon);
DataSet sdt = new DataSet();
output.Fill(sdt);
DataTable stable = sdt.Tables[0];
result.Rows.Clear();
for (int i = 0; i < sdt.Tables[0].Rows.Count; i++)
{
result.Rows.Add(sdt.Tables[0].Rows[i][0], sdt.Tables[0].Rows[i][1], sdt.Tables[0].Rows[i][2], sdt.Tables[0].Rows[i][3], sdt.Tables[0].Rows[i][4], sdt.Tables[0].Rows[i][5]);
}
到这里用户界面的基本功能就结束了,下面一篇我将展示我的管理界面的窗口,并简单介绍其中所用到的控件的用法等