C # Установить комбинированный элемент с selectedValue - PullRequest
8 голосов
/ 19 мая 2010

Я динамически создаю комбинированный список вроде этого:

public Control GenerateList(Question question)
{
    // Get a list with answer possibilities
    List<QuestionAnswer> answers = question.GetAnswers();

    // Get a collection of given answers
    Collection<QuestionnaireAnswer> givenAnswers = question.GetFilledAnswers();

    ComboBox cmb = new ComboBox();
    cmb.Name = "cmb";
    cmb.DataSource = answers;
    cmb.DisplayMember = "Answer";
    cmb.ValueMember = "Id";

    // Check an answer is given to the question
    if (givenAnswers != null && givenAnswers.Count > 0)
    {
        cmb.SelectedValue = givenAnswers[0].AnswerId;

    }

    cmb.DropDownStyle = ComboBoxStyle.DropDownList;
    cmb.SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged);
    cmb.Leave += new EventHandler(cmb_Leave);

    return cmb;
}

Проблема в том, что при выполнении cmb.SelectedValue = givenAnswers[0].AnswerId; cmb.SelectedValue всегда равно нулю.

При отладке и исследовании answers (источник данных) я вижу, что Id (ValueMember) в точности совпадает с AnswerId (в операторе if). Оба имеют одинаковый тип (long) и одинаковое значение, но SelectedValue остается нулевым.

Есть что-то, чего я не вижу?

EDIT:

Похоже, что поле со списком остается пустым. Когда я заменяю cmb.SelectedValue = givenAnswers[0].AnswerId; на cmb.SelectedIndex = 0;, я получаю ArgumentOutOfRangeException. В то время как количество ответов в ответе равно 2. Значит, источник данных не равен нулю ... Очень сильно, да?

Решение:

Свойства SelectedValue, SelectedIndex, SelectedItem не могут быть установлены, пока элемент управления не будет добавлен в форму. После добавления элемента управления в форму можно выбрать свойства selectedValue, -Index и -Item.

Ответы [ 6 ]

8 голосов
/ 08 июля 2010

Решение:

Свойства SelectedValue, SelectedIndex, SelectedItem не могут быть установлены, пока элемент управления не будет добавлен в форму. После добавления элемента управления в форму можно выбрать свойства selectedValue, -Index и -Item.

3 голосов
/ 05 апреля 2013
cmb.SelectedIndex = cmb.FindStringExact("Desired Value")

cmb.FindStringExact ("Desired String") возвращает индекс значения, которое вы хотите выбрать, а cmb.SelectedIndex устанавливает этот комбинированный список в этот индекс.

Спасибо Биллиусу за то, что он показал мне свет!

К вашему сведению - это версия VB.NET Winforms.

3 голосов
/ 19 мая 2010

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

cmb.Items.FindByValue(givenAnswers[0].AnswerId).Selected = true;

Всё заработало ... Надеюсь, тебе удачи!

1 голос
/ 19 мая 2010

Вы смотрите на ту же недвижимость?

 cmb.ValueMember = "Id"; 
 ..
 cmb.SelectedValue = givenAnswers[0].AnswerId; 

Вы ссылаетесь на другой ValueMember, а затем идентификатор, который вы публикуете в SelectedValue. Кроме того, вы можете попытаться установить свой Display- и Value-элемент перед привязкой данных. Это быстрее.

0 голосов
/ 17 августа 2011

Я столкнулся с той же проблемой и обнаружил, что моей проблемой было то, что я рассматривал SelectedValue как целое число, хотя на самом деле это был объект. Решение «FindByValue» от Дэнни Чена, описанное выше, не работает в WinForms, поэтому я попытался использовать «FindStringExact» и искал в DisplayMember:

cmb.Items.FindStringExact(<Display string>)

Не идеальное решение, но оно сработало.

0 голосов
/ 19 мая 2010

Убедитесь, что QuestionAnswer имеет общедоступные средства доступа, соответствующие (то же имя) используемым элементам отображения / значения.

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