ComboBox items.count не соответствует источнику данных (C #) - PullRequest
8 голосов
/ 20 мая 2009

У меня есть ComboBox, который связан с источником данных. Я хочу динамически добавлять элементы в ComboBox на основе определенных условий. Итак, я добавил параметры в новый список, а затем изменил источник данных ComboBox следующим образом:

cbo.DataSource = null;
cbo.DataSource = cbos;
cbo.DisplayMember = "Title";
cbo.ValueMember = "Value";

Затем я проверяю cbo.Items.Count, и он не увеличился - он не равен количеству источника данных. Есть идеи, что я могу сделать здесь? Обратите внимание, что это WinForms, а не asp.net.

Спасибо

Ответы [ 13 ]

12 голосов
/ 20 мая 2009

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

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

6 голосов
/ 10 ноября 2009

Если кто-то сталкивается с этой проблемой в динамически добавляемом комбинированном ящике, ответ заключается в том, чтобы добавить этот комбинированный список к элементам управления контейнера в форме.

Путем добавления «this.Controls.Add (cbo);» код до установки источника данных, проблема исчезает.

5 голосов
/ 20 мая 2009

Я нашел причину ...

Я вынул строку cbo.Datasource = null .. и добавил cbo.Invalidate () в конце. Это решило проблему.

Спасибо всем за совет.

4 голосов
/ 21 июля 2011
cbo.DataSource = null; 
cbo.DataSource = cbos; 
cbo.DisplayMember = "Title"; 
cbo.ValueMember = "Value"; 

Теперь, прежде чем установить cbo.SelectedValue или полагаться на Items как актуальную, позвоните

cbo.CreateControl ;

и Items будут пересчитаны.

Проблема в том, что SelectedValue / SelectedIndex, которые являются свойствами WinForms, принимают только допустимые значения в соответствии со списком Items, но это значение создается только после взаимодействия с графическим интерфейсом, то есть после создания экземпляра настоящий "комбинированный блок Windows GUI, т.е. после получения дескриптора Windows для комбинированного списка.

CreateControl вызывает создание дескриптора Windows, несмотря ни на что.

0 голосов
/ 13 декабря 2018

Попробуйте этот код.

cbo.BindingContext = new BindingContext();
cbo.DataSource = null;
cbo.DataSource = cbos;
cbo.DisplayMember = "Title";
cbo.ValueMember = "Value";

Возможно BindingContext вашего ComboBox имеет значение null.

0 голосов
/ 14 февраля 2017
 ComboBox cbNew = new ComboBox();
    cbNew.Name = "cbLine" + (i+1);
    cbNew.Size = cbLine1.Size;
    cbNew.Location = new Point(cbLine1.Location.X, cbLine1.Location.Y + 26*i);
    cbNew.Enabled = false;
    cbNew.DropDownStyle = ComboBoxStyle.DropDownList;
    cbNew.DataSource = DBLayer.GetTeams(lineName).Tables[0];
    cbNew.DisplayMember = "teamdesc";
    cbNew.ValueMember = "id";
    Console.WriteLine("ComboBox {0}, itemcount={1}", cbNew.Name, cbNew.Items.Count);
        // The output displays itemcount = 0 for run-time created controls
        // and >0 for controls created at design-time
    gbLines.Controls.Add(cbNew);

К

 ComboBox cbNew = new ComboBox();
    cbNew.Name = "cbLine" + (i+1);
    cbNew.Size = cbLine1.Size;
    cbNew.Location = new Point(cbLine1.Location.X, cbLine1.Location.Y + 26*i);
    cbNew.Enabled = false;
    cbNew.DropDownStyle = ComboBoxStyle.DropDownList;
    Console.WriteLine("ComboBox {0}, itemcount={1}", cbNew.Name, cbNew.Items.Count);
        // The output displays itemcount = 0 for run-time created controls
        // and >0 for controls created at design-time
    gbLines.Controls.Add(cbNew);
    cbNew.DataSource = DBLayer.GetTeams(lineName).Tables[0];
    cbNew.DisplayMember = "teamdesc";
    cbNew.ValueMember = "id";

Свойства DataSource, DisplayMember и ValueMember должны быть установлены после добавления элемента управления в его контейнер.

0 голосов
/ 11 октября 2016

Старый поток, но я попробовал некоторые из этих решений, наряду с приостановкой / возобновлением привязки контекста, привязкой и сбросом источника привязки и простой перезагрузкой формы. Никто не работал, чтобы обновить мой элемент управления новыми привязанными данными во время моей настройки .datasource (мой items.count был пуст, как и OP).

Затем я понял, что мой комбинированный список был на вкладке, которая удалялась в начале кода, а затем снова добавлялась (после моей привязки данных). Событие привязки не происходило до тех пор, пока вкладка не была повторно добавлена.

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

0 голосов
/ 12 августа 2009

У меня была такая же проблема (я работаю с VS 2005).

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

Например

cbo.DataSource = null;

cbo.Items.Clear ();

cbo.DataSource = cbos;

cbo.DisplayMember = "Заголовок";

cbo.ValueMember = "Значение";

0 голосов
/ 25 июля 2009

пожалуйста, попробуйте это:

cbo.Parent = <your panel control>;
cbo.DataSource = null; 
cbo.DataSource = cbos; cbo.DisplayMember = "Title"; 
cbo.ValueMember = "Value";
MessageBox.Show(string.Format("itemcount is {0}", cbo.Items.Count);

Я думаю, что ваш вопрос такой же, как я встречал сегодня.

0 голосов
/ 01 июля 2009

ба салам,

вы можете просто обновить пользовательский интерфейс с помощью функции preformLayout ();

Пример:

comboBox1.performLayout ();

С уважением Мохсен с

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...