2010-03-31 7 views
8

Esiste un modo per gestire la modifica dinamica di un menu a discesa per una singola riga in una finestra di dati basata su griglia?Esiste un modo per gestire la modifica dinamica di un menu a discesa per una singola riga in una finestra di dati basata su griglia?

Esempio:

NAME LIKABILITY   PURCHASED IN COLOUR 
(Text) (DropDown*)  (Text)  (Text) 
Bananas [Good]    Hands   Yellow 
     [Bad] 
     [Bananas are good] 

Apples [Good]    Bags   Red 
     [Bad] 

premesso è un DataWindow basato su una griglia, dove i campi NAME, PURCHASED IN e COLOUR sono campi di testo, in cui il campo LIKABILITY è una discesa *.

Dico dropdown * perché è possibile creare la stessa rappresentazione visiva utilizzando DropDownList (hardcoded nell'elemento datawindow in fase di progettazione) o DropDownDW (o DDDW, un'istruzione select che può essere basata su altri elementi nel DataWindow).

Tuttavia, non v'è alcun modo per ottenere Bananas avere è 3 menù a discesa, mentre le mele ha solo 2.

Se entro più righe di Bananas, quindi tutte le righe hanno 3 menù a discesa, ma non appena aggiungo una riga di mele, tutti i menu a discesa ripristinano 2 selezioni.

Per tentare di ottenere questa funzionalità, ho provato le seguenti opzioni:

  1. dw_1.Object.likability.values("Good~tG/Bad~tB/Bananas are good~tDRWHO") su ue_itemchange durante la modifica NAME.

    FAILS: modifica tutte le istanze di LIKABILITY anziché la riga corrente.

  2. Dropdown duplicati, con un elenco di selezione filtrato e non filtrato per riga, visibile in base alla selezione NAME.

    FAILS: impossibile impostare le colonne di visibilità/sovrapposte nella finestra di dati basata sulla griglia. (Source)

  3. Valore visualizzazione codice hard come valore Database o Vice Versa. Avere GOOD, BAD, BANANASAREGOOD come valori di visualizzazione e database e modificare la gestione delle opzioni da G, B, DRWHO a questi nuovi valori.

    FAILS: terza opzione per tutte le righe, ancora selezionabile su righe Apple, che è errata.

  4. DDDW recupera l'elenco di opzioni per il menu a discesa. Creare un DDDW che utilizza il valore di NAME per determinare quali selezioni deve avere per il menu a discesa.

    FAILS: modifica tutte le istanze del menu a discesa, non solo la riga corrente.

  5. DDDW recupera contatore delle opzioni disponibili (se B poi 3 altro 2), quindi dispone di colonne a discesa duplicate che proteggono/non protette in base al contatore DDDW.

    FAILS: Impossibile selezionare automaticamente il valore di dddw per popolare la colonna per causare la protezione su altre due colonne, soluzione brutta in ogni caso.

v'è ora un taglia su questo problema per tutti coloro che mi può dare una soluzione che mi permetterà di modificare una colonna di discesa per una singola riga su una DataWindow grid-based in PB 10,5

risposta

3

È possibile modificare il contenuto della tabella di codici sull'evento rowfocuschaged. Dal momento che puoi avere solo un menu a discesa espanso in una volta, questo dovrebbe fornire l'esperienza utente richiesta.

Non è possibile modificare la tabella di codici in base all'espressione come è possibile ad es. dimensione del carattere purtroppo.

Se è necessario un maggiore controllo sul menu a discesa, è possibile trasformarlo in DropDownDW. È possibile recuperarlo nuovamente su RowFocusChanged, passando il valore dalla seconda colonna.

+1

Questa è la risposta più vicina alla soluzione con cui sono andato. Sono stato in grado di manipolare l'evento rowchange per modificare il menu a discesa in modo che fosse specifico per qualsiasi riga l'utente stesse selezionando. Cercando di fare clic sul menu a discesa di un'altra riga è un evento rowchange, cambiando il menu a cascata in un'altra soluzione. L'ho fatto tramite un menu a discesa statico, cambiandolo con la sintassi dwcontrol.object.column.values ​​sul metodo rowchange. – glasnt

+0

Interessante. Funziona bene su una grande finestra di dati? –

4

Quindi, la risposta alla tua domanda è no, non è possibile avere contenuti univoci in DropDownListBoxes (o DropDownDataWindows per quella materia) su base riga per riga.

La soluzione al problema è più complessa. È possibile modificare il contenuto del menu a discesa su RowFocusChanged, ma cosa succede alla presentazione su righe in cui il valore del codice non è più nell'elenco dei valori? Viene visualizzato solo il valore del codice. Non è bello quando non sei su una riga particolare se R è mostrato al posto di Rosso. Quindi, una soluzione comune è quella di avere due controlli, direttamente l'uno sopra l'altro, per rappresentare quei dati: uno che è visibile quando la riga è attiva (il menu a discesa qualunque sia) e quello che è visibile quando un'altra riga ha focus, che mostra il valore di visualizzazione del codice. In passato ho eseguito questa operazione con il testo statico o una colonna di stile di modifica fittizia come secondo controllo e impostato il valore sull'elementoChanged della prima colonna. Tuttavia, stamattina sto ipotizzando che si possa fare questo senza script se il secondo controllo era una colonna a discesa, che puntava alla stessa colonna nel set di dati, che conteneva sempre l'intero set di valori. Lascio l'esperimento (e gli altri pochi elementi necessari per farlo funzionare, come quello che succede quando l'utente fa clic sul secondo controllo da un'altra riga) fino a te.

Buona fortuna,

Terry.


Addendum

hai chiesto di come le cose sono fatte riga per riga. Questo sarà come il Natale per te (o qualche altra vacanza massiccia culturalmente appropriata per ricevere regali). Vedere nel riquadro Proprietà nel pittore DataWindow tutti gli elementi che hanno un pulsante a destra con un segno di uguale? Ciò ti consente di inserire un'espressione che valuterà in base alla riga per determinare il valore dell'attributo. Per inserire un'espressione in modo che un campo sia visibile solo quando è la riga corrente?

if (getrow() = currentrow(), 1, 0) 

È anche possibile modificare() queste espressioni in fase di esecuzione. Ti lascio all'aiuto per scavare. L'aiuto fornisce anche un elenco di attributi per ciascun elemento di controllo DataWindow, che include nella tabella se ogni attributo assume o meno un'espressione. (Il equivale pulsanti non sono al 100% della storia, non tutti gli attributi expressionable possono essere expressioned tramite l'IDE.)

Nota a margine: Se si ottiene espressioni e imparare a gestire la loro, si otterrà il potere di DataWindow.

Per quanto riguarda le griglie, il mio secondo suggerimento di colonna su colonna non funzionerà nelle griglie, ovviamente abbastanza. È il momento di ricorrere all'utilizzo di una colonna e di un testo statico, ad esempio, con uno script ItemChanged.

T.

+0

C'è una buona descrizione del secondo metodo Terry menzionato su http://pbbraindump.wordpress.com/category/2-datawindows/drop-down-data-window-dddw/ –

+0

In cima alla mia testa ho 2 numeri: 1: stai dicendo che posso impostare la visibilità di un DropDown riga per riga, ma non posso impostare i valori codificabili sulla stessa base? 2: Questa finestra di dati a più righe è una formazione Grid, il che significa che dovrò fare un po 'di hardcoding delle posizioni delle colonne per ottenere due colonne in modo che siano una sotto l'altra (l'ho accidentalmente fatto prima, ma per il resto, richiede le modifiche al codice sottostante per ottenere sovrapposizione/spazi tra le colonne nella modalità griglia) – glasnt

+0

Vedere la mia appendice. – Terry

0

Creare una colonna fittizia nella selezione che è abbastanza grande da contenere il valore di visualizzazione. Utilizzare DropDownDataWindow su questa colonna utilizzando la colonna del valore di visualizzazione per il valore di visualizzazione e il valore dei dati. Quando recuperi DataWindow, popola questa colonna cercando i valori corretti (suggerimento: usa un DDDW sulla colonna reale nascosta e chiama LookUpDisplay(), assicurati che il filtro venga cancellato quando lo fai); quindi chiama ResetUpdate(). Filtrare i valori nel menu a discesa in base ai valori sulla riga corrente. Nell'evento ItemChanged, quando il valore della colonna dummy cambia, ottenere il codice dal DDDW (il DDDW sarà sulla riga corretta quando la colonna ha lo stato attivo) e modificare il valore nella colonna nascosta, quindi modificare lo stato della colonna fittizia in NotModified . Poiché la colonna fittizia contiene il valore di visualizzazione, il filtro DDDW non causerà la visualizzazione di un codice. Le nuove righe e l'aggiornamento si prenderanno cura di se stessi.

+0

Scusate per la risposta tardiva, ho preso un po 'per prova a capire come ottenere questo consiglio in una soluzione praticabile Questo mi ha messo sulla strada giusta, ma pubblicherò comunque la risposta completa – glasnt

+0

A volte eseguire un comando setsort(), sort(), groupcalc() sul datawindow data risolve l'ordinamento e/o l'ordinamento di record che hanno gruppi e ordinamento all'interno di gruppi. –

Problemi correlati