Измените SelectedValue поля со списком перед его отображением

Проблема странная, у меня есть поле со списком, которое правильно заполнено элементами через свойства DataSource (оно привязывается к элементу bindingSource, который содержит элемент отображения и элемент значения), это простое поле со списком, которое позволяет мне выбирать поставщиков, выбирая между их имена, а не их идентификаторы. Проблема в том, что когда я меняю SelectedValue, потому что я хочу, чтобы параметр был установлен как параметр по умолчанию, я обнаружил, что свойство List пусто (я унаследовал класс combobox от другого), однако, когда отображается поле со списком, у меня есть элементы внутри него , так что, возможно, проблема связана с КОГДА данные действительно загружаются из источника данных (может быть, он загружается только после отображения?). Когда мне следует так изменить значение SelectedValue? В элементе управления нет события «Показано».

Спасибо за любые предложения

Обновление 1: Я тестировал ваш способ, но это не тот случай (ключ длинный, но даже если я его использую, он не работает), на самом деле интересно то, что у меня есть сеттер, который позволяет мне установить SelectedValue, даже если не вызывает исключений, в следующем MessageBox Items.Count дает мне значение 0, что очень странно, потому что, когда поле со списком отображается в форме, оно имеет все значения, которые я хотел. Вот код моего сеттера:

    public object InputValue
    {
        get
        {
            return SelectedValue;
        }
        set
        { 
            SelectedValue = ((long)value);
            MessageBox.Show(this.Items.Count.ToString());
        }
    }

person Francesco Belladonna    schedule 02.11.2010    source источник
comment
См. Мой комментарий к ответу короля Кинга: stackoverflow.com/questions/18343855/   -  person RLH    schedule 21.08.2013


Ответы (3)


Вы не единственный, кто столкнулся с этой проблемой, приятно слышать, что это не только я. То, что не происходит, связано с преобразованием типа - если вы явно приведете свой SelectedValue к точному типу в источнике данных, вы обнаружите, что можете успешно установить значение.

Например:

comboBox1.ValueMember = "Value";
comboBox1.DisplayMember = "Key";
object ds = new KeyValuePair<string, long>[] {
    new KeyValuePair<string,long>("a",0),
    new KeyValuePair<string,long>("b",1),
    new KeyValuePair<string,long>("c",2),
    new KeyValuePair<string,long>("d",3),
    new KeyValuePair<string,long>("e",4)
};
comboBox1.DataSource = ds;
comboBox1.SelectedValue = 3;        // this won't work
comboBox1.SelectedValue = (long)3;  // this will work

По какой-то причине, даже если '3' как long равно '3' как int, ComboBox отказывается играть в мяч, если вы не получите точный тип.

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

Надеюсь, это поможет с вашей конкретной проблемой!

person Bradley Smith    schedule 02.11.2010
comment
Проблема не в том, следите за обновлением моего вопроса, я объясню лучше; кстати, я заметил проблему, о которой вы говорите, на самом деле мне пришлось бросить ее, чтобы она работала - person Francesco Belladonna; 02.11.2010

Я решил проблему, поскольку я думал, что коллекция Items заполнена "вокруг" первого аннулирования поля со списком, поэтому я просто сохранил значение, представленное как SelectedValue, перед первым аннулированием во временной переменной, а затем просто установил его под Недействительное событие.

person Francesco Belladonna    schedule 28.11.2010

У меня есть эта проблема, и я использую свойство BindingSource.Current с событием CurrentChanged () источника привязки, и оно работает правильно

person Mahdy Aslamy    schedule 24.08.2018