2016-06-28 1 views
0

Dans le menu déroulant, je reçois comme ceci. trouver l'image ci-jointe. En fait, dans coulmn du champ "Nom", "Nom" et "Description" sont séparés par une virgule (,).Définir la valeur de 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

Vous mentionnez que vous souhaitez afficher le nom et la description, mais votre code n'essaie pas d'utiliser Description. Voulez-vous utiliser les 3 champs à ce moment, ou simplement ID et Nom? – carlossierra

+0

@carlossierra, j'ai besoin de définir les trois champs, mais le nom et la description seront affichés – Amolb

+0

avez-vous vu le modifier à ma réponse? Je pense qu'il répond à votre question pour v3 de SmartGWT ... – carlossierra

Répondre

1

Voici quelques exemples de code pour obtenir ce que je comprends que vous voulez réaliser:

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

Avis:

  • Pour afficher différents champs, vous besoin d'utiliser setPickListFields avec la référence à ces champs. Vous n'avez pas besoin d'appeler fetch() sur le DataSource lui-même. Ceci est fait automatiquement pour vous lorsque vous utilisez des composants DataBound comme ComoBoxItem.
  • Vous pouvez ajouter vides supplémentaires à l'aide de valeurs setSpecialValues() sans modifier vos données DSResponse (ce qui est la raison pour laquelle vous n'avez pas besoin d'utiliser directement fetch()).

EDIT

Le problème rencontré est que le ValueMap, qui est juste un Map (en d'autres termes, tout un groupe de paires clé/valeur), que vous fournir au ComboBoxItem n'est pas la même chose que l'objet Record[] fourni directement par le DataSource, qui est essentiellement une Liste composée de plusieurs Map s, chacun représentant un nom de champ et sa valeur. Ainsi, outre le champ de valeur, vous pouvez fournir plusieurs champs à ComboBoxItem à des fins d'affichage, tels que Name et Description, dans votre cas particulier. En regardant l'API, il me semble que vous ne pouvez pas fournir un Record[] manuellement au ComboBoxItem, donc soit vous obtenez les données via DMI (qui est pour moi le plus facile) ou une autre méthode qui vous permet de modifiez et renvoyez automatiquement la réponse requise du serveur à ComboBoxItem en utilisant les capacités de liaison de données, ou vous enregistrez seulement les "valeurs" (ce que vous obtenez en ce moment, mais bien sûr vous pourriez mieux formater les données) .

Ce que je veux dire avec la mise en forme est que si vous choisissez d'aller avec votre approche originale de l'utilisation setValueMap(), vous devez fournir un Map où chaque entrée dans la Map est juste une valeur sur le ComboBoxItem et son affichage respectif « texte » , qui peut être une chaîne combinant les valeurs de plusieurs autres champs, et formaté comme souhaité à l'aide concaténation String (par exemple, vous pouvez le rendre

nameField + ": " + descriptionField 

Mais cela est aussi bon qu'il obtient avec cette approche.

Maintenant, via un DMI, vous devrez définissez la classe de serveur qui fournirait les données correctement formatées dans votre descripteur de source de données (ds.fichier xml):

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

Et puis créer la classe et la méthode pour fournir ce dont vous avez besoin:

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; 
    } 
} 

Enfin, vous pouvez suivre l'approche originale que je suggère dans ma première réponse, mais maintenant vous don Vous n'avez pas besoin d'utiliser l'API setSpecialValues, que votre version ne prend pas en charge.

+0

Je veux afficher le nom et le champ de description, et le champ id est le champ de la valeur. Lorsque vous définissez directement 'setOptionDataSource', j'obtiens une sortie désirée. mais quand je modifie 'DataSource' je n'ai pas obtenu le résultat du désir. 'setSpecialValues ​​(hashMap)' Je ne peux pas utiliser car mon smartgwt est de la version 3.0. J'ai essayé l'approche ci-dessous, cela semble fonctionner mais le formatage ne s'affiche pas correctement. Veuillez trouver ci-dessous ma réponse et faites-moi savoir ce que je manque. – Amolb