Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La Galleria è l'unico controllo nelle app canvas che può creare altri controlli. Ha un proprio ambito. Queste funzionalità avanzate possono causare comportamenti imprevisti quando la Gallery non è configurata correttamente. Questo articolo illustra le procedure consigliate e le raccomandazioni per l'uso dei controlli Gallery.
Suggerimento
Valuta l'uso di controlli moderni negli elementi della galleria, ove possibile. I controlli moderni sono progettati per ridurre al minimo i problemi comuni, come le attivazioni involontarie di OnChange, e offrire migliori opzioni di accessibilità e di stile. È anche possibile utilizzare Copilot in Power Apps per generare automaticamente un layout di galleria e una connessione dati.
Non modificare gli elementi della galleria dall'interno della galleria
È facile creare un comportamento instabile se OnChange o OnSelect di controlli secondari modifica gli Elementi della raccolta principale. Ad esempio, un Input di testo in una raccolta può avere la sua proprietà OnChange impostata su:
Patch(GalleryData, ThisItem, {Name: TextInput.Text})
In genere è normale. La maggior parte dei controlli attiva OnChange solo quando gli utenti ne modificano direttamente il valore. Tuttavia, i controlli seguenti possono causare problemi perché attivano OnChange anche quando il sistema modifica il valore:
Ad esempio, quando ComboBox.DefaultSelectedItems cambia, si attiva OnChange. Considera una Casella combinata in una Raccolta con DefaultSelectedItems impostato su First(ThisItem.A) e la proprietà OnChange impostata su:
UpdateIf(GalleryData, Name = ThisItem.Name, {
A: Table({
B: First(Self.SelectedItems).B
})
})
Questa espressione aggiorna un record nell'origine dati della galleria che corrisponde al nome dell'elemento corrente, sostituendo la colonna A con una nuova tabella.
Ciò provoca un ciclo infinito. Quando l'utente modifica il valore della casella combinata, si attiva OnChange, che aggiorna GalleryData, che modifica DefaultSelectedItems (perché First(ThisItem.A) fa riferimento a una nuova tabella), che attiva di nuovo OnChange e così via.
Per evitare cicli infiniti, usare controlli moderni o altri controlli che non vengono attivati OnChange quando cambiano i dati.
Prestazioni lente durante l'applicazione di patch agli elementi
Anche se si evitano cicli indesiderati, la modifica o l'aggiornamento degli elementi di Gallery possono essere lenti se la raccolta contiene molti elementi. La raccolta non aggiorna solo le righe associate ai record modificati, in alcuni casi ricarica tutti gli elementi. Ciò accade a causa della natura poco strutturata delle origini dati, che rende difficile per la Gallery determinare se un singolo record o l'intera origine dati abbiano subito modifiche.
Gallery.Selected può cambiare inaspettatamente
La proprietà Selected di Gallery è un obiettivo in continuo cambiamento. Può cambiare senza interazione dell'utente quando si verifica una delle seguenti operazioni:
- Gallery.Default modifiche
- Modifiche a Gallery.Items
- Le fonti dati vengono aggiornate o modificate
Se si desidera una copia stabile dell'elemento selezionato dall'utente, archiviarla in una variabile. Ad esempio, impostare la proprietà OnSelect della raccolta su:
Set(CurrentItem, Self.Selected)
CurrentItem Usare quindi altrove nell'app per fare riferimento all'elemento selezionato dall'utente più di recente, anziché alla proprietà Selected aggiornata dal sistema.
Non utilizzare Gallery.Selected nell'evento di un controllo figlio
La proprietà Selezionati della Galleria cambia quando un utente seleziona un elemento. Tuttavia, questo evento non viene sincronizzato con gli eventi di controllo figlio. Fare riferimento a Gallery.Selected negli eventi di un controllo figlio può portare a risultati imprevisti.
Ad esempio, quando un utente seleziona una casella di controllo in una raccolta, gli eventi seguenti si verificano in un ordine non specificato:
Checkbox.OnSelectCheckbox.OnCheck-
Gallery.Selectedmodifiche alla riga appena selezionata
Poiché l'ordine di questi eventi non è risolto, l'uso Gallery.Selected di in Checkbox.OnSelect potrebbe comunque fare riferimento alla riga selezionata in precedenza.
Per evitare problemi di temporizzazione, non usare Gallery.Selected negli eventi dei controlli figlio. Se devi rispondere alle modifiche a Gallery.Selected, usa l'evento OnSelect di Gallery.
Assicurati che la Raccolta conosca lo schema dei suoi elementi
L'impostazione Gallery.Items di una variabile o l'output di un componente Canvas può produrre risultati imprevisti, a seconda del momento in cui la variabile viene impostata o modificata.
Le gallerie devono conoscere lo schema dei loro Elementi all'avvio dell'app. Uno schema (detto anche forma) definisce il nome e il tipo di colonne in un'origine dati. Ad esempio, questa tabella:
[{A: "abc", B: 123}, {A: "def", B: 456}]
ha uno schema con una colonna A di testo e una colonna numerica B.
Nella maggior parte dei casi, la Gallery può dedurre lo schema dall'origine dati e dalle espressioni usate nell'app. Tuttavia, se la proprietà Items è impostata sull'output di un componente Canvas o di un controllo Import, la raccolta non può determinare lo schema in fase di caricamento in modo che la tabella di output potrebbe non essere ancora disponibile e lo schema potrebbe cambiare. La Raccolta non renderà alcun elemento quando non conosce il suo schema.
Lo stesso problema può verificarsi quando Items è impostato su una variabile che non viene inizializzata quando l'app viene caricata.
Come soluzione alternativa, indica lo schema previsto alla Gallery usando una variabile. Imposta App.OnStart su:
If(false, Set(GalleryData, [{A: "abc", B: 123}]), Set(GalleryData, []))
Ciò consente al sistema di dedurre lo schema di GalleryData. Impostare la proprietà Items della raccolta su GalleryData, quindi aggiornarla all'origine dati effettiva in base alle esigenze.
Non dare per scontato che AllItems contenga tutti gli elementi del suo set di dati
La proprietà AllItems contiene gli elementi attualmente caricati nell'area visibile della raccolta, non tutti gli elementi in Items. AllItems può cambiare man mano che l'utente scorre per caricare più elementi. In genere, questa proprietà viene utilizzata per accedere ai valori dei controlli figlio con cui l'utente sta attualmente interagendo, garantendo il caricamento di tali elementi.
Non fare riferimento a un elemento in AllItems se non si è certi che l'utente abbia eseguito lo scorrimento verso tale elemento.
Analogamente, AllItemsCount è il numero di elementi caricati nella visualizzazione, non il numero totale di record in Items. Per ottenere il numero totale di record in Items, usare CountRows(<expression used for Items property>).