我目前正在開發 WinForms 應用程式,在表單上我有一個用于搜索的文本框和一個 ListView 控制元件,其中將根據用戶輸入從資料庫中填充資料。
TextChanged這是在文本框控制元件上實作事件的以下代碼
private void tbSearchGlassOnShell_TextChanged(object sender, EventArgs e)
{
Form1 form = new Form1();
string cmdString = string.Empty;
try
{
string connString = string.Format("Server={0};Username={1};Database={2};Port={3};Password={4};",
form.Tbhostname, form.Tbusername, form.Tbdatabase, form.Tbport, form.Tbpassword);
MySqlConnection conn = new MySqlConnection(connString);
conn.Open();
cmdString = "SELECT shell_glass.shell_glass_id,shell.shell_name,glass.glass_name,"
"shell_glass.shell_glass_quantity,shell_glass.shell_glass_ordernumber,"
"shell_glass.shell_glass_datetime,shell_glass.user_id FROM shell_glass "
"JOIN shell using (shell_id) JOIN glass using (glass_id)"
"WHERE LOWER(glass.glass_name) LIKE '%" tbSearchGlassOnShell.Text.ToLower() "%'";
MySqlCommand command = new MySqlCommand(cmdString, conn);
MySqlDataReader reader = command.ExecuteReader();
while(reader.Read())
{
ListViewItem item = new ListViewItem(reader["shell_glass_id"].ToString());
item.SubItems.Add(reader["shell_name"].ToString());
item.SubItems.Add(reader["glass_name"].ToString());
item.SubItems.Add(reader["shell_glass_quantity"].ToString());
item.SubItems.Add(reader["shell_glass_ordernumber"].ToString());
item.SubItems.Add(reader["shell_glass_datetime"].ToString());
item.SubItems.Add(reader["user_id"].ToString());
lvSearchGlassOnShell.Items.Add(item);
}
reader.Close();
}
catch (MySqlException ex)
{
form.TbSetupLog.AppendText("MySqlExepction: " ex.Message Environment.NewLine);
}
catch (Exception ex)
{
form.TbSetupLog.AppendText("Exception: " ex.Message Environment.NewLine);
}
}
出于某種原因,ListView 控制元件在用戶輸入后多次顯示相同的值,如下圖所示

問題:如何實作用戶輸入后我只有一個值但不重復?
uj5u.com熱心網友回復:
將為 TextBox 中鍵入的每個字符呼叫 TextChanged 事件,因此當您鍵入第一個字母時執行搜索,然后在您鍵入第二個字母時執行另一個搜索,依此類推。您永遠不會清除 ListView 專案集合,因此每次搜索都會在串列視圖中添加另一個條目。
要解決您眼前的問題,只需致電
lvSearchGlassOnShell.Items.Clear();
在進入閱讀器回圈之前。
但是上面的代碼還有其他問題。嚴重的問題是Sql Injection成為可能,因為您連接字串來構建 sql 命令。
相反,您需要以這種方式使用引數
try
{
lvSearchGlassOnShell.Items.Clear();
string connString = string.Format("Server={0};Username={1};Database={2};Port={3};Password={4};",
form.Tbhostname, form.Tbusername, form.Tbdatabase, form.Tbport, form.Tbpassword);
string cmdString = @"SELECT shell_glass.shell_glass_id,
shell.shell_name,glass.glass_name,
shell_glass.shell_glass_quantity,
shell_glass.shell_glass_ordernumber,
shell_glass.shell_glass_datetime,
shell_glass.user_id
FROM shell_glass
JOIN shell using (shell_id)
JOIN glass using (glass_id)
WHERE LOWER(glass.glass_name) LIKE @name";
using(MySqlConnection conn = new MySqlConnection(connString))
using(MySqlCommand command = new MySqlCommand(cmdString, conn))
{
conn.Open();
command.Parameters.Add("@name", MySqlDbType.Text).Value = tbSearchGlassOnShell.Text;
MySqlDataReader reader = command.ExecuteReader();
....
}
}
catch(Exception ex)
....
在這里,我洗掉了輸入文本的連接并放置了一個引數占位符以避免 SqlInjection 問題。另請注意,作為一次性物件的連接如何需要包含在 using 陳述句中,以正確清理該物件使用的資源
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/475062.html
