刷新文本更改事件上的文本框

本文关键字:文本 刷新 事件 | 更新日期: 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();
}