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.
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
@carlossierra, j'ai besoin de définir les trois champs, mais le nom et la description seront affichés – Amolb
avez-vous vu le modifier à ma réponse? Je pense qu'il répond à votre question pour v3 de SmartGWT ... – carlossierra