I am trying to implement a textbox autocomplete with a custom datasource in the form of an array which shows suggestions on single character input. But when i run the program the autocomplete only starts after the second character input. When i debugged i saw that datas are there in the AutoCompleteNameCollection but it is not showing in the suggestion until the second character input.
This code i have written in the textchange event.
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;
In the LoadEvent I have initialized the AutoCompleteNameCollection with an empty array.
namesCollection.AddRange(arr);// here arr is empty
empid_txt.AutoCompleteMode = AutoCompleteMode.Suggest;
empid_txt.AutoCompleteSource = AutoCompleteSource.CustomSource;
empid_txt.AutoCompleteCustomSource = namesCollection;
But it does’t work until the second character input.
However if instead of an array i initialize the AutoCompleteNameCollection with an empty string like : namesCollection.Add(“”); it does work for the single character input but some times it gives AccessViolationException: Attempted to read or write protected memory.
So is there any way i can solve this problem?
On load you may populate the
TextBoxwith a sub-set of your data (that can be even cached for future/shared use). If you have a “most common” counter you can use it. As limit condition you may even add a dummy item (if what you get with an empty string is an access violation).Then, on the
TextChangeevent read the data you need from the database.I have only one question: you do not want to populate the source until the user starts to type? If there’s the problem of network traffic then you move a lot of data. If you move a lot of data then your users will have to wait when they start to type something. Is it acceptable? On the other side if they do not wait too much maybe data stream is not so big and you can put that logic in a
BackgroundWorkerin the constructor of your form (or not far from that time).