Как я могу заполнить поле редактирования ComboBox ValueMember, но показать DisplayMember в списке? - PullRequest
2 голосов
/ 13 октября 2011

У меня есть редактируемый ComboBox с проверкой на свойстве Text, чтобы убедиться, что введенная вручную информация верна.

РЕДАКТИРОВАТЬ: Все, что я хочу сделать, это заполнить .Text свойство с ValueMember выбора, а не DisplayMember

У меня также есть .Items, заполненный допустимыми записями, имеющими набор DisplayMember и ValueMember.

Мой DisplayMember - это заголовок вместе с данными, а ValueMember - это сами данные.

Так что Items может быть:

(DisplayMember, ValueMember)
"Foo - 1ab2"  , "1ab2"
"Bar - 3cd4"  , "3cd4"

У меня была проверка натекст, который также может проверять ручной ввод пользователя, например "5ef6"

Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь выбирает элемент из выпадающего списка, он заполняет текстовое поле свойством DisplayMember (например: "Foo - 1ab2 "), которая не пройдет проверку.

Я пытался вручную установить свойство .Text с помощью SelectedValue или SelectedItem.Value для каждого из трех соответствующих событий комбинированного списка, но безрезультатно.

Мне бы хотелось, чтобы .Text ComboBox был заполнен .ValueMember элемента при выборе вместо .DisplayMember

РЕДАКТИРОВАТЬ: Я не могу проверить, пытаясь экстраполировать значение из заголовка.Я отправляю Text off в службу для проверки.

void FillMyCombo
{
    KeyValuePair<string, string> listValue1 = new KeyValuePair<string, string>("Foo - 1ab2"  , "1ab2")
    KeyValuePair<string, string> listValue2 = new KeyValuePair<string, string>("Bar - 3cd4"  , "3cd4")
    myCombo.Items.Add(listValue1);
    myCombo.Items.Add(listValue2);

    myCombo.DisplayMember = "Key";
    myCombo.ValueMember = "Value";
}

...

void myCombo_TextUpdated
{
    if(!myValidationService.Validate(myCombo.Text))
    {
        do error stuff
    }
}

Пользователь может вручную ввести что-то вроде «5ef6», которое пройдет проверку.Но когда они выбирают элемент из списка, а не вводят его вручную, свойство .Text заполняется заголовком , а не значением ..., поэтому оно будет содержать "Foo - 1ab2 ", и это не пройдет проверку.

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

РЕДАКТИРОВАТЬ: Скажем, пользователь выбирает "Foo - 1ab2" из выпадающего списка, я хочу текст в полесказать «1ab2»

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

Ответы [ 2 ]

1 голос
/ 14 октября 2011

А как насчет http://nickstips.wordpress.com/2010/11/19/c-datagridviewcomboboxcolumn-displaying-different-values-in-drop-down-list/ - они меняются ValueMember и DisplayMember на лету при открытии / закрытии выпадающего меню.

Пример для DatagridViewComboBox. У ComboBox тоже есть эти события, нет?

Попробуй и понизь голос, если это не поможет:) =

** Обновление **

Еще одним привлекательным решением может быть ArgumentException при добавлении столбца ComboBox в DataGridView с тем же источником данных , посмотрите на непринятый ответ.

0 голосов
/ 13 октября 2011

Просто проверьте свойство .SelectedText экземпляра ComboBox. .Text всегда будет содержать то, что видит пользователь, то есть значение свойства display:

void myCombo_TextUpdated
{
    if(!myValidationService.Validate(myCombo.SelectedText))
    {
        do error stuff
    }
}

SelectedText получает или устанавливает текст, выбранный в редактируемой части ComboBox, я думаю, даже если SelectedIndex = -1 / SelectedValue = Null.

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