Gibt es eine Möglichkeit, die dynamische Änderung einer Dropdown-Liste für eine einzelne Zeile in einem gridbasierten Datenfenster zu behandeln?
Beispiel:
%Vor% Gegeben ist ein gitterbasiertes Datenfenster, in dem die Felder NAME
, PURCHASED IN
und COLOUR
Textfelder sind, während das Feld LIKABILITY
ein Dropdown-Feld * ist.
Ich sage dropdown *, weil die gleiche visuelle Darstellung mit einer DropDownList (die zum Entwurfszeitpunkt im Datenfensterelement fest codiert ist) oder DropDownDW (oder DDDW, einer Select-Anweisung, die auf anderen Elementen im Datenfenster basieren kann) erstellt werden kann ).
Es gibt jedoch keine Möglichkeit, dass ich Bananas
mit seinen 3 Dropdown-Listen erhalte, während Apple nur zwei hat.
Wenn ich mehrere Zeilen von Bananas
eintrage, haben alle Zeilen 3 Dropdown-Felder, aber sobald ich eine Apples-Zeile hinzufüge, werden alle Dropdown-Menüs auf 2 Auswahlmöglichkeiten zurückgesetzt.
Um zu versuchen, diese Funktionalität zu erreichen, habe ich die folgenden Optionen ausprobiert:
dw_1.Object.likability.values("Good~tG/Bad~tB/Bananas are good~tDRWHO")
auf ue_itemchange beim Bearbeiten von NAME.
FEHLER: Bearbeitet alle Instanzen der LIKKBARKEIT anstelle der aktuellen Zeile.
Duplicate Dropdowns mit einer gefilterten, ungefilterten Auswahlliste pro Zeile, die basierend auf der NAME-Auswahl sichtbar ist.
FEHLER: Kann Sichtbarkeit / überlappende Spalten im gitterbasierten Datenfenster nicht festlegen. ( Quelle)
Hard-Code-Anzeigewert als Datenbankwert oder Vice Versa. Haben GOOD
, BAD
, BANANASAREGOOD
als Anzeige- und Datenbankwerte und ändern die Handhabung der Optionen von G, B, DRWHO auf diese neuen Werte.
FAILS: Die dritte Option erscheint für alle Zeilen, die immer noch in Apple Zeilen auswählbar sind, was falsch ist.
DDDW ruft eine Liste von Optionen für das Dropdown auf. Erstellen Sie ein DDDW, das den Wert von NAME verwendet, um zu ermitteln, welche Auswahl für das Dropdown-Feld ausgewählt werden sollte.
FEHLER: Bearbeitet alle Instanzen des Dropdown-Menüs, nicht nur die aktuelle Zeile.
DDDW ruft den Zähler der verfügbaren Optionen ab (wenn B dann 3 sonst 2), dann haben Sie doppelte Dropdown-Spalten, die basierend auf dem DDDW-Zähler schützen / den Schutz aufheben.
FEHLER: Der dddw-Wert kann nicht automatisch ausgewählt werden, um die Spalte zu füllen, um den Schutz in anderen zwei Spalten zu verursachen, in jedem Fall hässliche Lösung.
Es gibt jetzt ein Kopfgeld zu dieser Frage für jeden, der mir eine Lösung geben kann, mit der ich eine Dropdown-Spalte für eine einzelne Zeile in einem gitterbasierten Datenfenster in PB 10.5 bearbeiten kann.
Sie können den Inhalt der Codetabelle für das Ereignis rowfocuschanged bearbeiten. Da nur ein Dropdown auf einmal erweitert werden kann, sollte dies die von Ihnen gewünschte Benutzererfahrung bieten.
Sie können die Codetabelle nicht basierend auf dem Ausdruck ändern, wie dies z. Schriftgröße leider.
Wenn Sie mehr Kontrolle über das Dropdown benötigen, können Sie DropDownDW verwenden. Sie könnten es in RowFocusChanged erneut abrufen und den Wert aus Ihrer zweiten Spalte übergeben.
Also, die Antwort auf Ihre Frage ist nein, Sie können keine eindeutigen Inhalte in DropDownListBoxes (oder DropDownDataWindows für diese Angelegenheit) auf einer Zeile-für-Zeile-Basis haben.
Die Lösung für Ihr Problem ist komplexer. Sie können den Inhalt der Dropdown-Liste für RowFocusChanged ändern, aber was passiert mit der Darstellung in Zeilen, in denen der Codewert nicht mehr in der Werteliste enthalten ist? Nur der Codewert wird angezeigt. Es ist nicht großartig, wenn Sie nicht in einer bestimmten Zeile sind, wenn R statt Rot angezeigt wird. Eine gängige Lösung besteht also darin, zwei Steuerelemente direkt übereinander zu haben, um diese Daten darzustellen: Eines, das sichtbar ist, wenn die Zeile den Fokus hat (das Dropdown-Element was auch immer ) und das andere sichtbar, wenn eine andere Zeile den Fokus hat, die den Anzeigewert des Codes anzeigt. In der Vergangenheit habe ich dies mit statischem Text oder einer Dummy-Spalte im Edit-Stil als zweites Steuerelement getan und den Wert für ItemChanged der ersten Spalte festgelegt. Heute Morgen spekuliere ich jedoch, dass Sie dies ohne Skripting tun könnten, wenn das zweite Steuerelement eine Dropdown-Spalte wäre, die auf dieselbe Spalte im Datensatz verweist, die immer den vollständigen Satz von Werten enthält. Ich lasse das Experiment (und die wenigen anderen Teile, die nötig sind, damit das funktioniert, wie es passiert, wenn der Benutzer das zweite Steuerelement aus einer anderen Zeile anklickt) bis zu Ihnen.
Viel Glück,
Terry.
Nachtrag
Sie haben gefragt, wie die Dinge Zeile für Zeile erledigt werden. Das wird wie Weihnachten für Sie (oder einen anderen kulturell angemessenen massiven Geschenk-Urlaub). Sehen Sie im Eigenschaftenbereich des DataWindow-Malers alle Elemente mit einer Schaltfläche rechts mit einem Gleichheitszeichen? Damit können Sie einen Ausdruck eingeben, der Zeile für Zeile auswertet, um den Wert des Attributs zu bestimmen. Um einen Ausdruck einzugeben, so dass ein Feld nur sichtbar ist, wenn es die aktuelle Zeile ist?
%Vor%Sie können diese Ausdrücke auch zur Laufzeit ändern (). Ich werde dich der Hilfe überlassen, um das auszugraben. Die Hilfe enthält außerdem eine Liste von Attributen für jedes DataWindow-Steuerelement, die in der Tabelle angeben, ob für jedes Attribut ein Ausdruck verwendet wird. (Die Equals-Schaltflächen sind nicht 100% der Story; nicht alle ausdrucksfähigen Attribute können über die IDE ausgedrückt werden.)
Randnotiz: Wenn Sie Ausdrücke erhalten und lernen, sie zu meistern, erhalten Sie die Macht des DataWindow.
Wie bei Gittern funktioniert mein zweiter Vorschlag von Spalte über Spalte in Gittern offensichtlich nicht. Das ist der Zeitpunkt, auf eine Spalte und einen statischen Text zurückzugreifen, zum Beispiel mit einem ItemChanged-Skript.
T
Erstellen Sie eine Dummy-Spalte in der Auswahl, die groß genug ist, um den Anzeigewert zu halten. Verwenden Sie ein DropDownDataWindow für diese Spalte, indem Sie die Anzeigewertspalte für den Anzeigewert und den Datenwert verwenden. Wenn Sie das DataWindow abrufen, füllen Sie diese Spalte, indem Sie die korrekten Werte nachschlagen (Hinweis: Verwenden Sie ein DDDW in der echten, ausgeblendeten Spalte und rufen Sie LookUpDisplay () auf, stellen Sie sicher, dass der Filter gelöscht wird, wenn Sie dies tun); Rufen Sie dann ResetUpdate () auf. Filtern Sie die Werte in der Dropdownliste nach den Werten der aktuellen Zeile. Wenn im ItemChanged-Ereignis der Dummy-Spaltenwert geändert wird, holen Sie den Code aus dem DDDW (der DDDW befindet sich in der richtigen Zeile, wenn die Spalte den Fokus hat), ändern Sie den Wert in der ausgeblendeten Spalte und ändern Sie den Dummy-Spaltenstatus in NotModified . Da die Dummy-Spalte den Anzeigewert enthält, führt das Filtern des DDDW nicht zur Anzeige eines Codes. Neue Zeilen und Updates werden sich selbst kümmern.
Tags und Links powerbuilder datawindow