【问题标题】:Search function won't display [closed]搜索功能不会显示[关闭]
【发布时间】:2019-11-19 02:57:38
【问题描述】:

我正在尝试使用将显示在 datagridview 中的文本框来实现搜索功能。我希望它是这样,无论我试图搜索哪一列,无论是从项目名称还是位置,它都会显示在 datagridview 中。但是,当我在文本框中输入内容时,datagridview 不会改变。谢谢一堆。代码如下:

string sql = "SELECT * FROM Project "+"WHERE(ProjectName LIKE @Search)"+ " OR(NumberOfUnits LIKE @Search)"+ "OR(Location LIKE @Search)";
using (var con = new SqlConnection(@"Data Source=HAZWAN-PC\SQLEXPRESS;Initial Catalog=wantest2;Integrated Security=True"))
{
    using (var cmd = new SqlCommand(sql, con))
    {
        cmd.Parameters.AddWithValue("@Search", "%" + txtSearch.Text + "%");
        con.Open();
        try
        {
            cmd.ExecuteNonQuery();
        }
        catch (SqlException er)
        {
            MessageBox.Show("There was an error accessing your data. DETAIL: " + er.ToString());
        }

        dataGridView1.DataSource = null;
        BindGrid();
    }
}

【问题讨论】:

  • 请相应地查看minimal reproducible exampleedit 代码...目前还不清楚您完全忽略结果的数据库查询会发生什么...以及`dataGridView1.DataSource =空`...
  • 尝试在 AddWithValue() 语句之前将任何“未指定”字段值设置为 %。
  • 您期望结果来自哪里?您正在调用不会返回结果集的 ExecuteNonQuery。我认为这里缺少一些细节。此外,在将 DataSource 设置为 null 之后,您正在调用 BindGrid()。对吗?

标签: c# sql search datagridview


【解决方案1】:

绑定 GridView 时缺少某些元素或代码行。

您必须使用SqlDataAdapter 从数据库中提取数据并存储到DataSetDataTable 以进行进一步的处理,这里与gridview 绑定。

试试下面的代码:

            DataTable dt = new DataTable();
            SqlDataAdapter da;
            string sql = "SELECT * FROM Project WHERE ProjectName LIKE @Search OR NumberOfUnits LIKE @Search OR Location LIKE @Search";
            using (var con = new SqlConnection(@"Data Source=HAZWAN-PC\SQLEXPRESS;Initial Catalog=wantest2;Integrated Security=True"))
            {
                using (var cmd = new SqlCommand(sql, con))
                {
                    cmd.Parameters.AddWithValue("@Search", "%" + txtSearch.Text + "%");

                    try
                    {
                        con.Open();
                        //cmd.ExecuteNonQuery(); 
                        //Instead of above method you have to use 
                        da = new SqlDataAdapter(cmd);
                        da.Fill(dt);
                        da.Dispose();
                        dataGridView1.DataSource = dt;
                        con.Close();
                    }
                    catch (SqlException er)
                    {
                        con.Close();
                        dataGridView1.DataSource = null;
                        MessageBox.Show("There was an error accessing your data. DETAIL: " + er.ToString());
                    }             

                }
            }

您可以将上述代码包装在一个方法中,如RefreshGridBindGrid 等,并根据要求调用该方法。

【讨论】:

  • 天哪,这行得通!抱歉这个问题含糊不清。对编程非常陌生。我只是跟着 youtube 教程并填补了空白。