Вот некоторые примеры кода, чтобы достичь того, что я понимаю, что вы хотите достичь:
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
, который ваша версия не поддерживает.
Вы упомянули, что хотите отображать имя и описание, но ваш код не пытается использовать Описание. Вы хотите использовать все 3 поля, или просто ID и имя? – carlossierra
@carlossierra, мне нужно установить все три поля, но имя и описание будут отображаться – Amolb
Вы видели редактирование моего ответа? Я думаю, что он отвечает на ваш вопрос для v3 SmartGWT ... – carlossierra