我有一个简单的表单,其中有3个文本框,如下图所示:
在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?
问候。
答案 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事件中。 然后,您可以非常快速地访问内存中对象的数据