文本框通过SQL Datagridview过滤 - 显示太多列(重复列)

时间:2017-07-19 18:25:56

标签: c# mysql search datagridview filter

搜索方法在这里:

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection("Data Source=DESKTOP-HNR3NJB\\mysql;Initial Catalog=stock;Integrated Security=True");
        SqlDataAdapter sda = new SqlDataAdapter("SELECT ProductName FROM [stock].[dbo].[Products]", con);
        sda.Fill(dt);
        dataGridView1.DataSource = dt;
        dt.DefaultView.RowFilter = string.Format("ProductName LIKE '%{0}%'", textBox1.Text);
    }

现在,它会过滤掉表格中的结果,但会添加如下图所示的列:

Search Results 加载数据函数(加载表单后立即调用:

public void LoadData()
    {
        SqlConnection con = new SqlConnection(@"Data Source=DESKTOP-HNR3NJB\mysql;Initial Catalog=stock;Integrated Security=True");
        con.Open();
        //reading data from sql
        SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM [stock].[dbo].[Products]", con);
        dt = new DataTable();
        sda.Fill(dt);
        dataGridView1.Rows.Clear();
        foreach (DataRow item in dt.Rows)
        {
            int n = dataGridView1.Rows.Add();
            dataGridView1.Rows[n].Cells[0].Value = item["ProductID"].ToString();
            dataGridView1.Rows[n].Cells[1].Value = item["ProductName"].ToString();
            if ((bool)item["ProductStatus"])
            {
                dataGridView1.Rows[n].Cells[2].Value = "Active";
            }
            else
            {
                dataGridView1.Rows[n].Cells[2].Value = "Inactive";
            }
            dataGridView1.Rows[n].Cells[3].Value = item["Employee"].ToString();
            dataGridView1.Rows[n].Cells[4].Value = item["CPU"].ToString();
            dataGridView1.Rows[n].Cells[5].Value = item["RAM"].ToString();
            dataGridView1.Rows[n].Cells[6].Value = item["SSD"].ToString();
            dataGridView1.Rows[n].Cells[7].Value = item["HDD"].ToString();
            dataGridView1.Rows[n].Cells[8].Value = item["WindowsVersion"].ToString();
            dataGridView1.Rows[n].Cells[9].Value = item["Description"].ToString();
            dataGridView1.Rows[n].Cells[10].Value = item["Type"].ToString();
        }
        con.Close();
    }

由于

1 个答案:

答案 0 :(得分:0)

好的,所以你在其他地方填充datagridview。您只需要将rowfilter应用于textbox_textchanged事件中的视图

在您填充当前datagridview的地方,确保您在更广泛的范围内实例化您的dt,以便文本框事件可以访问它,然后您在textchanged事件中应该做的就是以下行:

dt.DefaultView.RowFilter = string.Format("ProductName LIKE '%{0}%'", textBox1.text);

然后应该将行限制为当前找到的行。这是一个演示数据库的示例(您必须根据自己的需要进行更改)

    DataTable dt; //declared outside a method so that multiple methods have access to it object.
    private void Form1_Load(object sender, EventArgs e)
    {
        //Some other area where the datagridview is populated with more information
        SqlConnection con = new SqlConnection(@"MyConnectionString");
        con.Open();
        SqlDataAdapter sda = new SqlDataAdapter("SELECT FirstName, LastName, Address, State FROM Employee", con);
        dt = new DataTable();
        sda.Fill(dt);
        dataGridView1.DataSource = dt;
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        //all that should be needed to filter the datagridview to your condition
        dt.DefaultView.RowFilter = string.Format("FirstName LIKE '%{0}%'", textBox1.Text);

    }

当然,您确实需要切换到使用语句,以便正确处理所使用的对象,但这是为了表明您的网格正在执行此操作的基本原因是您正在将另一个数据源应用到网格中不知道您仍然希望之前的所有信息仅限于与您的过滤器匹配的行。

编辑 - 澄清

我们这样做。在loaddata代码中,注释每个循环的整个。添加以下行

datagridview1.columns.clear();
datagridview1.datasoure = dt;

这将隐藏您现有的列,而无需您手动执行此操作。 并且应该使用查询中的所有信息显示网格。

然后在你的textchanged事件中注释所有代码并将其替换为上面显示的使用数据表的DefaultView(dt)的行

这应该让你起来并运行。完成后,我们可以对查询进行更改,以便您显示“Active”/“InActive”而不是位字段的复选框。