2012-05-30 2 views
7

Я определил ComboBox, который позволяет пользователю выбирать контакт из своего списка контактов. ComboBox показывает имя контакта, но на самом деле его нельзя использовать для отображения реального контакта: необходим идентификатор контакта. Моя проблема в том, что я не знаю, как заполнить VaadinComboBox со связанными значениями и идентификаторами, но только с указанием значений.Vaadin ComboBox со значениями и идентификаторами

// Add all organization contacts to the drop-down 
for (Contact contact : organizationContacts) { 
    contactName = contact.getName(); 
    contactId = contact.getId(); 
    _logger.debug("Adding contactName=" + contactName + " contactId=" + contactId + " to person with id=" + personId); 
    contactNameCombo.addItem(contactName); 
} 

// Add the contact of this person, and select it in the drop-down 
contactName = person.getContact().getName(); 
contactId = person.getContact().getId(); 
contactNameCombo.addItem(contactName); 
contactNameCombo.setValue(contactName); 

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

ответ

10

Существует несколько способов приблизиться к этому: наиболее гибким является настройка combobox для использования именованного свойства в качестве заголовка. Для получения более подробной информации см. Book Of Vaadin on Selecting Items.

// Set the caption mode to read the caption directly 
// from the 'name' property of the item 
contactNameCombo.setItemCaptionMode(Select.ITEM_CAPTION_MODE_PROPERTY); 
contactNameCombo.setItemCaptionPropertyId("name"); 

// Add all organization contacts to the drop-down 
for (Contact contact : organizationContacts) { 
    contactName = contact.getName(); 
    contactId = contact.getId(); 
    _logger.debug("Adding contactName=" + contactName + " contactId=" + contactId + " to person with id=" + personId); 

    // Note : the itemId of the item is the contactId 
    Item item = contactNameCombo.addItem(contactId); 
    item.getProperty("name").setValue(contactName) 
} 
// Add the contact of this person, and select it in the drop-down 
contactName = person.getContact().getName(); 
contactId = person.getContact().getId(); 
Item item = contactNameCombo.addItem(contactId); 
item.getProperty("name").setValue(contactName) 

// Using the itemId (which = contactId) to select the given contact 
contactNameCombo.setValue(contactId); 
+0

Я не смог реализовать это решение. getProperty ("name") не существует как метод Item. Существует getItemProperty, но я не имел успеха в использовании этого. – dangonfast

+0

Это решение не сработало для меня, пожалуйста, взгляните на мое предложение. Я не знаю, какую версию ваадина вы используете; [ – BlueLettuce16

2

Charles Anthony абсолютно прав.

Вы также можете воспользоваться Контейнером, таким как BeanContainer или BeanItemContainer, например (дополнительная информация here), чтобы добавить свой контактный объект в свой ComboBox. Вам необходимо пополнить свой контейнер и добавить его с

contactNameCombo.setContainerDataSource(YOUR_CONTAINER); 

к вашему ComboBox.

+0

Это решение выглядит многообещающим. Я создал класс Bean для своих данных, заполнил BeanContainer несколькими Beans и связал это с ComboBox через setContainerDataSource. Все отображается правильно. Теперь у меня проблема с получением выбранного значения: если я получаю getValue() в ComboBox, я получаю отображаемое значение. Я действительно хочу получить идентификатор. Для этого я хотел бы получить «выбранный» компонент в ассоциированном контейнере, чтобы я мог анализировать данные Bean. Можно ли узнать, какая запись в ассоциированном контейнере используется для отображения текста в выпадающем списке? – dangonfast

+0

Если вы используете BeanContainer, вы можете установить в контейнере, которое должно быть вашим идентификатором с помощью setBeanIdProperty (Object o). Если вы используете BeanItemContainer, вы получите свой «полный» контактный объект. – nexus

9

Решение дается @Charles Энтони не работает для меня тоже, однако на книге vadin веб-страниц (https://vaadin.com/book/-/page/components.selecting.html) Я нашел следующий код:

// Set item caption for this item explicitly 
select.addItem(2); // same as "new Integer(2)" 
select.setItemCaption(2, "Deimos"); 

, который работает для меня.

+0

Я пробовал это, и это не сработало для меня, значения, где пусто ... –

+0

Я решил свою проблему, просто будьте осторожны, чтобы не использовать setItemCaptionPropertyId, это переопределит любой ручной код setItemCaption, даже если setItemCaption вызывается после setItemCaptionPropertyId –

4

Vaadin 7:

statusSelectCombo.setItemCaptionMode(ItemCaptionMode.PROPERTY); 
statusSelectCombo.setItemCaptionPropertyId("courseOptionValue"); 

    IndexedContainer iContainer = new IndexedContainer(); 
    iContainer.addContainerProperty("courseId", String.class, ""); 
    iContainer.addContainerProperty("courseOptionValue", String.class, ""); 
    String addItemId=""; 
    String addItemCaption=""; 
for (int i = 0; i < comboItemsArray.length; i++) //String[] comboItemsArray 
{ 
    log.debug("comboItemsArray["+i+"] "+comboItemsArray[i]); 
    addItemId= comboItemsArray[i]; 
    addItemCaption=comboItemsArray[i]; 
    Item newItem = iContainer.getItem(iContainer.addItem()); 
    newItem.getItemProperty("courseId").setValue(addItemId); 
    newItem.getItemProperty("courseOptionValue").setValue(addItemId); 
} 
statusSelectCombo.setContainerDataSource(iContainer); 

ValueChangeListener listener = new Property.ValueChangeListener() 
{ 
    public void valueChange(ValueChangeEvent event) 
    { 
    statusSelectCombo.getItemIds(); 
    Property changedProperty = event.getProperty(); 
    Object selectedStatus = (Object) statusSelectCombo.getValue(); //it is get Value but gives object ID as an Object 
    Item rowItem = statusSelectCombo.getItem(selectedStatus); 
    final String selectedCourseId = (String) rowItem.getItemProperty("courseId").getValue();   

    } 
}; 
+0

Действительно полезно, спасибо –

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