C# 如何用dataGridView 做过滤条件,如图

为爱打拼 2015-11-13 04:37:06
问题: 如下图 如何用dataGridView做综合过滤条件查询,全文代码如下,但查询出来的只是最后一个条件,如何才能
按设置好的条件来查询,即.下面这种表达式
select * from 表 where [款号]='A5195SP' and [材质]='都市情怀'
但实际查询出来的,只是
select * from 表 where [材质]='都市情怀'
请各位大侠帮看下,小弟是个新手.谢谢



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace 查询过滤.FormClass
{
public partial class frm_Filter : Form
{
public frm_Filter()
{
InitializeComponent();
}
public static DataSet myds ;//记录查询的条数,以便于返还给其他表查询使用
public static int dgvSum = 0;//记录查询的条数,以便于返还给其他表查询使用
public string A = "";//列名称
public string B = "";//运算符
public string C = "";//数据值
public string D = "";//逻辑关系符


#region 查询
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Clear();
string SelectStr = ""; //前半相同语句
string value = "";//字段名变量

string YanSuanHu = ""; //运算符
string LuoJiHu = "";//逻辑符

for (int i=0;i<dataGridView1.RowCount-1;i++)
{
string allStr01 = "select FDate AS 日期,FNumberID AS 单据编号, FNumberOrder AS 单号, FStyleName AS 款号,Materil AS 材质,processOrder AS 工序编号,ProcessName AS 工序名称,"

+ "FNumberSum_01 AS 源订单数,Number_InOk AS 累计入库, ( Convert(float,FNumberSum_01) - Convert(float,Number_InOk)) AS 欠数,SigerPrice AS 单价 from tb_ProcedWorkOrder where "; //通用查询前段


A = (dataGridView1.Rows[i].Cells[0].Value == null ? null : dataGridView1.Rows[i].Cells[0].Value.ToString());//列名字段名称
B = (dataGridView1.Rows[i].Cells[1].Value == null ? null : dataGridView1.Rows[i].Cells[1].Value.ToString());//运算符
C = (dataGridView1.Rows[i].Cells[2].Value == null ? null : dataGridView1.Rows[i].Cells[2].Value.ToString());//数值
D = (dataGridView1.Rows[i].Cells[3].Value == null ? null : dataGridView1.Rows[i].Cells[3].Value.ToString());//逻辑关系符

//=============================================款号

switch (A)//字段名称
{
case "日期":
value= "FDate";
break;

case "单据编号":
value = "FNumberID";
break;
case "款号":
value = "FStyleName";
break;
case "材质":
value = "Materil";
break;
case "工序编号":
value = "processOrder";
break;
case "工序名称":
value = "ProcessName";
break;
case "订数数量":
value = "FNumberSum_01";
break;

}

switch(B) //运算符
{
case "等于":
YanSuanHu = "=";
break;

case "不等于":
YanSuanHu = "!=";
break;

}

//============
switch (C) //逻辑符
{
case "并且":
LuoJiHu = "and ";
break;

case "或者":
LuoJiHu = "or";
break;

}

//现在来拼接SQL查询语句
if(A != null && B != null && C != null && D == null)
{
SelectStr = allStr01 + value + YanSuanHu + "'" + C + "'";
}
else
{
SelectStr = SelectStr + LuoJiHu + " " + value + YanSuanHu + "'" + C + "'";
}

}


//===================
SqlClass.mySqlClass.getcon();//打开数据库
SqlCommand cmd = new SqlCommand(SelectStr, SqlClass.mySqlClass.MyCon);//创建一个SqlCommand对象
SqlDataAdapter sda = new SqlDataAdapter();
sda.SelectCommand = cmd;
myds = new DataSet();//创建一个Set对象
sda.Fill(myds, "tb_ProcedWorkOrder");
sda.Dispose(); //释放所有资源
dgvSum = myds.Tables[0].Rows.Count;

if (dgvSum > 0)
{
MessageBox.Show("我查到了【" + dgvSum + "】条数据", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
this.Close();
}
else
{

MessageBox.Show("没有查到数据", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}


}
#endregion

private void button2_Click(object sender, EventArgs e)
{
this.Close();
}

}
}

//============以上为全部代码
...全文
1714 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
嗯…………我的代码和你的设计有冲突,我认为逻辑连接符是承上的关系,你这里做了启下 不过这不是大问题你应该可以自己休整清楚的。
  • 打赏
  • 举报
回复 1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
 
namespace 查询过滤.FormClass
{
    public partial class frm_Filter : Form
    {
        public frm_Filter()
        {
            InitializeComponent();
        }
        public static DataSet myds ;//记录查询的条数,以便于返还给其他表查询使用
        public static int dgvSum = 0;//记录查询的条数,以便于返还给其他表查询使用
        //public string A = "";//列名称
        //public string B = "";//运算符
        //public string C = "";//数据值
        //public string D = "";//逻辑关系符
        //显示字符串和实际字段名映射
        Dictionary<string, string> fieldMap = new Dictionary<string, string>()
            {
                { "日期", "FDate" },
                { "单据编号","FNumberID" },
                { "款号", "FStyleName" },
                { "材质","Materil" },
                { "工序编号", "processOrder" },
                { "工序名称","ProcessName" },
                { "订数数量","FNumberSum_01" }
            };
 
        //显示字符串和实际运算符号映射
        Dictionary<string, string> symbolMap = new Dictionary<string, string>()
            {
                { "等于", "==" },
                { "大于",">" },
                { "小于", "<" },
                { "不等于","><" },
                { "大于等于", ">=" },
                { "小于等于","<=" },
            };
 
         //显示字符串和实际逻辑连接符映射
        Dictionary<string, string> logicalMap = new Dictionary<string, string>()
            {
                { "和", "and" },
                { "或","or" },
            };
 
 
        #region 查询
        private void button1_Click(object sender, EventArgs e)
        {
            //dataGridView1.Rows.Clear();<-//你这里执行这个你还能取到鬼的数据!!!
 
            System.Text.StringBuilder whereString = new System.Text.StringBuilder();
            foreach (var item in dataGridView1.Rows)
            {
                var A = item.Cells[0].Value ?? null;
                var B = item.Cells[0].Value ?? null;
                var C = item.Cells[0].Value ?? null;
                var D = item.Cells[0].Value ?? null;
 
                if (A!=null&&B!=null&&C!=null&&D!=null)
                {
                    whereString.Append($" {logicalMap[C]} {fieldMap[A]} {symbolMap[c]} {D}");
                }
            }
 
            dataGridView1.Rows.Clear();//取完数据再清空你的gridview不迟
 
            string SelectStr = "select FDate AS 日期,FNumberID AS 单据编号, FNumberOrder AS 单号,  FStyleName AS 款号,Materil AS 材质,processOrder AS 工序编号,ProcessName AS 工序名称,FNumberSum_01 AS 源订单数,Number_InOk AS 累计入库, ( Convert(float,FNumberSum_01) - Convert(float,Number_InOk)) AS 欠数,SigerPrice AS 单价  from tb_ProcedWorkOrder where "
                +whereString.ToString();//拼接实际sql字符串,调试的时候在这里打断点多看看这里的数据正确不正确,早早做出调整
 
            //===================
            SqlClass.mySqlClass.getcon();//打开数据库  
            SqlCommand cmd = new SqlCommand(SelectStr, SqlClass.mySqlClass.MyCon);//创建一个SqlCommand对象
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.SelectCommand = cmd;
            myds = new DataSet();//创建一个Set对象
            sda.Fill(myds, "tb_ProcedWorkOrder");
            sda.Dispose();  //释放所有资源  
            dgvSum = myds.Tables[0].Rows.Count;
 
            if (dgvSum > 0)
            {
                MessageBox.Show("我查到了【" + dgvSum + "】条数据", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            else
            {
 
                MessageBox.Show("没有查到数据", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
     
 
        }
        #endregion
 
        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }
 
    }
}
修改了一下注释,补上了少的一个映射,能不能正常运行只能看天意了。
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace 查询过滤.FormClass
{
    public partial class frm_Filter : Form
    {
        public frm_Filter()
        {
            InitializeComponent();
        }
        public static DataSet myds ;//记录查询的条数,以便于返还给其他表查询使用
        public static int dgvSum = 0;//记录查询的条数,以便于返还给其他表查询使用
        //public string A = "";//列名称
        //public string B = "";//运算符
        //public string C = "";//数据值
        //public string D = "";//逻辑关系符
        //显示字符串和实际字段名映射
        Dictionary<string, string> fieldMap = new Dictionary<string, string>()
            {
                { "日期", "FDate" },
                { "单据编号","FNumberID" },
                { "款号", "FStyleName" },
                { "材质","Materil" },
                { "工序编号", "processOrder" },
                { "工序名称","ProcessName" },
                { "订数数量","FNumberSum_01" }
            };

        //显示字符串和实际字段名映射
        Dictionary<string, string> symbolMap = new Dictionary<string, string>()
            {
                { "等于", "==" },
                { "大于",">" },
                { "小于", "<" },
                { "不等于","><" },
                { "大于等于", ">=" },
                { "小于等于","<=" },
            };




        #region 查询
        private void button1_Click(object sender, EventArgs e)
        {
            //dataGridView1.Rows.Clear();<-//你这里执行这个你还能取到鬼的数据!!!

            System.Text.StringBuilder whereString = new System.Text.StringBuilder();
            foreach (var item in dataGridView1.Rows)
            {
                var A = item.Cells[0].Value ?? null;
                var B = item.Cells[0].Value ?? null;
                var C = item.Cells[0].Value ?? null;
                var D = item.Cells[0].Value ?? null;

                if (A!=null&&B!=null&&C!=null&&D!=null)
                {
                    whereString.Append($" {logicalMap[C]} {fieldMap[A]} {symbolMap[c]} {D}");
                }
            }

            dataGridView1.Rows.Clear();//取完数据再清空你的gridview不迟

            string SelectStr = "select FDate AS 日期,FNumberID AS 单据编号, FNumberOrder AS 单号,  FStyleName AS 款号,Materil AS 材质,processOrder AS 工序编号,ProcessName AS 工序名称,FNumberSum_01 AS 源订单数,Number_InOk AS 累计入库, ( Convert(float,FNumberSum_01) - Convert(float,Number_InOk)) AS 欠数,SigerPrice AS 单价  from tb_ProcedWorkOrder where "
                +whereString.ToString();//拼接实际sql字符串,调试的时候在这里打断点多看看这里的数据正确不正确,早早做出调整

            //===================
            SqlClass.mySqlClass.getcon();//打开数据库  
            SqlCommand cmd = new SqlCommand(SelectStr, SqlClass.mySqlClass.MyCon);//创建一个SqlCommand对象
            SqlDataAdapter sda = new SqlDataAdapter();
            sda.SelectCommand = cmd;
            myds = new DataSet();//创建一个Set对象
            sda.Fill(myds, "tb_ProcedWorkOrder");
            sda.Dispose();  //释放所有资源  
            dgvSum = myds.Tables[0].Rows.Count;

            if (dgvSum > 0)
            {
                MessageBox.Show("我查到了【" + dgvSum + "】条数据", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            else
            {

                MessageBox.Show("没有查到数据", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
    

        }
        #endregion

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

    }
}
拉到vs里面大概改了一下代码,但是并没有测试因为我用的console项目,所以编译都过不去,你自己多调试吧。
盛世浮章 2019-03-20
  • 打赏
  • 举报
回复
楼主,你拼音也错了啊,yunsuanfu运算符。
盛世浮章 2019-03-20
  • 打赏
  • 举报
回复
代码错了挺多的啊。
第一个
这里C是数值,D是逻辑符。
Switch的时候变成了C是逻辑符

最大的问题:
引用 1 楼 xdashewan 的回复:
你把string allStr01 = 放在循环里面,这样每次执行sql都被重置了

这位仁兄说的很对,但是不是allStr01的问题,最后拼接的SelectStr 不能放在for循环里面,要放在最外面。如果楼主是想要设置好条件,然后确定一键查询,那拼接的方法完全错误,就算成功了而且很容易出bug。按照楼主的写法,拼接字符串代码应该如下(没有做操作错误处理机制)
private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.Rows.Clear();

string SelectStr = "select FDate AS 日期,FNumberID AS 单据编号, FNumberOrder AS 单号,  FStyleName AS 款号,Materil AS 材质,processOrder AS 工序编号,ProcessName AS 工序名称,"
                         + "FNumberSum_01 AS 源订单数,Number_InOk AS 累计入库, ( Convert(float,FNumberSum_01) - Convert(float,Number_InOk)) AS 欠数,SigerPrice AS 单价  from tb_ProcedWorkOrder where  "; //通用查询前段-查询的列
string ConditionStr="";//查询的条件语句
            for (int i=0;i<dataGridView1.RowCount-1;i++)
            {             
                A = (dataGridView1.Rows[i].Cells[0].Value == null ? null : dataGridView1.Rows[i].Cells[0].Value.ToString());//列名字段名称
                B = (dataGridView1.Rows[i].Cells[1].Value == null ? null : dataGridView1.Rows[i].Cells[1].Value.ToString());//运算符
                C = (dataGridView1.Rows[i].Cells[2].Value == null ? null : dataGridView1.Rows[i].Cells[2].Value.ToString());//数值
                D = (dataGridView1.Rows[i].Cells[3].Value == null ? null : dataGridView1.Rows[i].Cells[3].Value.ToString());//逻辑关系符

                //=========这些值循环表格时不断在更新,楼主放在循环外面最终只能获取到最后一行的值===========
            string value = "";//字段名变量
            string YanSuanHu = ""; //运算符
            string LuoJiHu = "";//逻辑符
                switch (A)//字段名称
                {
                    case "日期":
                       value= "FDate";
                        break;
                    case "单据编号":
                        value = "FNumberID";
                        break;
                    case "款号":
                        value = "FStyleName";
                        break;
                    case "材质":
                        value = "Materil";
                        break;
                    case "工序编号":
                        value = "processOrder";
                        break;
                    case "工序名称":
                        value = "ProcessName";
                        break;
                    case "订数数量":
                        value = "FNumberSum_01";
                        break;    
                }
                switch(B) //运算符
                {
                    case "等于":
                        YanSuanHu = "=";
                        break;

                    case "不等于":
                        YanSuanHu = "!=";
                        break;       
                }

                //============
                switch (D) //逻辑符
                {
                    case "并且":
                        LuoJiHu = "and ";
                        break;

                    case "或者":
                        LuoJiHu = "or";
                        break;
                }

                //现在来拼接SQL查询条件语句,介于楼主表的设计,假设每行的逻辑符号拼接的是表格下一行的数据,没有下一行,逻辑一列必须不能赋值所以查询语句如下
                    ConditionStr+=value  + " " + + YanSuanHu + " '" + C + "' "+LuoJiHu ;    //此处是拼接每一行数据,不是重新赋值
      }
//for循环完毕,拼接完整的查询语句
SelectStr +=ConditionStr;
//数据库查询语句,这个没看,能查出数据应该没错。
......
}
以上代码本人没有运行,只是从逻辑上改了改,有错误欢迎请大家指正。楼主可以拿去校验,如果无误,看在这么多字的份上,给个分吧。
xian_wwq 2015-11-13
  • 打赏
  • 举报
回复
引用 楼主 wsworlf520 的回复:
问题: 如下图 如何用dataGridView做综合过滤条件查询,全文代码如下,但查询出来的只是最后一个条件,如何才能 按设置好的条件来查询,即.下面这种表达式 select * from 表 where [款号]='A5195SP' and [材质]='都市情怀' 但实际查询出来的,只是 select * from 表 where [材质]='都市情怀' 请各位大侠帮看下,小弟是个新手.谢谢
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace 查询过滤.FormClass { public partial class frm_Filter : Form { public frm_Filter() { InitializeComponent(); } public static DataSet myds ;//记录查询的条数,以便于返还给其他表查询使用 public static int dgvSum = 0;//记录查询的条数,以便于返还给其他表查询使用 public string A = "";//列名称 public string B = "";//运算符 public string C = "";//数据值 public string D = "";//逻辑关系符 #region 查询 private void button1_Click(object sender, EventArgs e) { dataGridView1.Rows.Clear(); string SelectStr = ""; //前半相同语句 string value = "";//字段名变量 string YanSuanHu = ""; //运算符 string LuoJiHu = "";//逻辑符 for (int i=0;i<dataGridView1.RowCount-1;i++) { string allStr01 = "select FDate AS 日期,FNumberID AS 单据编号, FNumberOrder AS 单号, FStyleName AS 款号,Materil AS 材质,processOrder AS 工序编号,ProcessName AS 工序名称," + "FNumberSum_01 AS 源订单数,Number_InOk AS 累计入库, ( Convert(float,FNumberSum_01) - Convert(float,Number_InOk)) AS 欠数,SigerPrice AS 单价 from tb_ProcedWorkOrder where "; //通用查询前段 A = (dataGridView1.Rows[i].Cells[0].Value == null ? null : dataGridView1.Rows[i].Cells[0].Value.ToString());//列名字段名称 B = (dataGridView1.Rows[i].Cells[1].Value == null ? null : dataGridView1.Rows[i].Cells[1].Value.ToString());//运算符 C = (dataGridView1.Rows[i].Cells[2].Value == null ? null : dataGridView1.Rows[i].Cells[2].Value.ToString());//数值 D = (dataGridView1.Rows[i].Cells[3].Value == null ? null : dataGridView1.Rows[i].Cells[3].Value.ToString());//逻辑关系符 //=============================================款号 switch (A)//字段名称 { case "日期": value= "FDate"; break; case "单据编号": value = "FNumberID"; break; case "款号": value = "FStyleName"; break; case "材质": value = "Materil"; break; case "工序编号": value = "processOrder"; break; case "工序名称": value = "ProcessName"; break; case "订数数量": value = "FNumberSum_01"; break; } switch(B) //运算符 { case "等于": YanSuanHu = "="; break; case "不等于": YanSuanHu = "!="; break; } //============ switch (C) //逻辑符 { case "并且": LuoJiHu = "and "; break; case "或者": LuoJiHu = "or"; break; } //现在来拼接SQL查询语句 if(A != null && B != null && C != null && D == null) { SelectStr = allStr01 + value + YanSuanHu + "'" + C + "'"; } else { SelectStr = SelectStr + LuoJiHu + " " + value + YanSuanHu + "'" + C + "'"; } } //=================== SqlClass.mySqlClass.getcon();//打开数据库 SqlCommand cmd = new SqlCommand(SelectStr, SqlClass.mySqlClass.MyCon);//创建一个SqlCommand对象 SqlDataAdapter sda = new SqlDataAdapter(); sda.SelectCommand = cmd; myds = new DataSet();//创建一个Set对象 sda.Fill(myds, "tb_ProcedWorkOrder"); sda.Dispose(); //释放所有资源 dgvSum = myds.Tables[0].Rows.Count; if (dgvSum > 0) { MessageBox.Show("我查到了【" + dgvSum + "】条数据", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information); this.Close(); } else { MessageBox.Show("没有查到数据", "查询提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } #endregion private void button2_Click(object sender, EventArgs e) { this.Close(); } } } //============以上为全部代码
拼接的SelectStr 不完整
exception92 2015-11-13
  • 打赏
  • 举报
回复
自己 F5 调试吧,大概是这的错误,

  if(A != null && B != null && C != null  && D == null)
                {
                    SelectStr = allStr01 + value + YanSuanHu + "'" + C + "'";
                }
                else
                {
                    SelectStr = SelectStr + LuoJiHu + " " + value + YanSuanHu + "'" + C + "'";
                }
xdashewan 2015-11-13
  • 打赏
  • 举报
回复
你把string allStr01 = 放在循环里面,这样每次执行sql都被重置了

110,567

社区成员

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

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

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