gpt4 book ai didi

c# - 动态更改文本框的自动完成列表会导致 AccessViolationException,有什么建议吗?

转载 作者:太空狗 更新时间:2023-10-29 17:51:04 24 4
gpt4 key购买 nike

我的客户希望在应用程序的客户表单中有一个文本框,它为开始的街道名称提供适用的结尾。他开始键入街道名称,文本框提供了一个街道列表,列表以他在文本框中键入的字符序列开头。

我对自己说:没关系,文本框具有 AutoCompleteCustomSource 属性,即使常见街道名称的列表比开始时预填的要长,我也可以通过查询访问数据库,填充一个AutoCompleteStringCollection 并将其显示给用户。

事情是这样的:如果我在每次按键/按下时都填充列表,程序就会崩溃并抛出 AccessViolationException。

我发现那是因为:控件正在显示自动完成列表的同时被修改,导致崩溃。

当您刷新自动完成列表时,将使用新指针重新创建控件。键盘和鼠标事件(KeyPress、MouseOver、MouseLeave、MouseHover)尝试引用旧控件的指针,这些指针现在在内存中无效,导致发生内存访问冲突。

一旦在窗口上设置了自动完成候选列表对象,底层的自动完成实现就不允许更改它。为了允许更改列表,WinForms 销毁 Edit 控件或 ComboBox 并重新创建它。如果底层控件在自动完成窗口仍在使用它时被销毁,这将导致异常。

我在 MSDN 上读到过这个, 他们的决议:

Do not modify the AutoComplete candidate list dynamically during key events.

我还尝试了 this 中的所有内容线程

那么,如果我坚持逐个按键地提供适用的街道名称,我怎么能完成这项工作呢?

注意:我知道您可以通过创建自定义控件等来做到这一点,但是仅凭纯编码技巧就可以做到吗?

最佳答案

这是可能的!!!大约 3 个小时的搜索,根据这篇文章中的信息,我找到了解决方案。您必须从 AutoCompleteCustomSource(或 ComboBox.Items)中删除几乎所有元素,然后使用 AddRange() 并最终删除索引为 0 的项目:

private void comboBox1_PreviewKeyDown(...) {
while (comboBox1.Items.Count > 1) {
comboBox1.Items.RemoveAt(comboBox1.Items.Count - 1);
}
comboBox1.Items.AddRange(<your_new_items>);
comboBox1.Items.RemoveAt(0);
}

但是这种方法太慢了(在自动完成时间),可能是因为你必须一个一个地删除元素。对不起我的英语。

关于c# - 动态更改文本框的自动完成列表会导致 AccessViolationException,有什么建议吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8779557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com