如何使用单个文本框搜索多个列

时间:2018-06-25 03:44:24

标签: c# sql sql-server

我正在使用SQL Server数据库,我有一个包含多列([First Name], [Last Name])的表,并在datagridview中显示它。我的UI中还只有一个文本框(txtBoxSearch)。如何仅使用1个字符串在两列中进行搜索?

当导航到用户屏幕以将数据加载到datagridview中时,我调用此方法:

private void LoadData() {
        try {
            string sqlCommand = "SELECT * from tbl_user";
            con = new SqlConnection(connectionString);

            dataAdapter = new SqlDataAdapter(sqlCommand, connectionString);

            table = new DataTable();
            table.Locale = System.Globalization.CultureInfo.InvariantCulture;
            dataAdapter.Fill(table);
            dataGridProducts.DataSource = table;
        } catch (Exception ex) {
            MessageBox.Show(string.Format("An error occurred: {0}", ex.Message), "Error");
        }
    }

这是我的代码,它适用于第一次搜索,但是再次搜索后,将显示找不到任何记录。

if (!string.IsNullOrWhiteSpace(txtBoxSearch.Text)) {
                try {
                    using (SqlConnection con = new SqlConnection(connectionString)) {
                        con.Open();
                        string sqlCommand = "SELECT * FROM tbl_user WHERE CONCAT([First Name], [Last Name]) LIKE '%" + txtBoxSearch.Text + "%'";
                        using (SqlCommand cmd = new SqlCommand(sqlCommand, con)) {

                            DataTable dt = new DataTable();
                            SqlDataAdapter ad = new SqlDataAdapter(cmd);
                            ad.Fill(dt);

                            if (dt.Rows.Count > 0) {
                                dataGridProducts.DataSource = dt;
                            } else {
                                MessageBox.Show("No record found.", "Error");
                            }
                        }
                    }
                } catch (Exception ex) {
                    MessageBox.Show(string.Format("An error occurred: {0}", ex.Message), "Error");
                } finally {
                    con.Close();
                }
            }

5 个答案:

答案 0 :(得分:3)

我在这里看到了几个问题。我模拟了您的简单表,并运行了以下代码,效果很好。

string sqlCommand = "SELECT [Fist Name], [Last Name] FROM tbl_user WHERE [First Name] LIKE '%" +
txtBoxSearch.Text + "%' OR [Last Name] LIKE '%" + txtBoxSearch.Text + "%'";
table = new DataTable();
table.Locale = System.Globalization.CultureInfo.InvariantCulture;
using(var dataAdapter = new SqlDataAdapter(sqlCommand, connectionString))
{
    dataAdapter.Fill(table);
}
dataGridUser.DataSource = table;

据我所知,您不需要SqlCommandBuilder。您也不需要BindingSource也不使用它。

我在这里所做的唯一区别是处置dataAdapter

例如,上面的代码在单击按钮时效果很好。

我怀疑您没有发布所有代码。如果可能的话,请发布可以完全重现此问题的代码。

答案 1 :(得分:1)

BindingSource.
table = new DataTable();

您已经删除了向我们展示为什么它第二次不起作用的代码。


更新

请在此处查看所有解决方案:Getting blank rows after setting DataGridView.DataSource

  1. DataGridView.AutoGenerateColumns = false
  2. 已设置DataPropertyNames
  3. DataGridView.ColumnCount = 0;因为新列可能第二次隐藏了数据。

答案 2 :(得分:1)

您分配了commandBuilder但不使用它。请参考SqlCommandBuilder文档:

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommandbuilder(v=vs.110).aspx

builder.GetUpdateCommand();

答案 3 :(得分:0)

发现我的代码没有问题,我的文本框MultiLine属性设置为true。这就是为什么当我按下Enter键时,先前的文本仍在文本框中。

顺便说一句,谢谢所有分享想法的人:)

答案 4 :(得分:-1)

private void txtsearch_TextChanged(object sender, EventArgs e)
{
    (dataGridView1.DataSource as DataTable).DefaultView.RowFilter = string.Format("ProductCode LIKE '{0}%' or ProductName LIKE '{1}%' or Type LIKE '{2}%' ", txtsearch.Text, txtsearch.Text, txtsearch.Text);
}