【问题标题】:Textbox value will show other textbox information without clicking button文本框值将显示其他文本框信息而无需单击按钮
【发布时间】:2013-12-13 02:47:16
【问题描述】:

这段代码运行良好。但我想在没有点击按钮的情况下搜索数据。当我写员工姓名时,如果它存在于表中,它将显示我的信息,否则我将插入数据。请帮帮我...

protected void btnSubmit_Click(object sender, EventArgs e){
    var sqlQuery = "SELECT EmployeeID, Weight, Amount FROM Supplier where  EmployeeName= '" + TextBox2.Text+ "'";           
    //Create Instance for DataSet
    var DS = new DataSet();
    //Create Instance for SqlConnection
    var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["inventoryConnectionString"].ConnectionString);
    //Create Instance for SqlCommand
    var cmd = new SqlCommand(sqlQuery, conn);


    var DA = new SqlDataAdapter(cmd);
    DS.Clear();
    try{
        DA.Fill(DS);
    }
    catch (Exception ex){}

    foreach (DataRow row in DS.Tables[0].Rows){
        txtBoxId.Text = row["EmployeeID"].ToString();
        txtboxw.Text = row["Weight"].ToString();
        txtboxam.Text = row["Amount"].ToString();       
    }   
}

【问题讨论】:

  • 您是否尝试在文本框上添加事件,例如 ontextchanged
  • 我在很多天前尝试过...但不起作用???
  • 当你按照我建议你尝试的方式尝试时发生了什么
  • 如果您只是说“不工作”,我们将无法帮助您。向我们确切展示您的尝试并告诉我们它是如何不起作用的,然后我们可以为您提供帮助。
  • 如果你在 ontextchanged 上做,你需要把它缓存在某个地方,因为它会使用很多资源

标签: c# asp.net database search textbox


【解决方案1】:

我有不同的方法。假设您的 Supplier 表的内容不经常更改,我建议在页面加载时缓存该表的内容,然后在该文本框中的文本发生更改时仅引用该表。

private DataTable _suppliers;

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
         string sqlQuery = "SELECT EmployeeID, Weight, Amount, EmployeeName FROM Supplier";           
         var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["inventoryConnectionString"].ConnectionString);
         _suppliers = new DataTable();
         var cmd = new SqlCommand(sqlQuery, conn);
         conn.Open();
         var SDA = new SqlDataAdapter(cmd);
         SDA.Fill(_suppliers);
    }
}

protected void TextBox2_TextChanged(object sender, EventArgs e)
{
    DataView DV = new DataView(_suppliers);
    DV.RowFilter = string.Format("EmployeeName LIKE '%{0}%'", TextBox2.Text);

    if (DV.Count == 1)
    {
        var row = DV[0];
        txtBoxId.Text = row["EmployeeID"].ToString();
        txtboxw.Text = row["Weight"].ToString();
        txtboxam.Text = row["Amount"].ToString();
    }
}

此外,您可能希望考虑使用updatepanel 来异步处理文本更改事件,而不是使用TextChanged 事件。

【讨论】:

  • 错误 1 ​​'System.Data.SqlClient.SqlDataAdapter.SqlDataAdapter(System.Data.SqlClient.SqlCommand)' 的最佳重载方法匹配有一些无效参数 D:\My App\keypress\keypress\ key.aspx.cs 21 23 keypress 显示如下错误
  • 我编辑了代码,之前没有真正编译过,所以出现了一些问题
  • 您是否已单步执行代码?当您点击 TextBox2_TextChanged 事件处理程序时,_suppliers 中有什么?
【解决方案2】:

您可以使用TextChanged 事件处理程序和parameterized 查询来保护sql 注入。但是,下面的代码被警告是昂贵的,因为它必须不时访问数据库。

protected void TextBox2_TextChanged(object sender, EventArgs e)
{
   String connString = ConfigurationManager.ConnectionStrings["inventoryConnectionString"].ConnectionString;
   using (SqlConnection con = new SqlConnection(connString))
  {
   con.Open();
   String strSQL = "SELECT EmployeeID, Weight, Amount FROM Supplier where  EmployeeName=@EmployeeName";
   using (SqlCommand cmd = new SqlCommand(strSQL, con)) 
   {
    cmd.Parameters.Add("@EmployeeName", SqlDbType.VarChar).Value = TextBox2.Text;
    using (SqlDataAdapter DA = new SqlDataAdapter(cmd))
     {
        DA.SelectCommand = cmd;
        try
                {
                    DataSet DS = new DataSet();
                    DA.Fill(DS);
                    foreach (DataRow row in DS.Tables[0].Rows)
                    {
                      txtBoxId.Text = row["EmployeeID"].ToString();
                      txtboxw.Text = row["Weight"].ToString();
                      txtboxam.Text = row["Amount"].ToString();
                     }
                }
                catch (Exception ex)
                {
                }
       }
    }
  }
}

但是,您可能只是缓存了整个表,然后从那里进行查询,而不是不时访问数据库,例如:

protected void TextBox2_TextChanged(object sender, EventArgs e)
{

   var query = from myRow in myDataTable.AsEnumerable()
            where r.Field<string>("EmployeeName")==TextBox2.Text
            select new
            {
                EmployeeID = myRow.Field<int>("EmployeeID"),
                Weight = contact.Field<int>("Weight"),
                Amount = order.Field<double>("Amount")
            };
    foreach (var row in query)
    {
       txtBoxId.Text = row.Employee.ToString();
       txtboxw.Text = row.Weight.ToString();
       txtboxam.Text = row.Amount.ToString();
    }
}

【讨论】:

  • 感谢@Marek 投票。上帝保佑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多