Как я могу динамично изменить автоматические полные записи в поле комбинированного списка C# или текстовом поле?

Google рекомендует размещать его непосредственно внутри головы, а не внутри любого другого HTML-элемента. Зачем? Это лучше для отслеживания вокруг. Чем выше фрагмент страницы, тем быстрее он загружается. В более старой версии Google Tag Manager было рекомендовано размещать фрагмент в теге body, но это потенциально могло бы пропустить отслеживание пользователей, которые покинули вашу страницу до загрузки тега body.

Это стало еще более важным с выпуском нового инструмента Google A / B-тестирования Optimize. Независимо от того, выполняете ли вы тест перенаправления или эксперимент A / B, ускоренная загрузка фрагмента гарантирует, что Optimize загрузит правильную версию страницы, которую должен видеть ваш пользователь, в кратчайшие возможные сроки.

47
задан Community 23 May 2017 в 12:10
поделиться

6 ответов

обновление: главная причина поместить блокировку на это место

его работа :) большая часть "таинственного исключения", которое я когда-либо имею, после этого приема исчезают

<час>
  1. блокировка как в этом коде, может помочь за Вашим исключением
  2. , как Вы упоминаете прежде, существует меньше проблемы с использованием текстового поля
  3. в этом коде, SuggestAppend, хорошо работающий


    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;
            }
        }
    }
0
ответ дан Avram 26 November 2019 в 19:57
поделиться

Я не имею, тестируют это, но это может стоить того, чтобы попытаться.

Вместо того, чтобы очистить двойной буфер 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;
}
1
ответ дан Adam Haile 26 November 2019 в 19:57
поделиться

Я думаю, что Вы могли бы хотеть вынуть отражатель и взгляд на переопределение поведения автоматического заполнения в самом поле комбинированного списка. Я уверен, что автозавершение вызвало бы функцию, которая получает доступ к списку автоматического заполнения. Если можно найти эту функцию и переопределить ее, можно использовать любое поведение, которое Вы хотите.

Видят, какую документацию можно найти на самом классе поля комбинированного списка.

1
ответ дан Spence 26 November 2019 в 19:57
поделиться
if(!textBox3.AutoCompleteCustomSource.Contains(textBox3.Text))
   textBox3.AutoCompleteCustomSource.Add(textBox3.Text);
0
ответ дан 26 November 2019 в 19:57
поделиться

Сэм, вы уже поняли? Я столкнулся с такой же ситуацией. Clear (), кажется, вызывает исключение. Я удалил вызов очистки и получаю правильное событие предложений, хотя коллекция продолжает расти ...

Также, что касается закрытых членов: вы можете получить к ним доступ, используя отражение:

PropertyInfo[] props = [object].GetType().GetProperties({flags go here});
props[0].SetValue(this, new object[] { 0 });
0
ответ дан 26 November 2019 в 19:57
поделиться

Сначала я пришел сюда в поисках решения, но теперь нашел свое.

Уловка состоит не в том, чтобы вызвать 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);
        }
    }
0
ответ дан 26 November 2019 в 19:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: