wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 3

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» [wxGrid | wxSheet] Avoir la plage de données complète de la sélection
Détails du snippet : [wxGrid | wxSheet] Avoir la plage de données complète de la sélection
Informations sur l'auteur de ce snippet :


Hors ligne
mick009 (Membre)
Inscrit le : 03-04-2008
Messages: 123
Snippets: 3
Tutoriels: 0
Introduction / Description :
Bonjour à tous et à toutes,
Comme l'indique le titre de ce snippet, je vais vous indiquer comment, avec une méthode,
obtenir la plage de données complète de la sélection d'un wxGrid.
En gros, il suffit d'"additionner" les méthodes que nous proposent la classe wxGrid.

[EDIT] : j'ai vu que si on sélectionnait une ligne ou une colonne entière avec les "headers" (c'est-à-dire les têtes de colonne), la fonction ne le prenait pas. Il suffit pour cela d'utiliser la méthode GetSelectedRows() et GetSelectedCols()

[Re-EDIT] : Avoir la sélection avec wxSheet, ainsi que les coordonnées de la cellule courante
[Re-EDIT 2] : Ajout d'une méthode pour avoir, séparément, un array qui contient toutes les cellules sélectionnés sauf celles qui apparaissent à l'écran et de l'autre, celles qui apparaissent à l'écran et qui sont sélectionnés ! (wxSheet)
Contenu du snippet :
Alors voici la méthode !

Grid est une classe dérivant de wxGrid

Code Cpp:

 
wxGridCellCoordsArray Grid::getCellsSelectionned(){
 
    /* On obtient les coordonnées des cellules sélectionnées */
    wxGridCellCoordsArray ArrayTopLeft = GetSelectionBlockTopLeft();
    wxGridCellCoordsArray ArrayBottomRight = GetSelectionBlockBottomRight();
    wxGridCellCoordsArray ArrayCellSelectionned = GetSelectedCells();
    wxArrayInt ArrayRowsSelectionned = GetSelectedRows();
    wxArrayInt ArrayColsSelectionned = GetSelectedCols();
    wxGridCellCoordsArray Retour;
 
    /* Boucle pour lire les coordonnées d'une zone de cellule */
    for(size_t i = 0 ; i < ArrayTopLeft.GetCount() ; i++){
 
        /* On obtient les coordoonées des zones sélectionnées */
        wxGridCellCoords CoordonnesTopLeft = ArrayTopLeft[i];
        wxGridCellCoords CoordonnesBottomRight = ArrayBottomRight[i];
 
        /* Boucle pour lister les colonnes sélectionnées */
        for(int y = CoordonnesBottomRight.GetCol() ; y >= CoordonnesTopLeft.GetCol() ;
                --y){
 
            /* Boucle pour lister les coordonnées dans la ligne */
            for(int w = CoordonnesBottomRight.GetRow() ; w >= CoordonnesTopLeft.GetRow() ;
                    --w){
 
                /* On ajoute dans la variable retour */
                wxGridCellCoords Ajout(w, y);
                Retour.Add(Ajout);
            }
        }
    }
 
    /* Boucle pour lire les coordonnées des cellules sélectionnées par CTRL */
    for(size_t i = 0 ; i < ArrayCellSelectionned.GetCount() ; i++){
 
        /* On obtient les coordonnées et on le rajoute dans l'array */
        wxGridCellCoords Ajout = ArrayCellSelectionned[i];
        Retour.Add(Ajout);
    }
 
    /* Boucle pour sélectionner la case "focus" */
    if(ArrayTopLeft.GetCount() == 0){
 
        /* On obtient les coordonnées de cette case */
        int row = GetGridCursorRow();
        int col = GetGridCursorCol();
 
        /* Et on l'ajoute dans la variable Retour */
        wxGridCellCoords Ajout(row, col);
        Retour.Add(Ajout);
    }
 
    /* Boucle pour lire les lignes (rows) sélectionnés */
    for(int row = 0 ; row < ArrayRowsSelectionned.GetCount() ; row++){
 
        /* On lit tous les carreaux de la ligne (autant qu'il y a de colonnes) */
        for(int col = 0 ; col < GetNumberCols() ; col++){
 
            wxGridCellCoords Ajout(row, col);
            Retour.Add(Ajout);
        }
    }
 
    /* Boucle pour lire les colonnes (cols) sélectionnés */
    for(int col = 0 ; col < ArrayColsSelectionned.GetCount() ; col++){
 
        /* On lit tous les carreaux de la colonne (autant qu'il y a de lignes) */
        for(int row = 0 ; col < GetNumberRows() ; col++){
 
            wxGridCellCoords Ajout(row, col);
            Retour.Add(Ajout);
        }
    }
 
 
    return Retour;
}
 



Maintenant avec wxSheet, vous verrez que c'est bien plus simple !
Cependant, l'absence de documentation m'a obligé à rechercher ceci pendant des heures.... :

Code Cpp:

wxArraySheetCoords Grid::getSelection(){
 
    /* Création et assignation des variables */
    wxSheetBlock Selection = GetSelection()->GetBoundingBlock();
    wxArraySheetCoords ArraySelection = Selection.GetArrayCoords();
    ArraySelection.Add(GetGridCursorCell());
 
    return ArraySelection;
}

Vous remarquerez qu'on utilise un wxArraySheetCoords qui contient en fait des wxSheetCoords


Avoir les coordonnées de la case "focus" (Attention : il serait peut-être préférable pour éviter les bugs, de faire un HasFocus() ) :

Code Cpp:

 
if(HasFocus())
     wxSheetCoords CoordFocus = GetGridCursorCell();


Et enfin, une fonction qui permet d'avoir tous les coordonnées sélectionnés sauf celles qui apparaissent à l'écran, et les coordonnées sélectionnées de celles qui apparaissent à l'écran (avec wxSheet) :

Code Cpp:

wxArraySheetCoords Grid::getSelectionScreen(wxArraySheetCoords *ArraySelection){
 
    /* Création et assignation des variables */
    wxArraySheetCoords ArrayScreen = GetVisibleGridCellsBlock().GetArrayCoords();
    wxArraySheetCoords retour;
    int find;
 
    /* Lecture de l'array */
    for(int i = 0 ; i < ArrayScreen.GetCount() ; i++){
 
        for(int y = 0 ; y < ArraySelection->GetCount() ; y++){
 
            if(ArrayScreen.Item(i) == ArraySelection->Item(y))
                retour.Add(ArraySelection->Detach(y));
        }
    }
 
    return retour;
}
Explications finales :
Elle retourne un wxGridCellCoordsArray qui agit comme un array. Celui-ci possède des wxGridCellCoords (http:/www.sandman.uklinux.net/wxgrid/do … oords.html) qui peuvent-être très facilement manipuler ! Au moins cette fonction rassemble tous les modes de sélection !

Si vous pouvez proposez des arrangements, faites donc !
J'aime bien voir le code des autres afin de pouvoir m'améliorer.
Commentaires

Il n'y a pas encore de commentaire pour ce snippet.
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» [wxGrid | wxSheet] Avoir la plage de données complète de la sélection