2012-05-30 75 views
7

我已經定義了一個ComboBox,它允許用戶從他的聯繫人列表中選擇一個聯繫人。 ComboBox顯示聯繫人姓名,但不能真正用於映射到真實聯繫人:需要聯繫人ID。我的問題是,我不知道如何使用鏈接的值和ID填充VaadinComboBox,但只顯示值。帶有值和ID的Vaadin組合框

// 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); 

正如你可以在上面的代碼,我加入contactNameComboBox看,但我不知道該怎麼也添加contactId,這樣我可以知道後,從選擇的條目,其中ID必須用於更新數據庫。

回答

10

有幾種方法可以解決這個問題:這裏最靈活的方法是將組合框配置爲使用命名屬性作爲標題。 有關更多詳細信息,請參閱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

我一直無法實現此解決方案。 Item的getProperty(「name」)方法不存在。有getItemProperty,但我沒有成功使用它。 – dangonfast

+0

這個解決方案也不適合我,請看看我的建議。我不知道你正在使用哪個版本的vaadin; [ – BlueLettuce16

2

查爾斯安東尼絕對是對的。

您還可以利用BeanContainer或BeanItemContainer等Container(更多信息here)將您的聯繫人對象添加到ComboBox中。 您需要填寫您的容器中,用

contactNameCombo.setContainerDataSource(YOUR_CONTAINER); 

添加到您的組合框。

+0

這個解決方案看起來很有前景。我爲我的數據創建了一個Bean類,用幾個Bean填充BeanContainer,並通過setContainerDataSource將它關聯到ComboBox。一切正常顯示。現在我有一個問題得到選定的值:如果我在組合框上getValue()我得到的值被顯示。我其實想要得到Id。爲此,我想在相關容器中獲取「選定」Bean,以便分析Bean數據。是否有可能知道正在使用關聯容器中的哪個條目來顯示組合框中的文本? – dangonfast

+0

如果你使用BeanContainer,你可以在容器上設置哪個屬性應該是你的id和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

非常有幫助,謝謝 –