2016-06-28 2 views
0

В раскрывающемся списке я получаю вот так. найти изображение прилагается. Фактически в поле «Имя» как «Имя», так и «Описание» отображаются как разделенные запятыми (,).Значение Value для ComboBoxItem smartgwt

final ComboBoxItem comboBoxItem = new ComboBoxItem("attributeTypeId","Attr. Type"); 
ListGridField nameField = new ListGridField("name", "Name"); 
ListGridField descField = new ListGridField("description","Description"); 
descField.setShowHover(true); 
comboBoxItem.setPickListFields(nameField, descField); 
comboBoxItem.setPickListWidth(200); 
comboBoxItem.setFilterLocally(true); 
comboBoxItem.setColSpan(2); 
comboBoxItem.setAddUnknownValues(false); 
comboBoxItem.setValueField(FieldNames.ID_FIELD); 
comboBoxItem.setDisplayField(FieldNames.NAME_FIELD); 
comboBoxItem.setAutoFetchData(true); 

OptionListDataSource attrTypeds = OptionListDataSource.getInstance(FieldNames.ATTRIBUTE_TYPE_FIELD); 
attrTypeds.fetchData(null, new DSCallback() { 
@Override 
public void execute(final DSResponse response, final Object rawData, final DSRequest request) { 

Record[] recList = response.getData(); 
LinkedHashMap<String, String[]> dataLinkMap = new inkedHashMap<String,String[]>(); //LinkedHashMap<String, 

dataLinkMap.put("0", new String[]{"Select",""}); 
for (Record record : recList) { 

String attrId = record.getAttribute(FieldNames.ID_FIELD); 
String attrName = record.getAttribute(FieldNames.NAME_FIELD); 
String attrDesc = record.getAttribute(FieldNames.DESCRIPTION_FIELD); 

dataLinkMap.put(attrId, new String[]{attrName,attrDesc}); 
} 
    comboBoxItem.setValueMap(dataLinkMap); 
    } 
    }); 

Screen Shot

+0

Вы упомянули, что хотите отображать имя и описание, но ваш код не пытается использовать Описание. Вы хотите использовать все 3 поля, или просто ID и имя? – carlossierra

+0

@carlossierra, мне нужно установить все три поля, но имя и описание будут отображаться – Amolb

+0

Вы видели редактирование моего ответа? Я думаю, что он отвечает на ваш вопрос для v3 SmartGWT ... – carlossierra

ответ

1

Вот некоторые примеры кода, чтобы достичь того, что я понимаю, что вы хотите достичь:

public class TestCases implements EntryPoint { 

    public void onModuleLoad() { 
     DataSource logDS = DataSource.get("yourDSName"); 

     final DynamicForm form = new DynamicForm(); 
     form.setWidth(550); 
     form.setNumCols(2); 

     ListGridField nameField = new ListGridField(FieldNames.NAME_FIELD); 
     ListGridField descriptionField = new ListGridField(FieldNames.NAME_DESCRIPTION); 

     LinkedHashMap<String,String> hashMap = new LinkedHashMap<String,String>(); 
     hashMap.put("-1", "Select"); 

     ComboBoxItem myItem = new ComboBoxItem(); 
     myItem.setTitle("ComboBox"); 
     myItem.setOptionDataSource(logDS); 
     myItem.setDisplayField("category"); 
     myItem.setValueField(FieldNames.ID_FIELD); 
     myItem.setSpecialValues(hashMap); 
     myItem.setPickListWidth(300); 
     myItem.setPickListFields(nameField, descriptionField); 

     form.setItems(myItem); 
     form.draw(); 
    } 
} 

Примечание:

  • Для того, чтобы отобразить различные поля, вы необходимо использовать setPickListFields со ссылкой на эти поля.
  • Вам не нужно звонить fetch() на DataSource. Это делается автоматически для вас, когда вы используете компоненты DataBound, такие как ComoBoxItem.
  • Вы можете добавить дополнительные пустые значения, используя setSpecialValues() без изменения данных DSResponse (поэтому вам не нужно использовать fetch() напрямую).

EDIT

Проблема у Вас есть то, что ValueMap, который является только Map (другими словами, просто группа пар ключ/значение), что вы обеспечиваете к ComboBoxItem это не то же самое, что и объект Record[], предоставленный непосредственно DataSource, который по сути является просто списком, состоящим из нескольких Map s, каждый из которых представляет имя поля и его значение. Таким образом, помимо поля значений, вы можете предоставить несколько полей для ComboBoxItem для отображения целей, таких как имя и описание, в вашем конкретном случае.

От взгляда на API мне кажется, что вы не можете предоставить Record[] вручную ComboBoxItem, так что либо вы получаете данные через DMI (который для меня самый простой), либо другой метод, который позволяет вам изменять и возвращать требуемый ответ от сервера автоматически в ComboBoxItem с помощью возможностей привязки данных или придерживаться только «значений» (именно это вы получаете прямо сейчас, но, конечно, вы можете форматировать данные лучше) ,

Что я имею в виду с форматированием, что если вы решите пойти с оригинальным подходом использования setValueMap(), вам необходимо предоставить Map, где каждая запись в Map только значение на ComboBoxItem и его соответствующий дисплей «текст» , который может быть любая строка объединения значений нескольких других полей, и отформатирован по желанию с помощью конкатенации строк (например, вы могли бы сделать его

nameField + ": " + descriptionField 

Но это так же хорошо, как он получает с этим подходом.

Теперь, через DMI, вам нужно будет определите класс сервера, который предоставит правильно отформатированные данные в вашем дескрипторе datasource (ds.XML-файл):

<operationBindings> 
    <operationBinding operationType="fetch" serverMethod="fetchComboBoxData"> 
     <serverObject lookupStyle="new" className="com.myApp.ComboBoxDMI"/> 
    </operationBinding>   
</operationBindings> 

А затем создать класс и метод, чтобы обеспечить то, что вам нужно:

public class ComboBoxDMI { 

    public DSResponse fetchComboBoxData(DSRequest dsRequest) throws Exception {   
     DSResponse response = dsRequest.execute(); 
     if (response.statusIsSuccess()) { 
      @SuppressWarnings("unchecked") 
      List<Map<String, Object>> recList = response.getRecords(); 
      List<Map<String, Object>> comboBoxList = new ArrayList<Map<String,Object>>(); 
      // Add here the new record... for each field in your DataSource, you need to set a Map 
      // with the key being the field name and the value being the field value. So you need 
      // 1 Map entry per field. All your Map entries form 1 record, and that's what you add 
      // to your List of Maps 
      return constructDSResponse(comboBoxList); 
     } 
     return response; 
    } 

    private DSResponse constructDSResponse(List<Map<String, Object>> comboBoxList) { 
     DSResponse response = new DSResponse(); 
     int totalRows = comboBoxList.size(); 
     response.setStartRow(totalRows > 0 ? 1 : 0); 
     response.setEndRow(totalRows); 
     response.setTotalRows(totalRows); 
     response.setData(comboBoxList); 
     return response; 
    } 
} 

Наконец, вы можете следить за оригинальный подход я предлагаю в моем оригинальный ответ, но теперь вы дон Не нужно использовать API setSpecialValues, который ваша версия не поддерживает.

+0

Я хочу отобразить поле имени и описания, а поле id - поле значения. При прямом настройке 'setOptionDataSource' у меня появляется желание. но когда я изменяю 'DataSource', я не получил желаемого результата. 'setSpecialValues ​​(hashMap)' Я не могу использовать, так как моя версия smartgwt имеет версию 3.0. Я попытался подходить к подходу, похоже, работает, но форматирование не отображается должным образом. Ниже вы найдете мой ответ и дайте мне знать, чего я не вижу. – Amolb

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