2012-01-11 4 views
0

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

Я хотел бы показать имена клиентов в поле со списком, но когда пользователь выбирает имя, вместо него возвращается поле CustomerID. Какая самая лучшая работа для этого?

ответ

1

Для его реализации вам не нужно несколько столбцов.

class Member 
{ 
    public string Name{get;set;} 
    public string Address{get;set;} 
    public int ID{get;set;} 

    public string Description 
    { 
     get 
     { 
      return string.Format("{0}, {1}", Name, Address); 
     } 
    } 
} 

var members = new [] 
{ 
    new Member(){ID = 1, Name = "John", Address = "Addr 1"}, 
    new Member(){ID = 2, Name = "Mary", Address = "Addr 2"} 
}; 

m_ComboBox.DataSource = members; 
m_ComboBox.DisplayMember = "Description" 
m_ComboBox.ValueMember = "ID"; 

теперь вы можете получить доступ к seleceted ID

var selectedID = m_ComboBox.CelectedValue(); 
+0

Может ли это быть оттолкнуто немного дальше, то есть отображать, строки адреса клиентов 1,2,3 (три поля), но возвращать AddressID (четвертое поле)? – PJW

+0

Вы должны создать поле агрегации, которое предоставит описание экземпляра Member (Name + Address + e.t.c.) –

+0

Пожалуйста, изучите обновленный код –

2

Лучший способ заключается в использовании ComboBoxes DisplayMember и ValueMember свойства

установить ComboBox.DisplayMember к недвижимости, которую требуется отобразить. Используйте ValueMember для недвижимости, которую хотите вернуть. Затем вы можете использовать ComboBox.SelectedValue, чтобы получить текущий/выбранный ValueMember

1

Значение ComboBoxItem не должно совпадать с текстом, используйте идентификатор в качестве значения.

0

Вы можете достичь желаемого поведения, установив DisplayMember и ValueMember свойства ComboBox в "CustomerName" и "CustomerID" соответственно.

0

Посмотрите на ValueMember. Вы должны установить это для CustomerID. После того, как вы привяжетесь к своему поле со списком, фактическое поле, отображаемое пользователю, будет именем CustomerName, но когда вы захотите получить значение «CustomerName», оно вернет идентификатор CustomerID.

Если вы хотите получить значение поля со списком, просто укажите SelectedValue.

Если вы непреклонны в отображении обоих из них в выпадающем списке, есть некоторые хакерские способы сделать это, но я бы рекомендовал снова рассмотреть ваши требования и посмотреть, если это абсолютно необходимо.

0

В качестве альтернативы, вы можете определить KeyValuePair объекты с предназначенным и идентификаторами текстовых полей. Подайте их в комбо, так как его свойство Items - это совокупность объектов. Затем для извлечения используйте литой, такой как

var x = (KeyValuePair)combo.Items[0]; 

, а затем вводит ключи и значения свойств x.

0

Свойство Tag для ComboBoxItem можно использовать для хранения значения.

Смежные вопросы