ComboBox items.count does не соответствует источнику данных (C#)

Ваша ссылка требует входа в систему.

Если я угадаю вашу проблему, это может быть связано с проблемой углового обзора. вместо этого попробуйте изменить привязку ng-модели к свойству объекта. поэтому в вашем html вместо:


сделайте это


, а в вашем javascript при обратном вызове ajax измените его на:

$scope.course = {};  //only do this if $scope.course has not already been declared
$scope.course.edit_course_name = thecourse.course_name;

для получения дополнительной информации по этому вопросу см .: https://github.com/angular/angular.js/wiki/Understanding-Scopes

.

9
задан Sildoreth 3 April 2015 в 20:52
поделиться

9 ответов

If anyone experiences this problem on a dynamically added combobox, the answer is to ensure that you add the combobox to the controls of a container in the form.

By adding "this.Controls.Add(cbo);" to the code before setting the datasource, the problem goes away.

7
ответ дан 4 December 2019 в 08:02
поделиться

Этот код создает для меня 2 в окне сообщения, может вы попробуете и посмотрите, как он себя ведет?

Вы можете вставить его в консольное приложение и добавить ссылку на System.Windows.Forms и System.Drawing .

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Drawing;

namespace SO887803
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.Run(new MainForm());
        }
    }

    public partial class MainForm : Form
    {
        private Button _Button;
        private ComboBox _ComboBox;

        public MainForm()
        {
            _Button = new Button();
            _Button.Text = "Test";
            _Button.Location = new Point(8, 8);
            _Button.Click += _Button_Click;
            Controls.Add(_Button);

            _ComboBox = new ComboBox();
            _ComboBox.Location = new Point(8, 40);
            Controls.Add(_ComboBox);
        }

        private void _Button_Click(object sender, EventArgs e)
        {
            List<Item> items = new List<Item>();
            items.Add(new Item("A", "a"));
            items.Add(new Item("B", "b"));

            _ComboBox.DataSource = null;
            _ComboBox.DataSource = items;
            _ComboBox.DisplayMember = "Title";
            _ComboBox.ValueMember = "Value";
            MessageBox.Show("count: " + _ComboBox.Items.Count);
        }

        public class Item
        {
            public String Title { get; set; }
            public String Value { get; set; }
            public Item(String title, String value)
            {
                Title = title;
                Value = value;
            }
        }
    }
}
0
ответ дан 4 December 2019 в 08:02
поделиться

comboBox1.DataSource = somelist;

int c1 = comboBox1.DataSource.Count; // все еще ноль

BindingContext dummy = this.comboBox1.BindingContext; // Принудительное обновление СЕЙЧАС!

int c2 = comboBox1.DataSource.Count; // теперь он равен somelist.Count

0
ответ дан 4 December 2019 в 08:02
поделиться

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

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

12
ответ дан 4 December 2019 в 08:02
поделиться

Чтобы уточнить, вызываете ли вы метод count () После вызова метода databind ()

0
ответ дан 4 December 2019 в 08:02
поделиться

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

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

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

5
ответ дан 4 December 2019 в 08:02
поделиться

Ба салам,

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

Пример:

comboBox1.performLayout ();

с уважением Mohsen s

-1
ответ дан 4 December 2019 в 08:02
поделиться

попробуйте это:

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);

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

-1
ответ дан 4 December 2019 в 08:02
поделиться

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

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

Например

cbo.DataSource = null;

cbo.Items.Clear ();

cbo.DataSource = cbos;

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

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

0
ответ дан 4 December 2019 в 08:02
поделиться
Другие вопросы по тегам:

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