none
关于WinForm中textBox自动完成功能的疑问 RRS feed

  • 问题

  • 我使用了textChanged事件,然后发送文本到google请求搜索建议,再将通过正则匹配出的结果输出到一个List中,最后把List的内容加到textBox的自动完成源里面。

    现在的问题是,1.textBox每次输入都会频闪;

                         2.不能一次输入1个以上的字符,比如输入汉字“微软”,则只显示“微”;

                         3.有一定几率报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”;

     

    private
     void
     textBox1_TextChanged(object
     sender, EventArgs e)
    {
    if (textBox1.Text.Trim() != "" )
    {
    textBox3.Text = "" ;
    List<string > sd = GetSearchSuggestion(textBox1.Text.Trim());
    textBox1.AutoCompleteCustomSource.Clear();
    foreach (string k in sd)
    {
    textBox1.AutoCompleteCustomSource.Add(k);
    }
    }
    }

    另外问个问题,就是程序调试时内存占到22M左右,而且随着输入文本还会增长。这是不是说明程序不太合理,占用内存过多,而且没有很好的回收内存资源

    2010年4月26日 12:14

答案

  • 这个是Windows Forms的bug。Shell枚举候选项是在背景线程做的,而Windows Forms没有给候选项做线程安全。你可以重新设计(比如一个文本框加上一个列表框),或者调用IAutoCompleteDropDown

    另外,Google的搜索API记得应该是有频率限制的。如果你的产品很多人使用的话,考虑其他替代的产品。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 Cath_t 2010年4月28日 2:20
    2010年4月26日 16:56
    版主

全部回复

  • 这个是Windows Forms的bug。Shell枚举候选项是在背景线程做的,而Windows Forms没有给候选项做线程安全。你可以重新设计(比如一个文本框加上一个列表框),或者调用IAutoCompleteDropDown

    另外,Google的搜索API记得应该是有频率限制的。如果你的产品很多人使用的话,考虑其他替代的产品。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 Cath_t 2010年4月28日 2:20
    2010年4月26日 16:56
    版主
  • 非常感谢您的回答,自动完成部分我回去参考您给出的接口网页。

    关于google的搜索,我没有使用他的API,而是直接用的HttpWebRequest,不知道有没有限制,从测试情况来看的确存在“连接已断开”的提示。

    搜索建议,我主要考虑图书、音乐、电影方面的提示,您有没有比较好的替代建议。

    2010年4月27日 1:34