You each time you change the textBox parse json. Do not you think that it is expensive? Parse it once and remember (create a separate field).
Further, on the substitution problem. Most likely, the mod SuggestAppend . And he, in conjunction with the dynamic change AutoCompleteCustomSource textBox'a due to its mechanism gives just such a problem. If you don’t need to add the word in the textbox itself, and only need a list, you can change the mod to Suggest . If this behavior does not fit, then in your case, AutoCompleteCustomSource can be changed only once: when the textBox text has become more than 3 characters. You can try the following method:
public Form1() { InitializeComponent(); textBox3.AutoCompleteMode = AutoCompleteMode.SuggestAppend; textBox3.AutoCompleteSource = AutoCompleteSource.CustomSource; textBox3.AutoCompleteCustomSource = EmptyAutoCompleteCustomSource; } private AutoCompleteStringCollection EmptyAutoCompleteCustomSource { get; set; } = new AutoCompleteStringCollection(); private AutoCompleteStringCollection AutoCompleteCustomSource { get; set; } private AutoCompleteStringCollection CreateAutoCompleteCustomSource() { AutoCompleteStringCollection source = new AutoCompleteStringCollection(); var results = JsonConvert.DeserializeObject<dynamic>(txb); foreach(var element in results) source.Add((string)element.name); return source; } private void UpdateAutoCompleteCustomSource() => AutoCompleteCustomSource = CreateAutoCompleteCustomSource(); private void EnsureAutoCompleteCustomSource() { if(AutoCompleteCustomSource == null) UpdateAutoCompleteCustomSource(); } private void textBox3_TextChanged(object sender, EventArgs e) { TextBox t = sender as TextBox; if(t != null) { // Проверки на textBox3.AutoCompleteCustomSource нужны, чтобы изменение AutoCompleteCustomSource // было один раз при выполнении данного условия if(t.Text.Length >= 3 && textBox3.AutoCompleteCustomSource == EmptyAutoCompleteCustomSource) { EnsureAutoCompleteCustomSource(); textBox3.AutoCompleteCustomSource = AutoCompleteCustomSource; } else if(t.Text.Length < 3 && textBox3.AutoCompleteCustomSource == AutoCompleteCustomSource) textBox3.AutoCompleteCustomSource = EmptyAutoCompleteCustomSource; } }