文本框中的自动完成文本

Posted

技术标签:

【中文标题】文本框中的自动完成文本【英文标题】:Autocomplete text in textbox 【发布时间】:2020-12-15 07:12:16 【问题描述】:

每次我在文本框中输入一个字符时,文本框中都应该有一个关于以用户输入的字母开头的名称的建议。我将提供我尝试运行程序时发生的错误的图像

private void View_Load(object sender, EventArgs e)

    string maincon = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;
    SqlConnection con = new SqlConnection(maincon);
    string sqlquery = "select firstname from [dbo].[tbl_registerStudent]";
    SqlCommand sqlcom = new SqlCommand(sqlquery, con);
    con.Open();
    SqlDataReader sdr = sqlcom.ExecuteReader();
    AutoCompleteStringCollection autotext = new AutoCompleteStringCollection();
    while (sdr.Read())
    
        autotext.Add(sdr.GetString(0));
        textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
        textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
        textBox1.AutoCompleteCustomSource = autotext;
        con.Close();
    

【问题讨论】:

这能回答你的问题吗? Auto-Complete in textbox using data from a SQL Server database 您不应该在while (sdr.read()) 循环内关闭连接 - 将其移出循环 这是大错特错 嗨@tbhaxor 我会尝试阅读这个问题,看看它是否会回答我的问题。谢谢推荐! 嗨@Quercus 谢谢你的小提示。非常感谢! 【参考方案1】:

while 循环中移动con.Close()

while (sdr.Read())

    autotext.Add(sdr.GetString(0));

con.Close();
textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
textBox1.AutoCompleteCustomSource = autotext;

【讨论】:

谢谢@user2250152 这解决了我的问题! 哦,是的,谢谢。我是新人,这就是为什么我不知道要标记它有人回答了我的问题。再次感谢您 我认为只有第一行需要在循环内,其余的可以放在循环外。【参考方案2】:

不要Close 手动,而是将IDisposable 包装成using。要么

private void View_Load(object sender, EventArgs e) 
  AutoCompleteStringCollection autotext = new AutoCompleteStringCollection();

  string maincon = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;

  using (SqlConnection con = new SqlConnection(maincon)) 
    con.Open();
 
    string sqlquery = 
      @"select firstname 
          from [dbo].[tbl_registerStudent]";
    
    using(SqlCommand sqlcom = new SqlCommand(sqlquery, con)) 
      using (SqlDataReader sdr = sqlcom.ExecuteReader()) 
        while (sdr.Read())
          autotext.Add(sdr.GetString(0));
        
    
  

  textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
  textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
  textBox1.AutoCompleteCustomSource = autotext;

或者从 c# 8.0 开始你可以摆脱讨厌的...:

private void View_Load(object sender, EventArgs e) 
  string maincon = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;
 
  using SqlConnection con = new SqlConnection(maincon);
  
  con.Open();
 
  string sqlquery = 
    @"select firstname 
        from [dbo].[tbl_registerStudent]";
    
  using SqlCommand sqlcom = new SqlCommand(sqlquery, con);
  using SqlDataReader sdr = sqlcom.ExecuteReader();

  AutoCompleteStringCollection autotext = new AutoCompleteStringCollection();

  while (sdr.Read())
    autotext.Add(sdr.GetString(0));

  textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
  textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
  textBox1.AutoCompleteCustomSource = autotext;

【讨论】:

以上是关于文本框中的自动完成文本的主要内容,如果未能解决你的问题,请参考以下文章

文本框中的自动完成 json

如何仅在多个自动完成文本框中的前 2 个字符之后才开始自动完成?

如何从自动完成文本框中单击名称?

处理文本框中的自动完成。不同于按回车

如果文本框中没有文本,jQuery 自动完成返回空列表

如何动态更改 C# 组合框或文本框中的自动完成条目?