根据一个文本框值自动填充数据库中的文本框

时间:2014-02-18 11:21:32

标签: c# database winforms textbox

我有一个简单的表单,其中有3个文本框,如下图所示: enter image description here

在textchanged事件上使用autocompelete函数,我在textbox1(人名)中显示数据库中的数据。现在,如果您的用户从建议项目中选择特定名称,我想根据textbox1中的值自动填充数据库中的textbox2和textbox3。 我该怎么做?

textbox1代码:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    AutoCompleteStringCollection namesCollection = new AutoCompleteStringCollection();
    SqlConnection con = new SqlConnection(@"***my connection string***");
    con.Open();
    SqlCommand cmnd = con.CreateCommand();
    cmnd.CommandType = CommandType.Text;
    cmnd.CommandText = "SELECT * FROM tblTicketDetail";
    SqlDataReader dReader;
    dReader = cmnd.ExecuteReader();

    if (dReader.Read())
    {
        while (dReader.Read())
            namesCollection.Add(dReader["ContactPerson"].ToString());
    }
    else
    {
        MessageBox.Show("Data not found");
    }
    dReader.Close();

    textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
    textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
    textBox1.AutoCompleteCustomSource = namesCollection;
}

现在如何自动填充textbox2和textbox3?

问候。

4 个答案:

答案 0 :(得分:2)

    try
    {
        int i = Convert.ToInt32(CBCompanies.SelectedValue.ToString());
        DataTable td = new DataTable();
        da = new SqlDataAdapter("select * from tblCustomerCompany where CustomerID =" + CBCompanies.SelectedValue.ToString() + "  ORDER BY CustomerName", conn);
        conn.Open();
        da.Fill(td);
        conn.Close();
        textBox3.Text = td.Rows[0].ItemArray[5].ToString();
    }
    catch { }  

答案 1 :(得分:1)

您可以在表单加载中使用此工作来填充联系人列表,然后在选择更改中检查此联系人是否存在并显示其他详细信息

private Class Contact
{
    public String Name { get; set; }
    public String Number{ get; set; }
    public String Mail { get; set; }
}

List<Contact> _listContact = new List<Contact>();
private void Form_Load(object sender, EventArgs e)
{
  AutoCompleteStringCollection namesCollection = new AutoCompleteStringCollection();
  SqlConnection con = new SqlConnection(@"***my connection string***");
  con.Open();
  SqlCommand cmnd = con.CreateCommand();
  cmnd.CommandType = CommandType.Text;
  cmnd.CommandText = "SELECT * FROM tblTicketDetail";        
  SqlDataReader dReader;
  dReader = cmnd.ExecuteReader();

  if (dReader.Read())
   {
     while (dReader.Read())
     {
        namesCollection.Add(dReader["ContactPerson"].ToString());
        Contact cont = Contact{Name = dReader["ContactPerson"].ToString(),
                              Number = dReader["ContactNumber"].ToString()
                              Mail = dReader["ContactMail"].ToString() }
        _listContact.add(cont);
     }
   }
  else
   {
      MessageBox.Show("Data not found");
   }
  dReader.Close();

}

然后在你的textBox1_TextChanged

private void textBox1_TextChanged(object sender, EventArgs e)
{
   if( _listContact.Contain(sender.Text))
   {
      textbox2.Text = _listContact[sender.Text].Number;
      textbox3.Text = _listContact[sender.Text].Mail;
   }
}

答案 2 :(得分:0)

就像有人说在代码中直接查询不是一个好习惯。但无论如何阻止你在查询中添加where子句的原因。另外我假设您只需要第一条记录,在这种情况下,根据我的修改,您的namesCollection对象将只包含1个值。例如:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    AutoCompleteStringCollection namesCollection = new AutoCompleteStringCollection();
    SqlConnection con = new SqlConnection(@"***my connection string***");
    con.Open();
    SqlCommand cmnd = con.CreateCommand();
    cmnd.CommandType = CommandType.Text;

    //Changed code here
    cmnd.CommandText = "SELECT TOP 1 * FROM tblTicketDetail where LOWER(name) = LOWER('" + textBox1.Text + "')";
    SqlDataReader dReader;
    dReader = cmnd.ExecuteReader();

    if (dReader.Read())
    {
        while (dReader.Read())
        {
            namesCollection.Add(dReader["ContactPerson"].ToString());

            //Added code here
            textBox2.Text = dReader["Number"].ToString();
            textBox3.Text = dReader["email"].ToString();
        }
    }
    else
    {
        MessageBox.Show("Data not found");
    }
    dReader.Close();

    textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
    textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
    textBox1.AutoCompleteCustomSource = namesCollection;
}

如果这不是您想要的,那么请详细说明您的问题。

希望这有帮助

答案 3 :(得分:0)

1。 您可以修改代码并应用LINQ。它更容易处理,然后编写旧的查询字符串。

2。 在结束数据库操作后始终关闭连接

3。 缓存DB数据可能在主窗体创建的构造函数中或在其Loaded事件中。 然后,您可以非常快速地访问内存中对象的数据