C# привязка к comboBox без выбранного элемента и популяции текста

У меня вопрос: есть ли способ привязать данные к комбинированному списку без изменения / заполнения selectedItem и текстовых значений? (Я хочу, чтобы поле со списком оставалось пустым)

Это пример того, что я делаю:

        Dictionary<int,string> test = new Dictionary<int,string>();
        test.Add(1, "Company1");
        test.Add(2, "Company2");
        test.Add(3, "Company3");
        test.Add(4, "Company4");
        test.Add(5, "Company5");
        test.Add(6, "Company6");

        var list = test.Select(x => new { CompanyName = x.Value }).ToList();

        comboBox1.DataSource = list;
        comboBox1.DisplayMember = "CompanyName";
        comboBox1.ValueMember = "CompanyName";
        comboBox1.SelectedItem = null;

Если вы запустите этот код, он будет работать нормально, потому что он загружается так быстро, что кажется, что поле со списком остается пустым.

Однако, если вы пройдете по коду, вы увидите, что значения SelectedItem и Text изменяются, когда DataSource назначается "list".

Мой фактический запрос LINQ немного больше и, следовательно, медленнее загружается. Мой comboBox "мигает" текстовое значение, прежде чем оно будет очищено, и я хочу удалить эту уродливую вспышку.

Я пробовал разные комбинации установки значений SelectedItem и Text в null (или "") до и после назначения DataSource, но я не могу заставить "flash" исчезнуть.

Любые предложения с благодарностью! знак равно

РЕДАКТИРОВАТЬ: Я также хочу добавить, что это происходит только при начальной загрузке формы... Если я изменяю источник привязки, а затем возвращаюсь к исходному (снова запускаю тот же код), он не "мигает"... Не уверен, если это помогает или имеет значение...

6 ответов

Решение

Еще одно простое предложение - добавить пустое CompanyName в качестве первого элемента в списке.

list.Insert(0, "");

Добавьте нулевую ссылку в ваш список в качестве первого элемента списка перед установкой comboBox1.DataSource.

 var list = test.Select(x => new { CompanyName = x.Value }).ToList();
 list.Insert(0, null);
 comboBox1.DataSource = list;

Попробуйте использовать comboBox1.SuspendLayout() а также comboBox1.ResumeLayout() вокруг вашего кода привязки данных. Первый должен вообще не допускать обновления, пока не будет вызван второй.

Это сработало для меня: удаление привязок, а затем их повторное добавление после установки DataSource:

Binding[] bindings = new Binding[combo.DataBindings.Count];
combo.DataBindings.CopyTo(bindings, 0);
combo.DataBindings.Clear();
combo.DataSource = datasource;
combo.SelectedIndex = -1;
foreach (Binding b in bindings)
{
    combo.DataBindings.Add(b);
}

Я столкнулся с той же проблемой, но я не мог добавить пустой элемент, поэтому я сделал следующее:

comboBox.ForeColor = comboBox.BackColor;
//set the combobox datasource
comboBox.ForeColor = SystemColors.WindowText;

Это делает поле со списком пустым при настройке источника данных без добавления пустого элемента.

Мое решение этой проблемы заключалось в том, чтобы добавить источник данных в конструктор формы, а затем в form_Load изменить его на null, после этого, когда я устанавливаю источник данных со своим списком, текст в поле со списком остается пустым

Другие вопросы по тегам