Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Katalog ist das einzige Steuerelement in Canvas-Apps, die andere Steuerelemente erstellen können. Sie hat einen eigenen Bereich. Diese erweiterten Funktionen können zu unerwartetem Verhalten führen, wenn die Galerie nicht korrekt konfiguriert ist. In diesem Artikel werden bewährte Methoden und Empfehlungen für die Arbeit mit Gallery-Steuerelementen beschrieben.
Tipp
Ziehen Sie nach Möglichkeit die Verwendung moderner Steuerelemente in Ihren Katalogelementen in Betracht. Moderne Steuerelemente sind so konzipiert, dass häufige Fallstricke wie unbeabsichtigte OnChange Trigger minimiert und bessere Barrierefreiheits- und Formatierungsoptionen bereitgestellt werden. Sie können auch Copilot in Power Apps verwenden, um automatisch ein Galerielayout und eine Datenverbindung zu generieren.
Ändern Sie Galerieelemente nicht innerhalb der Galerie
Es kann leicht zu instabilem Verhalten kommen, wenn OnChange oder OnSelect untergeordneter Steuerelemente die Elemente des übergeordneten Katalogs ändern. Beispielsweise kann bei einer Texteingabe in einem Katalog die OnChange-Eigenschaft festgelegt sein auf:
Patch(GalleryData, ThisItem, {Name: TextInput.Text})
Dies ist in der Regel in Ordnung. Die meisten Steuerelemente werden nur ausgelöst OnChange , wenn Benutzer ihren Wert direkt ändern. Die folgenden Steuerelemente können jedoch Probleme verursachen, da sie auch OnChange auslösen, wenn das System ihren Wert verändert:
Beispielsweise, wenn Änderungen an ComboBox.DefaultSelectedItems vorgenommen werden, wird OnChange ausgelöst. Betrachten Sie ein Kombinationsfeld in einer Galerie, dessen DefaultSelectedItems auf First(ThisItem.A) gesetzt ist und dessen OnChange-Eigenschaft wie folgt festgelegt ist:
UpdateIf(GalleryData, Name = ThisItem.Name, {
A: Table({
B: First(Self.SelectedItems).B
})
})
Dieser Ausdruck aktualisiert einen Datensatz in der Datenquelle des Katalogs, der dem Namen des aktuellen Elements entspricht, und ersetzt die A Spalte durch eine neue Tabelle.
Dies führt zu einer endlosen Schleife. Wenn der Benutzer den Wert des Kombinationsfelds ändert, wird OnChange ausgelöst, wodurch GalleryData aktualisiert wird, wodurch sich DefaultSelectedItems ändert (weil First(ThisItem.A) auf eine neue Tabelle verweist), wodurch OnChange erneut ausgelöst wird – und so weiter.
Verwenden Sie moderne Steuerelemente oder andere Steuerelemente, die OnChange nicht auslösen, wenn sich ihre Daten ändern, um Endlosschleifen zu vermeiden.
Langsame Leistung beim Patchen von Elementen
Auch wenn Sie unerwünschte Schleifen vermeiden, kann das Patchen oder Aktualisieren von Katalogelementen langsam sein, wenn der Katalog viele Elemente enthält. Der Katalog aktualisiert nicht nur die Zeilen, die den geänderten Datensätzen zugeordnet sind. In einigen Fällen lädt er alle Elemente neu. Dies geschieht aufgrund der lose strukturierten Art von Datenquellen, was es für den Katalog schwierig macht, zu bestimmen, ob ein einzelner Datensatz oder die gesamte Datenquelle geändert wurde.
Gallery.Selected kann unerwartet geändert werden
Die Selected-Eigenschaft des Katalogs ist ein bewegliches Ziel. Sie kann ohne Benutzerinteraktion geändert werden, wenn eine der folgenden Aktionen eintritt:
- Gallery.Default Änderungen
- Gallery.Items-Änderungen
- Datenquellen werden aktualisiert oder auf den neuesten Stand gebracht.
Wenn Sie eine stabile Kopie des elements wünschen, das der Benutzer ausgewählt hat, speichern Sie es in einer Variablen. Legen Sie zum Beispiel die OnSelect-Eigenschaft der Gallery auf Folgendes fest:
Set(CurrentItem, Self.Selected)
Verwenden Sie CurrentItem dann an anderer Stelle in der App, um auf das zuletzt vom Benutzer ausgewählte Element zu verweisen, anstatt auf die vom System aktualisierte Ausgewählte Eigenschaft.
Verwenden Sie "Gallery.Selected" nicht im Ereignis eines untergeordneten Steuerelements.
Die Ausgewählte Eigenschaft des Katalogs ändert sich, wenn ein Benutzer ein Element auswählt. Dieses Ereignis wird jedoch nicht mit den Ereignissen untergeordneter Steuerelemente synchronisiert. Der Verweis auf Gallery.Selected in den Ereignissen eines untergeordneten Steuerelements kann zu unerwarteten Ergebnissen führen.
Wenn ein Benutzer beispielsweise ein Kontrollkästchen in einem Katalogauswählt, treten die folgenden Ereignisse in einer nicht angegebenen Reihenfolge auf:
Checkbox.OnSelectCheckbox.OnCheck-
Gallery.SelectedÄnderungen an der neu ausgewählten Zeile
Da die Reihenfolge dieser Ereignisse nicht festgelegt ist, kann sich die Verwendung von Gallery.Selected in Checkbox.OnSelect weiterhin auf die zuvor ausgewählte Zeile beziehen.
Verwenden Sie Gallery.Selected nicht in Ereignissen untergeordneter Steuerelemente, um Timing-Probleme zu vermeiden. Wenn Sie auf Änderungen in Gallery.Selected reagieren müssen, verwenden Sie das eigene OnSelect-Ereignis der Galerie.
Stellen Sie sicher, dass die Galerie das Schema ihrer Elemente kennt
Das Festlegen Gallery.Items auf eine Variable oder die Ausgabe einer Canvas-Komponente kann zu unerwarteten Ergebnissen führen, je nachdem, wann die Variable festgelegt oder geändert wird.
Kataloge müssen das Schema ihrer Elemente kennen, wenn die App geladen wird. Ein Schema (auch als Shape bezeichnet) definiert den Namen und den Spaltentyp in einer Datenquelle. Zum Beispiel diese Tabelle:
[{A: "abc", B: 123}, {A: "def", B: 456}]
hat ein Schema mit einer Textspalte A und einer Zahlenspalte B.
In den meisten Fällen kann die Gallery das Schema aus der Datenquelle und den in der App verwendeten Ausdrücken ableiten. Wenn die Items-Eigenschaft jedoch auf die Ausgabe einer Canvas-Komponente oder eines Importsteuerelements festgelegt ist, kann der Katalog sein Schema zum Ladezeitpunkt nicht ermitteln, sodass die Ausgabetabelle möglicherweise noch nicht verfügbar ist und sich das Schema ändern kann. Die Galerie rendert keine Elemente, wenn sie ihr Schema nicht kennt.
Das gleiche Problem kann auftreten, wenn Elemente auf eine Variable festgelegt werden, die beim Laden der App nicht initialisiert wird.
Teilen Sie als Problemumgehung der Gallery das erwartete Schema mithilfe einer Variablen mit. Legen Sie "App.OnStart " auf Folgendes fest:
If(false, Set(GalleryData, [{A: "abc", B: 123}]), Set(GalleryData, []))
Auf diese Weise kann das System das Schema von GalleryData ableiten. Legen Sie die Items-Eigenschaft von Gallery auf GalleryData fest, und aktualisieren Sie sie dann bei Bedarf auf die tatsächliche Datenquelle.
Gehen Sie nicht davon aus, dass AllItems alle Elemente des Datasets enthält.
Die AllItems-Eigenschaft enthält die Elemente, die derzeit im sichtbaren Bereich der Galerie geladen sind – nicht alle Elemente in Items. AllItems können sich ändern, wenn der Benutzer scrollt, um weitere Elemente zu laden. In der Regel wird diese Eigenschaft verwendet, um auf Werte untergeordneter Steuerelemente zuzugreifen, mit denen der Benutzer gerade interagiert, was garantiert, dass diese Elemente geladen sind.
Verweisen Sie nicht auf ein Element in AllItems , wenn Sie nicht sicher sind, ob der Benutzer zu diesem Element gescrollt hat.
Ebenso ist AllItemsCount die Anzahl der elemente, die in die Ansicht geladen wurden, nicht die Gesamtzahl der Datensätze in "Items". Um die Gesamtzahl der Datensätze in Items zu erhalten, verwenden Sie CountRows(<expression used for Items property>).