刷新文本更改事件上的文本框
本文关键字:文本 刷新 事件 | 更新日期: 2023-09-27 17:56:13
private void txtItems_TextChanged(object sender, EventArgs e)
{
try
{
MySqlCommand com = new MySqlCommand();
MySqlDataReader read;
com.CommandText = "SELECT * FROM Inventory where ProductID ='" + txtbCode.Text + "'";
com.Connection = MySQLConnection.con;
MySQLConnection.con.Open();
read = com.ExecuteReader();
while (read.Read())
{
txtCatogery.Text = read["Catogery"].ToString();
txtDiscriptions.Text = read["Description"].ToString();
txtQTY.Text = read["QTY"].ToString();
txtPrice.Text = read["Price"].ToString();
}
//Rest of code
}
}
当我在txtbCode
中键入条形码时,文本框会从 db 中获取值,但是如果我有一个带有条形码的产品1234
继续键入 56 (123456),我没有带有该条形码的产品,但文本框的值不会刷新,它们保留大约读取的值 1234。
我该如何实现?
这段代码有多个问题,但要回答你的主要问题,这是因为你的while (read.Read())
行。 如果他们查询返回0
行,则while statement
将永远不会执行。
如果期望单行,则应改为将其设置为if (read.Read())
,并添加else
条件以清除文本框。
您可能想要研究的其他问题是确保在使用完读取器后释放读取器,以及使用参数而不是将用户输入直接嵌入到查询中。
首先,你应该参数化你的查询 - 参见 Sql 注入。
关于您的问题,您应该在查询数据库之前清除以前的值,因为在当前代码中,只有在 Read() 成功时才更新文本框(例如,您在数据库中有一行)......但是,如果您没有行,它将不会更新,并且以前的条目将保留。
private void txtbCode_TextChanged(object sender, EventArgs e)
{
txtCatogery.Text = String.Empty;
txtDiscriptions.Text = String.Empty;
...
try
{
MySqlCommand com = new MySqlCommand();
MySqlDataReader read;
.....
您应该检查查询中的返回值,如果没有返回任何值,请清除Textboxes
MySQLConnection.con.Open();
read = com.ExecuteReader();
if(read != null)
{
while (read.Read())
{
txtCatogery.Text = read["Catogery"].ToString();
txtDiscriptions.Text = read["Description"].ToString();
txtQTY.Text = read["QTY"].ToString();
txtPrice.Text = read["Price"].ToString();
}
}
else
{
txtCatogery.Text = "";
txtDiscriptions.Text = "";
txtQTY.Text = "";
txtPrice.Text = "";
}
请记住,您的代码可能会产生一些错误,例如,如果从数据库返回多条记录,您的TextBoxes
将仅显示最后的记录数据。如果任何记录具有空字段,它将由于您的.ToString()
而生成错误。最后,SQL injection
是一个主要威胁,除非您编写此代码进行学习。
您可以使用.HasRows
,然后才能.Read()
...
MySqlDataReader read = cmd.ExecuteReader();
if (read.HasRows)
{
while (read.Read())
{
//Do Stuff
}
}
else
{
//Do Stuff
txtPrice.Clear();
}