如何用winform做一个自定义查询?

a3610313 2014-08-19 09:23:35
用户可以自己在UI界面上定义自己的查询条件,保存为一个查询的方案,再从数据库中查询出相关的数据。这个怎么实现啊?求大神帮帮忙!
...全文
158 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shawn_yang 2014-08-20
  • 打赏
  • 举报
回复
引用 10 楼 axx_2385584979 的回复:
按用户名、省、QQ添加相关搜索名称 //添加DropDownList下拉框控件显示要搜索的项目名称 <asp:DropDownList ID="DropDownList1" runat="server" Height="23px" Width="80px"> <asp:ListItem>用户名</asp:ListItem> <asp:ListItem>省</asp:ListItem> <asp:ListItem>QQ</asp:ListItem> </asp:DropDownList> //要添加名称的文本框 <asp:TextBox ID="txtKeys" runat="server" Width="80px" Height="16px"></asp:TextBox> //搜索按钮 <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/image/a2.png" onclick="ImageButton1_Click1" /> //处理程序 protected void ImageButton1_Click1(object sender, ImageClickEventArgs e) { if (txtKeys.Text.Trim() != "") { string search = this.DropDownList1.SelectedValue; switch (search) { case "用户名": Session["searchKey1"] = txtKeys.Text; Response.Redirect("Yong_hu.aspx"); break; case "省": Session["searchKey2"] = txtKeys.Text; Response.Redirect("Yong_sheng.aspx"); break; case "QQ": Session["searchKey3"] = txtKeys.Text; Response.Redirect("Yong_qq.aspx"); break; default: Response.Write("<script lanuage=javascript>alert('出错拉!');location='javascript:history.go(-1)'</script>"); break; }//CodeGo.net/ } else { Page.RegisterStartupScript("", "<script>alert('请选择要查询的内容')</script>"); } } //下面是以查询Yong_hu.aspx用户页面为例 protected void bindDataList() { int noncePage = Convert.ToInt32(labPage.Text); PagedDataSource ps = new PagedDataSource(); string sqlSel = "select * from tb_huen_lian link where UserName like '%" + Session["searchKey1"] + "%'"; ps.DataSource = operateData.getRows(sqlSel).DefaultView; ps.AllowPaging = true; ps.PageSize = 6; ps.CurrentPageIndex = noncePage - 1; this.lnkbtnFront.Enabled = true; this.lnkbtnNext.Enabled = true; this.lnkbtnLast.Enabled = true; this.lnkbtnFirst.Enabled = true; if (noncePage == 1) { this.lnkbtnFirst.Enabled = false;//不显示第一页按钮 this.lnkbtnFront.Enabled = false;//不显示上一页按钮 } if (noncePage == ps.PageCount) { this.lnkbtnNext.Enabled = false;//不显示下一页 this.lnkbtnLast.Enabled = false;//不显示最后一页 } labBackPage.Text = Convert.ToString(ps.PageCount); DataList1.DataSource = ps; DataList1.DataBind(); } protected void lnkbtnFirst_Click(object sender, EventArgs e)//首页 { this.labPage.Text = "1"; //设置当前页为1 bindDataList(); } protected void lnkbtnFront_Click(object sender, EventArgs e)//上一页 { this.labPage.Text = Convert.ToString(Convert.ToInt32(this.labPage.Text) - 1); //设置当前页减1 bindDataList(); } protected void lnkbtnNext_Click(object sender, EventArgs e) //下一页 { this.labPage.Text = Convert.ToString(Convert.ToInt32(this.labPage.Text) + 1); //设置当前页加1 bindDataList(); } protected void lnkbtnLast_Click(object sender, EventArgs e) //尾页 { this.labPage.Text = this.labBackPage.Text; //设置当前页为最后一页 bindDataList(); }
难度会比bs大,但是危险性还是有的。
我叫小菜菜 2014-08-20
  • 打赏
  • 举报
回复
引用 11 楼 Z65443344 的回复:
[quote=引用 7 楼 shawn_yang 的回复:] [quote=引用 5 楼 Z65443344 的回复:] [quote=引用 4 楼 a3610313 的回复:] [quote=引用 3 楼 Z65443344 的回复:] 保存为一个查询的方案,保存到哪?保存什么? 不就是通过选项,拼接一个SQL语句么 至于拼接好之后直接执行,还是先放到哪里,就根据需要去做呗
关键是我不知道UI怎么做,要根据用户的选择弹出不同的控件,设置不同的查询条件,然后和在一起执行查询。[/quote] 要根据用户的选择弹出不同的控件 -> 你确定?你不事先放好一堆控件让用户选,你让用户选什么啊,点哪啊,还弹出不同的控件,弹出干嘛啊 就放一堆控件,把能够参与查询的条件都罗列上,用户选了哪个,就拼接到SQL语句中去,没选的忽略,不就得了 具体类似: string sql="select * from table where 1=1";//这里先写好where,如果什么都不选,就是查询全部,就不用到后面再判断是否需要加where了 if(textbox1.text.length>0) { sql+=" and id="+textbox1.text;//如果有文字,就把条件拼接进去 }[/quote] 不建议用这种拼接,容易被注入,建议用参数方式传入[/quote] winform程序,存在注入的问题?从哪注入?[/quote] sql注入问题,与使用的是Client还是Browser没多大关系吧。只要你使用动态sql语句,就有可能产生sql注入。防止注入式攻击,最重要的是不要用拼接参数方式,使用参数赋值方式。就是使用Parameters 指定了参数的明确类型和长度来传递变量。
於黾 2014-08-20
  • 打赏
  • 举报
回复
引用 7 楼 shawn_yang 的回复:
[quote=引用 5 楼 Z65443344 的回复:] [quote=引用 4 楼 a3610313 的回复:] [quote=引用 3 楼 Z65443344 的回复:] 保存为一个查询的方案,保存到哪?保存什么? 不就是通过选项,拼接一个SQL语句么 至于拼接好之后直接执行,还是先放到哪里,就根据需要去做呗
关键是我不知道UI怎么做,要根据用户的选择弹出不同的控件,设置不同的查询条件,然后和在一起执行查询。[/quote] 要根据用户的选择弹出不同的控件 -> 你确定?你不事先放好一堆控件让用户选,你让用户选什么啊,点哪啊,还弹出不同的控件,弹出干嘛啊 就放一堆控件,把能够参与查询的条件都罗列上,用户选了哪个,就拼接到SQL语句中去,没选的忽略,不就得了 具体类似: string sql="select * from table where 1=1";//这里先写好where,如果什么都不选,就是查询全部,就不用到后面再判断是否需要加where了 if(textbox1.text.length>0) { sql+=" and id="+textbox1.text;//如果有文字,就把条件拼接进去 }[/quote] 不建议用这种拼接,容易被注入,建议用参数方式传入[/quote] winform程序,存在注入的问题?从哪注入?
axx_2385584979 2014-08-20
  • 打赏
  • 举报
回复
按用户名、省、QQ添加相关搜索名称 //添加DropDownList下拉框控件显示要搜索的项目名称 <asp:DropDownList ID="DropDownList1" runat="server" Height="23px" Width="80px"> <asp:ListItem>用户名</asp:ListItem> <asp:ListItem>省</asp:ListItem> <asp:ListItem>QQ</asp:ListItem> </asp:DropDownList> //要添加名称的文本框 <asp:TextBox ID="txtKeys" runat="server" Width="80px" Height="16px"></asp:TextBox> //搜索按钮 <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/image/a2.png" onclick="ImageButton1_Click1" /> //处理程序 protected void ImageButton1_Click1(object sender, ImageClickEventArgs e) { if (txtKeys.Text.Trim() != "") { string search = this.DropDownList1.SelectedValue; switch (search) { case "用户名": Session["searchKey1"] = txtKeys.Text; Response.Redirect("Yong_hu.aspx"); break; case "省": Session["searchKey2"] = txtKeys.Text; Response.Redirect("Yong_sheng.aspx"); break; case "QQ": Session["searchKey3"] = txtKeys.Text; Response.Redirect("Yong_qq.aspx"); break; default: Response.Write("<script lanuage=javascript>alert('出错拉!');location='javascript:history.go(-1)'</script>"); break; }//CodeGo.net/ } else { Page.RegisterStartupScript("", "<script>alert('请选择要查询的内容')</script>"); } } //下面是以查询Yong_hu.aspx用户页面为例 protected void bindDataList() { int noncePage = Convert.ToInt32(labPage.Text); PagedDataSource ps = new PagedDataSource(); string sqlSel = "select * from tb_huen_lian link where UserName like '%" + Session["searchKey1"] + "%'"; ps.DataSource = operateData.getRows(sqlSel).DefaultView; ps.AllowPaging = true; ps.PageSize = 6; ps.CurrentPageIndex = noncePage - 1; this.lnkbtnFront.Enabled = true; this.lnkbtnNext.Enabled = true; this.lnkbtnLast.Enabled = true; this.lnkbtnFirst.Enabled = true; if (noncePage == 1) { this.lnkbtnFirst.Enabled = false;//不显示第一页按钮 this.lnkbtnFront.Enabled = false;//不显示上一页按钮 } if (noncePage == ps.PageCount) { this.lnkbtnNext.Enabled = false;//不显示下一页 this.lnkbtnLast.Enabled = false;//不显示最后一页 } labBackPage.Text = Convert.ToString(ps.PageCount); DataList1.DataSource = ps; DataList1.DataBind(); } protected void lnkbtnFirst_Click(object sender, EventArgs e)//首页 { this.labPage.Text = "1"; //设置当前页为1 bindDataList(); } protected void lnkbtnFront_Click(object sender, EventArgs e)//上一页 { this.labPage.Text = Convert.ToString(Convert.ToInt32(this.labPage.Text) - 1); //设置当前页减1 bindDataList(); } protected void lnkbtnNext_Click(object sender, EventArgs e) //下一页 { this.labPage.Text = Convert.ToString(Convert.ToInt32(this.labPage.Text) + 1); //设置当前页加1 bindDataList(); } protected void lnkbtnLast_Click(object sender, EventArgs e) //尾页 { this.labPage.Text = this.labBackPage.Text; //设置当前页为最后一页 bindDataList(); }
我叫小菜菜 2014-08-19
  • 打赏
  • 举报
回复
引用 7 楼 shawn_yang 的回复:
[quote=引用 5 楼 Z65443344 的回复:]
[quote=引用 4 楼 a3610313 的回复:]
[quote=引用 3 楼 Z65443344 的回复:]
保存为一个查询的方案,保存到哪?保存什么?

不就是通过选项,拼接一个SQL语句么
至于拼接好之后直接执行,还是先放到哪里,就根据需要去做呗


关键是我不知道UI怎么做,要根据用户的选择弹出不同的控件,设置不同的查询条件,然后和在一起执行查询。[/quote]
要根据用户的选择弹出不同的控件
->
你确定?你不事先放好一堆控件让用户选,你让用户选什么啊,点哪啊,还弹出不同的控件,弹出干嘛啊
就放一堆控件,把能够参与查询的条件都罗列上,用户选了哪个,就拼接到SQL语句中去,没选的忽略,不就得了
具体类似:
string sql="select * from table where 1=1";//这里先写好where,如果什么都不选,就是查询全部,就不用到后面再判断是否需要加where了
if(textbox1.text.length>0)
{
sql+=" and id="+textbox1.text;//如果有文字,就把条件拼接进去
}[/quote]

不建议用这种拼接,容易被注入,建议用参数方式传入[/quote]

自己参考百度的高级搜索界面:


可以简单拼接,但是想更安全更加完善,就应该使用参数方式传入。看个人技术能力和实际情况。
shawn_yang 2014-08-19
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
[quote=引用 4 楼 a3610313 的回复:] [quote=引用 3 楼 Z65443344 的回复:] 保存为一个查询的方案,保存到哪?保存什么? 不就是通过选项,拼接一个SQL语句么 至于拼接好之后直接执行,还是先放到哪里,就根据需要去做呗
关键是我不知道UI怎么做,要根据用户的选择弹出不同的控件,设置不同的查询条件,然后和在一起执行查询。[/quote] 要根据用户的选择弹出不同的控件 -> 你确定?你不事先放好一堆控件让用户选,你让用户选什么啊,点哪啊,还弹出不同的控件,弹出干嘛啊 就放一堆控件,把能够参与查询的条件都罗列上,用户选了哪个,就拼接到SQL语句中去,没选的忽略,不就得了 具体类似: string sql="select * from table where 1=1";//这里先写好where,如果什么都不选,就是查询全部,就不用到后面再判断是否需要加where了 if(textbox1.text.length>0) { sql+=" and id="+textbox1.text;//如果有文字,就把条件拼接进去 }[/quote] 不建议用这种拼接,容易被注入,建议用参数方式传入
於黾 2014-08-19
  • 打赏
  • 举报
回复
如果你想说的是,查询的表不同,所以查询条件也不同 那你只能单独为每个查询做窗口,放入不同的控件,这样是最简单的 否则一个窗口放入太多控件,又根据条件控制哪些显示哪些不显示,太乱了
於黾 2014-08-19
  • 打赏
  • 举报
回复
引用 4 楼 a3610313 的回复:
[quote=引用 3 楼 Z65443344 的回复:] 保存为一个查询的方案,保存到哪?保存什么? 不就是通过选项,拼接一个SQL语句么 至于拼接好之后直接执行,还是先放到哪里,就根据需要去做呗
关键是我不知道UI怎么做,要根据用户的选择弹出不同的控件,设置不同的查询条件,然后和在一起执行查询。[/quote] 要根据用户的选择弹出不同的控件 -> 你确定?你不事先放好一堆控件让用户选,你让用户选什么啊,点哪啊,还弹出不同的控件,弹出干嘛啊 就放一堆控件,把能够参与查询的条件都罗列上,用户选了哪个,就拼接到SQL语句中去,没选的忽略,不就得了 具体类似: string sql="select * from table where 1=1";//这里先写好where,如果什么都不选,就是查询全部,就不用到后面再判断是否需要加where了 if(textbox1.text.length>0) { sql+=" and id="+textbox1.text;//如果有文字,就把条件拼接进去 }
a3610313 2014-08-19
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
保存为一个查询的方案,保存到哪?保存什么? 不就是通过选项,拼接一个SQL语句么 至于拼接好之后直接执行,还是先放到哪里,就根据需要去做呗
关键是我不知道UI怎么做,要根据用户的选择弹出不同的控件,设置不同的查询条件,然后和在一起执行查询。
於黾 2014-08-19
  • 打赏
  • 举报
回复
保存为一个查询的方案,保存到哪?保存什么? 不就是通过选项,拼接一个SQL语句么 至于拼接好之后直接执行,还是先放到哪里,就根据需要去做呗
shawn_yang 2014-08-19
  • 打赏
  • 举报
回复
无非是用下拉框和textbox让用户填入查询条件,你再拼接进sql查询语句即可
lc_ant 2014-08-19
  • 打赏
  • 举报
回复
把你的选择条件都加到窗体上面,让用户选择,你在后台把条件组合成sql语句
  • 打赏
  • 举报
回复
可以考虑使用Grid,列依次设置为:逻辑符(AND/OR)、左括号、你的列名(下拉选择)、匹配符(=/LIKE/...)、右括号。
将Grid的行拼起来就是查询条件了。
至于方案,可以将Grid的数据保存成"方案n.xml“,用一个ListBox展示出来。上面再加几个按钮,保存,新建...等等
这是以前在百度上看到的一个截图,基本就是这个思路

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧