Google рекомендует размещать его непосредственно внутри головы, а не внутри любого другого HTML-элемента. Зачем? Это лучше для отслеживания вокруг. Чем выше фрагмент страницы, тем быстрее он загружается. В более старой версии Google Tag Manager было рекомендовано размещать фрагмент в теге body, но это потенциально могло бы пропустить отслеживание пользователей, которые покинули вашу страницу до загрузки тега body.
Это стало еще более важным с выпуском нового инструмента Google A / B-тестирования Optimize. Независимо от того, выполняете ли вы тест перенаправления или эксперимент A / B, ускоренная загрузка фрагмента гарантирует, что Optimize загрузит правильную версию страницы, которую должен видеть ваш пользователь, в кратчайшие возможные сроки.
обновление: главная причина поместить блокировку на это место
его работа :) большая часть "таинственного исключения", которое я когда-либо имею, после этого приема исчезают
private void Form1_Load(object sender, EventArgs e)
{
textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
textBox1.TextChanged+=new EventHandler(textBox1_TextChanged);
col1.AddRange(new string[] { "avi avi", "avram avram" });
col2.AddRange(new string[] { "boria boria", "boris boris" });
textBox1.AutoCompleteCustomSource = col1;
textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
}
AutoCompleteStringCollection col1 = new AutoCompleteStringCollection();
AutoCompleteStringCollection col2 = new AutoCompleteStringCollection();
object locker = new object();
private void textBox1_TextChanged(object sender, EventArgs e)
{
lock (locker)
{
if (textBox1.Text.StartsWith("a") && textBox1.AutoCompleteCustomSource != col1)
{
textBox1.AutoCompleteCustomSource = col1;
}
if (textBox1.Text.StartsWith("b") && textBox1.AutoCompleteCustomSource != col2)
{
textBox1.AutoCompleteCustomSource = col2;
}
}
}
Я не имею, тестируют это, но это может стоить того, чтобы попытаться.
Вместо того, чтобы очистить двойной буфер AutoCompleteCustomSource, путем хранения двух экземпляров. Когда текст изменяется, назовите GetNameSuggestions () и создайте строки для той, которая это в настоящее время не используется, затем установило ComboName. AutoCompleteCustomSource к тому Вы просто настраиваете.
я думаю, что это должно выглядеть примерно так.
AutoCompleteCustomSource accs_a;
AutoCompleteCustomSource accs_b;
bool accs_check = true; //true for accs_a, false for accs_b
void InitializeComboBox()
{
ComboName.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
ComboName.AutoCompleteSource = AutoCompleteSource.CustomSource;
accs_a = new AutoCompleteStringCollection();
accs_b = new AutoCompleteStringCollection();
ComboName.AutoCompleteCustomSource = accs_a;
ComboName.TextChanged += new EventHandler( ComboName_TextChanged );
}
void ComboName_TextChanged( object sender, EventArgs e )
{
string text = this.ComboName.Text;
if(accs_check)
{
accs_b.Clear();
accs_b.AddRange(GetNameSuggestions( text ));
accs_check = false;
}
else
{
accs_a.Clear();
accs_a.AddRange(GetNameSuggestions( text ));
accs_check = true;
}
this.ComboQuery.AutoCompleteCustomSource = accs_check? accs_a : accs_b;
}
Я думаю, что Вы могли бы хотеть вынуть отражатель и взгляд на переопределение поведения автоматического заполнения в самом поле комбинированного списка. Я уверен, что автозавершение вызвало бы функцию, которая получает доступ к списку автоматического заполнения. Если можно найти эту функцию и переопределить ее, можно использовать любое поведение, которое Вы хотите.
Видят, какую документацию можно найти на самом классе поля комбинированного списка.
if(!textBox3.AutoCompleteCustomSource.Contains(textBox3.Text))
textBox3.AutoCompleteCustomSource.Add(textBox3.Text);
Сэм, вы уже поняли? Я столкнулся с такой же ситуацией. Clear (), кажется, вызывает исключение. Я удалил вызов очистки и получаю правильное событие предложений, хотя коллекция продолжает расти ...
Также, что касается закрытых членов: вы можете получить к ним доступ, используя отражение:
PropertyInfo[] props = [object].GetType().GetProperties({flags go here});
props[0].SetValue(this, new object[] { 0 });
Сначала я пришел сюда в поисках решения, но теперь нашел свое.
Уловка состоит не в том, чтобы вызвать Clear () для AutoCompleteCustomSource, а в том, чтобы удалить все элементы в цикле for, а затем перестроить список с новыми данными. В моем случае (приложение для сбора книг) я беру имена авторов из базы данных с определенной начальной буквой, а не целиком. Обратите внимание, что это будет работать только в том случае, если часть текстового поля в поле со списком пуста или стала пустой.
private void cboAuthor_KeyDown(object sender, KeyEventArgs e)
{
if (cboAuthor.Text.Length == 0)
{
// Next two lines simple load data from the database in the
// into a collection (var gateway), base on first letter in
// the combobox. This is specific to my app.
var gateway = new AuthorTableGateway();
gateway.LoadByFirstLetter(Char.ConvertFromUtf32(e.KeyValue)[0]);
// Clear current source without calling Clear()
for (int i = 0; i < authorsAutoComplete.Count; i++)
authorsAutoComplete.RemoveAt(0);
// Rebuild with new data
foreach (var author in gateway)
authorsAutoComplete.Add(author.AuthorName);
}
}