我正在使用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();
}
}
答案 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
答案 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);
}