IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Recherche rapide dans un TDBGrid


Sujet :

C++Builder

  1. #1
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut Recherche rapide dans un TDBGrid
    J'ai reformulé le titre de mon message sur la demande des modérateurs... j'espère que maintenant tout est réunis pour pouvoir être reçu correctement sur ce forum...

    Je dispose d'un TDBGrid associé à un datasource lui même associé à un dataset.
    Ce truc n'est pas optimal mais je ne peux pas le changer pour des raisons de continuité que je ne peux expliquer ici ...

    Bref, c'est une appli de gestion de CD qui fonctionne parfaitement bien mais j'aimerais ajouter une fonctionnalité :
    Quand un utilistateur appuie sur une touche du clavier, je voudrais que le premier enregistrement correspondant à cette touche ait le focus dans la grille.
    Par exemple, si il appuie sur R, je voudrais que le dataset se positionne tout seul sur les enregistrements commençants pas "R". Attention, je ne veux pas changer la requete SQL, je veux juste repositionner le dataSet.

    j'ai essayé ceci mais je suis bloqué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ( (Key >= 65 && Key <=90) || (Key >= 97 && Key <= 122)) 
          { 
            AnsiString Ch = GetCharByAscii(Key); 
            TDataSet *pDS = GrilleConsultation->DataSource->DataSet; 
            AnsiString fieldName = Ch + "*"; 
            TBookmark tB = *pDS->FieldByName(fieldName); 
            pDS->GotoBookmark((void *) fieldName.c_str()); 
          }

    Evidement, il plante en me disant qu'il ne connait aucun champ commençans par Ch* (f* par exemple).

    Comment faire ? je voudrais que ce ne soit pas trop lent non plus donc je voudrais éviter de reparcourir toutes la table car il peut y avoir à long terme plus de 500 enregistrements..

    merci beaucoup

  2. #2
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    Bonjour,
    Pourquoi ne pas utiliser la propriété Filter de DataSet.Car si j'ai bien compris tu utilises un DBGrid, relié a un Query (ou similaire) et donc on doit pouvoir travailler sur DBGrid->DataSource->DataSet->Filter.
    Par ex dans le OnKeyDown du DBGrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char C = Key;
    DBGrid->DataSource->DataSet->Filtered = false;
    DBGrid->DataSource->DataSet->Filter = AnsiString("Nom = '") + C + ("*'");
    DBGrid->DataSource->DataSet->Filtered = true;
    J'ai testé sur une de mes requetes, cela fonctionne. Mais cela 'extrait' un groupe d'enregistrement, j'espère que cela ressemble a ce que tu recherches...
    En esperant t'etre utile...

  3. #3
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    ça fonctionne effectivement bien mais ce n'est pas le résiultat escompté ...
    En effet, comme tu le fais remarquer, cette opération modifie ma requete et je ne le voudrais pas.

    J'aimerai seulement utiliser le GotoBookmark pour en quelques sortes "simuler" le click sur la grille.

    J'avais obtenu le même résultat que toi mais en 10 fois plus de lignes donc dans tous les cas, tu m'as bien aidé !!!
    Merci beaucoup .

  4. #4
    Membre éprouvé
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Par défaut
    (re)Bonsoir,
    Je crois que c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DBGrid->DataSource->DataSet->Locate();
    qu'il faudrait utiliser. Je suis en train de regarder les parametres attendus par Locate car je ne l'ai jamais utilisée (hou , la honte).
    Le premier qui trouve averti l'autre...

  5. #5
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    J'ai trouvé ceci qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TLocateOptions Opts;
    Variant locvalues="mon_titre";
    Opts.Clear();
    Opts << loPartialKey;
    FrmConsultation->GrilleConsultation->DataSource->DataSet->Locate("Titre",locvalues,Opts);
    Problème : ça ne fonctionne que si "mon_titre" est le titre EXACT du cd ... je voudrais pouvoir mettre "C*" par exemple mais ça marche pas. J'ai testé "C%" mais même résultat.

  6. #6
    Membre chevronné Avatar de Dinytro
    Profil pro
    Inscrit en
    Août 2003
    Messages
    402
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 402
    Par défaut
    C bon en Fait, ça fonctionne. Il faut pas mettre "A*" pour chercher les titre commençant pas A...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TLocateOptions Opts;
    Variant locvalues=ChU;
    Opts.Clear();
    Opts << loPartialKey;
    FrmConsultation->GrilleConsultation->DataSource->DataSet->Locate("Titre",locvalues,Opts);
    C'est le "loPartialKey;" qui fait tout le boulot. Il suffit de mettre A et il se charge du reste

    Merci beaucoup
    Tu m'as vraiment bien aidé !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recherche rapide dans un datagrid
    Par Etudiante_Ines dans le forum Silverlight
    Réponses: 1
    Dernier message: 02/06/2011, 23h45
  2. Recherche rapide dans une liste
    Par jblecanard dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/09/2008, 23h53
  3. la Recherche la Plus Rapide dans un tableau
    Par linuxeur dans le forum C
    Réponses: 10
    Dernier message: 23/05/2008, 00h07
  4. Recherche rapide dans un gros fichier excel
    Par cyberboy00 dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 16/04/2008, 14h56
  5. Réponses: 7
    Dernier message: 15/02/2006, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo