我有一个自动填充文本框,可以查看数据库。有些时候我在打字时收到了以下错误。
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
这是代码
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键入应用程序,有些人可以建议如何执行此操作。或任何其他有关正在发生的事情的见解
答案 0 :(得分:3)
It is a bug in Windows Forms's wrapper of autocomplete APIs。 Windows窗体不保护AutoCompleteCustomSource对象在被自动完成创建的后台线程枚举时不被替换。
您可以尝试replace the autocomplete object或use 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。