Vue d'ensemble des sources de donnees

Le trait DataSource

Toutes les donnees de lignes dans rs-grid sont accessibles via le trait DataSource :

pub trait DataSource: Debug {
    fn row_count(&self) -> u64;
    fn get_cell(&self, row: u64, col_key: &str) -> Option<String>;
    fn clone_box(&self) -> Option<Box<dyn DataSource>>;
    fn set_cell(&mut self, row: u64, col_key: &str, value: String) { }
    fn cell_status(&self, row: u64, col_key: &str) -> CellStatus { ... }
}

Cette abstraction permet a rs-grid de fonctionner avec des donnees en memoire, des donnees virtuelles (calculees) ou des donnees paginee cote serveur via la meme interface.

CellStatus

#[non_exhaustive]
pub enum CellStatus {
    Ready(String),  // value is available
    Loading,        // page not yet fetched (async sources)
    Absent,         // fetched but no value
}

Le renderer utilise CellStatus pour decider s'il doit dessiner la valeur de la cellule, un placeholder de chargement (skeleton), ou rien.

Implementations integrees

SourceMemoireEditableClonableIdeal pour
VecDataSourceO(n)OuiOuiJeux de donnees petits a moyens
FnDataSourceO(1)Non*NonDonnees virtuelles/calculees, demos
PageCacheDataSourceO(pages)NonOuiDonnees paginee cote serveur
Note

*FnDataSource est en lecture seule, mais l'edition fonctionne tout de meme via la couche de patches dans GridModel. Voir Modele de donnees pour plus de details.

Mode client-side vs server-side

Definissez model.mode pour controler ou s'execute la logique de tri/filtrage :

model.mode = DataSourceMode::ServerSide;
ClientSide (par defaut)ServerSide
Triapply_sort() trie localementNo-op (le serveur trie)
Filtreapply_filter() filtre localementNo-op (le serveur filtre)
RechercheParcourt les cellules localesParcourt les cellules locales
Nombre de lignesdata.row_count()Mis a jour via SetTotalRowCount

En mode server-side, votre application est responsable de :

  1. Ecouter les changements de tri/filtre
  2. Recuperer les nouvelles donnees depuis le serveur
  3. Mettre a jour le PageCacheDataSource
  4. Envoyer NotifyPageLoaded pour declencher un nouveau rendu