WPF - 使用textBox按名称过滤Datagrid

时间:2015-10-21 12:18:39

标签: c# wpf filter datagrid

我使用此代码使用textBox过滤我的dataGrid,它可以通过Id进行过滤,但如果我将其更改为按名称过滤(我只需更改" Id&#34 ;在带有" Name")的查询中,它不起作用,类似于"列名称"输入文本"是无效的。当为Id设置查询并输入一个字母时,会发生同样的错误,显然它只适用于数字。

以下是代码:

private void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
            try {
                SqlConnection con = new SqlConnection(@"Data Source =.\SQLEXPRESS; AttachDbFilename = C:\Users\Sione\Documents\AcademiaSQLDB.mdf; Integrated Security = True; Connect Timeout = 30; User Instance = True");
                con.Open();

                string query = "select * from instrutor";

                if (textBox.Text != "") // Note: txt_Search is the TextBox..
                {
                    query += " where Nome =" + textBox.Text;
                }
                SqlCommand cmd = new SqlCommand(query, con);
                cmd.ExecuteNonQuery();

                SqlDataAdapter adp = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable("instrutor");
                adp.Fill(dt);
                instrutorDataGrid.ItemsSource = dt.DefaultView;
                adp.Update(dt);

                con.Close();

            } catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
}

那么如何通过名称过滤dataGrid呢?通过Id过滤完美的思考,但它不是非常用户友好。感谢

2 个答案:

答案 0 :(得分:0)

您需要使用'打包过滤器 这一行:

query += " where Nome =" + textBox.Text;

成为

query += " where Nome ='" + textBox.Text + "'";

请注意,这是一个快速修复,您需要考虑@Dennis回答

答案 1 :(得分:0)

不要使用字符串连接来构建SQL查询,这将导致SQL injections。改为使用参数:

private SqlCommand CreateCommand(SqlConnection connection)
{
   return new SqlCommand("select * from instrutor", connection);
}

private SqlCommand CreateCommand(SqlConnection connection, TextBox textBox)
{
    var command = new SqlCommand("select * from instrutor where Nome = @nome",  
        connection);

    command.Parameters.AddWithValue("@nome", textBox.text);
    return command;
}

private void textBox_TextChanged(object sender, TextChangedEventArgs e)
{
    // ...
    using (var command = !string.IsNullOrEmpty(textBox.Text) ? 
        CreateCommand(conn, textBox) : CreateCommand(conn))
    {
        // ...
    }
    // ...
}

另请注意:1)SqlConnectionSqlCommandSqlDataAdapter实施IDisposable并应予以处置(请参阅this); 2)无需执行cmd.ExecuteNonQuery();