我正在尝试使用数组形式的自定义数据源实现文本框自动完成,该数据源显示有关单字符输入的建议。但是当我运行该程序时,自动完成功能仅在第二个字符输入后启动。当我调试时,我看到数据存在于 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: 尝试读取或写入受保护的内存。
那么我有什么办法可以解决这个问题吗?
在事件处理程序中设置 AutoCompleteSource 时,我可以复制访问冲突,看起来自动完成例程可能在替换和销毁 AutoCompleteSource 时访问它。
为了防止这种情况,您可以在代码周围加锁。
lock(this)
{
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;
}
这阻止了访问违规。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)