Le forum (ô combien francophone) des utilisateurs de Powerbuilder.





Bonsoir,
Je rencontre un petit soucis que je ne parviens pas à résoudre.
J'ai une fenêtre dans laquelle j'ai un control nommé "dw_payment_type" et de type ddw_payment_type : si j'ai bien compris, c'est une DropDownDataWindow.
Dans ma ddw_payment_type, j'ai un label (nom de colonne) + une colonne nommée "payment_type" et de type d_payment_type_edit_list (dataWindow).
Dans ma d_payment_type_edit_list j'ai deux colonnes : paytyp_str et paytyp_id. Seul paytyp_str est visible. Une procédure me fournit les données : 14 rows. Bien que paytyp_id soit invisible, il est bon de savoir qu'il varie de 1 à 16 inclus.
Le but du jeu c'est donc d'avoir une liste déroulante dans ma fenêtre, pré-remplie avec les données fournies.
Seulement voilà : lorsque ma fenêtre s'affiche, j'ai bien mes données dans la liste déroulante... Sauf que la première donnée - celle affichée tout en haut de la liste et visible lorsque la liste est fermée - est vide !
Parfois il y a un "1" ou un "0" dedans.
Pour y remédier je souhaite forcer la sélection de la première donnée retournée, de sorte qu'il ne puisse pas y avoir de sélection "vide".
Voici comment je procède. Dans ma fenêtre j'agis comme ceci :
dw_payment_type.insertRow(0)
datawindowchild ldw_child
dw_payment_type.GetChild('payment_type', ldw_child)
ldw_child.SetTransObject(SQLCA)
ldw_child.retrieve()
ldw_child.setrow(1)
Le premier élément est bien sélectionné et surligné, toutefois il n'apparait pas dans la "case" de ma liste déroulante quand elle est fermée. C'est lorsque je l'ouvre/la déroule qu'on voit que le premier élément est sélectionné.
J'ai bien tenté de manipuler setrow()/ScrollToRow() sans succès : ma sélection n'apparait pas dans la "case" du haut.
J'ai pu lire sur le forum qu'il fallait se tourner vers un setItem() dans le retrieweEnd() : je n'y suis pas vraiment parvenu et je ne vois pas trop comment faire. Si c'est le retrieweEnd() de dw_payment_type, cela n'est pas affecté par l'instruction "ldw_child.retrieve()"... Si ?
Bref, je recherche une solution simple pour sélectionner mon élément. setRow() le fait plutôt bien, si ce n'est que l'élément de la liste sélectionné n'apparait pas en tête de liste... Et que mon champ reste vide.
Auriez-vous une idée ? Un conseil ? Une remarque ? Une suggestion ?
Merci pour votre aide, encore une fois ;-)
Dernière modification par Nyphel (16-05-2008 08:45:25)
Hors ligne







Bonsoir,
Ton problème vient du fait que ta datawindow, dw_payment_type, n'est pas alimentée.
Quand tu fait le retrieve sur ta datawindowchild, ddw_payment_type, tu récupère bien les donnée que tu veux mais powerbuilder s'arette là. Il n'essaie pas d'affecter a ta datawindow le champ selectionné dans ta datawindowchild.
Bref en gros il faut initialiser l'alimentation ta datawindow avec le contenu de ta datawindowchild.
Je reprends ton code avec le bout qu'il te manque :
dw_payment_type.insertRow(0) datawindowchild ldw_child dw_payment_type.GetChild('payment_type', ldw_child) ldw_child.SetTransObject(SQLCA) ldw_child.retrieve() ldw_child.setrow(1) //Je force l'affichage de ce champ dans ma datawindow dw_payment_type.SetItem(1, "payement_type", ldw_child.GetItemNumber(1,"payment_type"))
Je dois avouer que j'ai un peu mal aux a cette heure ci de la journée donc j'ai pu passer a coté d'une de tes explications, j'essaierais de me relire demain à tête reposée.
Bonne soirée
Dernière modification par Nephtis (15-05-2008 18:55:12)
Hors ligne





Cela me retourne une erreur :
Invalid row/column specified at line... function...
Je crois comprendre ce que tu veux dire, je vais creuser la chose demain matin. Merci pour le conseil !
Edition
Ceci fonctionne :
dw_payment_type.SetItem(1, "payment_type", "test")
J'avais pourtant déjà essayé le SetItem, mais je m'y prenais mal. Je faisais un SetItem sur ldw_child au lieu de dw_payment_type... Mais maintenant je comprends le problème grâce à tes explications.
Par contre je ne parviens pas à faire fonctionner le GetItemNumber().
Sinon j'ai aussi trouvé cette syntaxe qui semble résoudre totalement mon problème :
dw_payment_type.object.payment_type[1] = string("1")
Cela force la sélection du premier élément de la liste déroulante.
Je pense que je peux tagger le post comme résolu, merci bien pour ton aide !
Dernière modification par Nyphel (16-05-2008 08:45:06)
Hors ligne