自动完成文本框错误 - 写入受保护的内存

时间:2010-06-10 20:02:52

标签: c# memory-management textbox autocomplete c#-2.0

我有一个自动填充文本框,可以查看数据库。有些时候我在打字时收到了以下错误。

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

这是代码

private void tBSearchName_TextChanged(object sender, EventArgs e)
            {
                try
                {
                    //test length
                    if (tBSearchName.Text.Length > 3)
                    {
                        //prevent db lookups
                        if (!tBSearchName.Text.ToLower().Contains(oldName) || oldName == String.Empty)
                        {
                            //test for a name + first letter of last name
                            if (Regex.IsMatch(tBSearchName.Text, @"(\w)+\s(\w)+(\.)*"))
                            {
                                tBSearchName.AutoCompleteCustomSource = AccessDB.serachByNemberName(tBSearchName.Text);
                                tBSearchName.AutoCompleteMode = AutoCompleteMode.Suggest;
                                //prevent db lookups
                                oldName = tBSearchName.Text.ToLower();
                            }
                        }
                    }
                }
                catch
                {
                }
            } 

我的见解是,我应该在搜索完成时将frezz键入应用程序,有些人可以建议如何执行此操作。或任何其他有关正在发生的事情的见解

2 个答案:

答案 0 :(得分:3)

It is a bug in Windows Forms's wrapper of autocomplete APIs。 Windows窗体不保护AutoCompleteCustomSource对象在被自动完成创建的后台线程枚举时不被替换。

您可以尝试replace the autocomplete objectuse the IAutoCompleteDropDown interface to reset the enumerator

,而不是替换数据存储

答案 1 :(得分:-1)

您可以使用lock

private void tBSearchName_TextChanged(object sender, EventArgs e)
{
    lock(this) { /* do magic */
}

请注意,在事件处理程序中执行长任务是不好的做法。如果搜索时间超过30毫秒,最好使用worker thread