将值设置为ComboBoxItem smartgwt

时间:2016-06-28 18:29:15

标签: java 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

1 个答案:

答案 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();  
    }  
}  

注意:

  • 为了显示各种字段,您需要使用setPickListFields以及对这些字段的引用。
  • 您无需在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。