在下拉中,我会这样。找到图像附加。实际上是在"姓名"字段'名称'和'描述'显示为逗号(,)分隔。
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);
}
});
答案 0 :(得分: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();
}
}
注意:
fetch()
本身上致电DataSource
。当您使用ComoBoxItem
等DataBound组件时,会自动完成此操作。 setSpecialValues()
添加其他空值,而无需修改DSResponse
数据(这就是您不需要直接使用fetch()
的原因)。 修改强>
您遇到的问题是ValueMap
,它只是Map
(换句话说,只是一组键/值对),您提供给{{1与ComboBoxItem
直接提供的Record[]
对象不同,DataSource
实际上只是一个由几个Map
组成的列表,每个都代表一个字段名称及其值。这样,除了值字段之外,您可以在ComboBoxItem中为显示目的提供多个字段,例如在特定情况下的名称和描述。
通过查看API,我认为您无法手动向Record[]
提供ComboBoxItem
,因此您可以通过DMI获取数据(对我而言,这是最简单的)或其他方法,允许您通过使用数据绑定功能自动修改并从服务器返回所需的响应到ComboBoxItem,或者您坚持只显示&#34;值&#34; (这是你现在得到的,但当然你可以更好地格式化数据)。
格式化的含义是,如果您选择使用原始方法setValueMap()
,则需要提供Map
,其中Map
中的每个条目都只是ComboBoxItem上的值及其各自的显示&#34; text&#34;,它可以是组合其他几个字段的值的任何字符串,并使用字符串连接按需格式化(例如,您可以将其设为
nameField + ": " + descriptionField
但这与这种方法一样好。
现在,通过DMI,您需要定义将在您的数据源描述符(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;
}
}
最后,您可以按照我在原始答案中建议的原始方法进行操作,但现在您不需要使用您的版本不支持的setSpecialValues
API。