我正在尝试使用数组形式的自定义数据源实现文本框自动完成功能,该阵列显示有关单个字符输入的建议。但是当我运行程序时,自动完成功能仅在第二个字符输入后才开始。当我调试时,我看到AutoCompleteNameCollection中有数据,但是直到第二个字符输入时才显示在建议中。
我在textchange事件中编写了这段代码。
arr = LoadName(empid_txt.Text.Trim()); //arr is string array
namesCollection.AddRange(arr);
this.empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest;
this.empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource;
this.empid_txt.AutoCompleteCustomSource = namesCollection;
在LoadEvent中,我使用一个空数组初始化了AutoCompleteNameCollection。
namesCollection.AddRange(arr);// here arr is empty
empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest;
empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource;
empid_txt.AutoCompleteCustomSource = namesCollection;
但是直到第二个字符输入才起作用。
但是,如果使用数组而不是数组来初始化AutoCompleteNameCollection,例如:namesCollection.Add(“”);它确实适用于单个字符输入,但有时会出现AccessViolationException:尝试读取或写入受保护的内存。
那么有什么办法可以解决这个问题?
最佳答案
加载时,您可以在TextBox
中填充数据的子集(甚至可以缓存以供将来/共享使用)。如果您有“最常见”的计数器,则可以使用它。作为限制条件,您甚至可以添加一个虚拟项目(如果使用空字符串得到的内容是访问冲突)。
然后,在TextChange
事件上,从数据库中读取所需的数据。
我只有一个问题:在用户开始输入之前,您是否不想填充源?如果存在网络流量问题,那么您将移动大量数据。如果您移动大量数据,则您的用户在开始键入内容时将不得不等待。可以接受吗?另一方面,如果他们不等待太多,也许数据流就不会那么大,您可以将该逻辑放在窗体的构造函数中的BackgroundWorker
中(或距离该时间不远)。