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

Composants graphiques Android Discussion :

Clics longs sur une ListView affichant des enregistrements SQLite pour en supprimer


Sujet :

Composants graphiques Android

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut Clics longs sur une ListView affichant des enregistrements SQLite pour en supprimer
    Bonjour à tous,

    Je me permets de créer ce topic suite à celui-ci: http://www.developpez.net/forums/d12...ableau-string/

    J'ai réussi à afficher dans une ListView le contenu d'une base de données SQLite, qui contient dans une table Reservation les attributs ID (long), Reference et LastName (String), et Reservation étant un objet Java créé par moi-même, ayant ces 3 attributs.

    Je voudrais à présent que lorsque je fasse un clique long sur un élément de cette ListView, il m'affiche une boite de dialogue pour me demander confirmation de la suppression de l'enregistrement cliqué, puis le supprime de la ListView et de la base SQLite.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    /* Display the bdd */
            SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this.getBaseContext(), R.layout.flight_book_list, c, from, to);
            ReservationList.setAdapter(mAdapter);
            
            //Gérer le clic long sur un élément de la listView
            ReservationList.setOnItemLongClickListener (new OnItemLongClickListener() 
            {
            	public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
            	{
            		return onLongListItemClick(view, position, id);
            	}
    	        protected boolean onLongListItemClick(View v, final int pos, long id) 
    	        {
    	           final String str=ReservationList.getItemAtPosition(pos).toString();
    	           Log.i("ListView", "onLongListItemClick stirng=" + str);
    	           AlertDialog.Builder builder = new AlertDialog.Builder(getBaseContext());
    	           builder.setMessage("Delete this entry from Flight Book?")
    	           .setCancelable(false)
    	           .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
    	           {
    	        	   public void onClick(DialogInterface dialog, int id) 
    	        	   {
    	        		   
    	        	   }
    	           })
    	           .setNegativeButton("No", new DialogInterface.OnClickListener() 
    	           {
    	               public void onClick(DialogInterface dialog, int id) 
    	               {
    	                   dialog.cancel();
    	               }
    	           });
    	           AlertDialog alert = builder.create();
    	           alert.show();
    	           return true;
                }
            });
    Quand je clique longuement sur un enregistrement de la ListView, l'application (comme à sa grande habitude de ne pas se casser la tête) plante.

    Voici le ChatDeJournal correspondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    11-18 19:55:03.996: E/AndroidRuntime(30759): FATAL EXCEPTION: main
    11-18 19:55:03.996: E/AndroidRuntime(30759): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.view.ViewRootImpl.setView(ViewRootImpl.java:589)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.app.Dialog.show(Dialog.java:277)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at com.example.mon.app.FlightBook$1.onLongListItemClick(FlightBook.java:68)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at com.example.mon.app.FlightBook$1.onItemLongClick(FlightBook.java:47)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.widget.AbsListView.performLongPress(AbsListView.java:2927)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:2877)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.os.Handler.handleCallback(Handler.java:615)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.os.Handler.dispatchMessage(Handler.java:92)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.os.Looper.loop(Looper.java:137)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at android.app.ActivityThread.main(ActivityThread.java:4978)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at java.lang.reflect.Method.invokeNative(Native Method)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at java.lang.reflect.Method.invoke(Method.java:511)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
    11-18 19:55:03.996: E/AndroidRuntime(30759): 	at dalvik.system.NativeStart.main(Native Method)
    11-18 19:55:05.431: I/Process(30759): Sending signal. PID: 30759 SIG: 9
    D'après ce que j'ai vu sur le net, ce message (en rouge) veut dire que j'ai mal choisi mon Contexte. Or, si je mets this, il me met une erreur de compilation sous Eclipse. Je ne peux donc pas faire autrement...

    Pouvez-vous m'expliquer pourquoi ça ne marche pas? J'ai du mal à comprendre.
    Merci d'avance.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut
    Essaye new AlertDialog.Builder( GetApplicationContext());

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Déjà fait, même résultat. J'avais oublié de le préciser.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Yééé, j'ai trouvé!
    Il faut mettre NomDeLActivitéCourante.this au lieu de getBaseContext(), ce qui donne dans mon cas:

    AlertDialog.Builder builder = new AlertDialog.Builder(FlightBook.this);
    Slurp!

    === EDIT ===

    Euh, zut... j'ai marqué résolu un peu trop vite!
    En fait, je n'arrive pas à savoir ce que je dois mettre dans les accolades du fait que l'user clique sur "Yes" dans la confirmation. C'est bête, non? ^^

    Si quelqu'un peut me donner un indice...
    Merci d'avance.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Points : 161
    Points
    161
    Par défaut
    Tu veux faire quoi exactement lorsque l'utilisateur clique sur OUI

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Supprimer l'enregistrement sur lequel j'ai longuement cliqué de la base SQLite et de la ListView.
    Mais je ne sais pas comment lui dire "L'enregistrement sur lequel je viens de cliquer"...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Ca fait plusieurs jours que je cherche un p*****n de tuto sur Google qui explique ce qu'il faut faire, pas moyen!

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 20
    Points : 22
    Points
    22
    Par défaut
    Dans un premier temps, il faut que tu recupere l'objet model associé a ton clic. Pour se faire tu as plusieur solutions :
    • Soit tu customise ta ListView avec un Adapter (ArrayAdapter par exemple) pour lier un element graphic a un objet model. Ce qui est le plus propre.
    • Soit tu utilise l'index de position fourni par l'event onItemLongClick sur la list utilisé pour construire ta listview (par exemple maliste.getItem(pos))


    Ensuite tu n'as plus qu'a utiliser cette donnée pour faire les actions necessaire sur ta DB

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Ben voilà, c'est bien ce que je pensais, j'ai choisi ta solution 2, mais quand je clique sur "Yes", l'app plante et il me met ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    11-24 15:21:43.795: E/AndroidRuntime(32675): FATAL EXCEPTION: main
    11-24 15:21:43.795: E/AndroidRuntime(32675): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.mon.app/databases/MaBawz.db
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1489)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at com.example.mon.app.ReservationsBDD.removeReservationWithID(ReservationsBDD.java:76)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at com.example.mon.app.FlightBook$1$1.onClick(FlightBook.java:65)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at android.os.Looper.loop(Looper.java:137)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at android.app.ActivityThread.main(ActivityThread.java:4978)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at java.lang.reflect.Method.invokeNative(Native Method)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at java.lang.reflect.Method.invoke(Method.java:511)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
    11-24 15:21:43.795: E/AndroidRuntime(32675): 	at dalvik.system.NativeStart.main(Native Method)
    Voici le code employé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    package com.example.mon.app;
     
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.database.Cursor;
    import android.os.Bundle;
    import android.support.v4.widget.SimpleCursorAdapter;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemLongClickListener;
    import android.widget.ListView;
     
    public class FlightBook extends Activity 
    {
    	private ListView ReservationList = null;
     
        @SuppressWarnings("deprecation")
    	@Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_flight_book);
     
            ReservationList = (ListView) findViewById(R.id.flightList);
     
            //Initialiser la base de données
            final ReservationsBDD rdb = new ReservationsBDD(this);
            rdb.open();
     
            Cursor c = rdb.queueAll();
            startManagingCursor(c);
     
            String[] from = new String[]{MaBaseSQLite.getColReference(), MaBaseSQLite.getColLastname()};
            int[] to = new int[]{R.id.reference_entry, R.id.lastname_entry};
     
            /* Display the bdd */
            final SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this.getBaseContext(), R.layout.flight_book_list, c, from, to);
            ReservationList.setAdapter(mAdapter);
     
            //Gérer le clic long sur un élément de la listView
            ReservationList.setOnItemLongClickListener (new OnItemLongClickListener() 
            {
            	long selectedItemID = 0;
     
            	public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) 
            	{
                	//selectedItemID = ((View) parent.getItemAtPosition(position)).getId();
            		return onLongListItemClick(view, position, id);
            	}
    	        protected boolean onLongListItemClick(final View v, final int pos, long id) 
    	        {
    	           final String str=ReservationList.getItemAtPosition(pos).toString();
    	           Log.i("ListView", "onLongListItemClick string=" + str);
    	           AlertDialog.Builder builder = new AlertDialog.Builder(FlightBook.this);
    	           builder.setMessage("Delete this entry from Flight Book?")
    	           .setCancelable(false)
    	           .setPositiveButton("Yes", new DialogInterface.OnClickListener() 
    	           {
    	        	   public void onClick(DialogInterface dialog, int id) 
    	        	   {
    	        		   Log.i("ID",""+pos);
    	        		   rdb.removeReservationWithID((int)mAdapter.getItemId(pos));
    	        		   //mAdapter.remove((Reservation) mAdapter.getItem(pos));
    	        		   //rdb.removeReservationWithReference(res.getReference());
    	        		   //((Cursor) mAdapter).requery();
     
    	        		   //Log.i("id",String.valueOf(selectedItemID));
    	        		   //rdb.removeReservationWithID(id);
    	        	   }
    	           })
    	           .setNegativeButton("No", new DialogInterface.OnClickListener() 
    	           {
    	               public void onClick(DialogInterface dialog, int id) 
    	               {
    	                   dialog.cancel();
    	               }
    	           });
    	           AlertDialog alert = builder.create();
    	           alert.show();
    	           return true;
                }
            });
     
            rdb.close();
        }
     
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_flight_book, menu);
            return true;
        }
    }
    Là je ne comprends plus rien et je suis bloqué depuis plusieurs jours...
    Merci de votre aide.

    === EDIT ===

    Oh NoOoOoOoOoOoOoN!!! Comment je ne l'avais pas vu!!!
    C'est le rdb.close(); qui, à son emplacement provoquait cette erreur!
    C'est bien fait pour moi! Bon, reste plus qu'à comprendre pourquoi ma liste ne se met pas à jour immédiatement après. Je pense en revanche que la suppression se fait bien dans la base, parce que quand je sors de l'activité et que j'y reviens, la liste se met bien à jour.
    Si vous passez by assez vite, n'hésitez pas à m'apporter la réponse, parce que je sens que je suis reparti pour patauger encore un moment. ^^

    === EDIT 2 ===

    J'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public void onClick(DialogInterface dialog, int id) 
    	        	   {
    	        		   Log.i("ID",""+pos);
    	        		   rdb.removeReservationWithID((int)mAdapter.getItemId(pos));
    mAdapter.getItem(pos)); 
    mAdapter.notifyDataSetChanged();
    	        	   }
    Résultat: marche pas (ne fait rien)

    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((Cursor)mAdapter).requery();
    Résultat: plante l'app avec ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    11-24 15:49:39.625: E/AndroidRuntime(2737): java.lang.ClassCastException: android.support.v4.widget.SimpleCursorAdapter cannot be cast to android.database.Cursor
    J'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    myListView.invalidateViews();
    Résultat: Eclipse corrige ça en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((AbsListView) mAdapter).invalidateViews();
    et c'est souligné en rouge (cannot cast).
    Le con...

    J'ai vu tout ça ici: http://stackoverflow.com/questions/2...droid-listview

  10. #10
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Le 'cast' java est facile, mais comme dans tous les langages, un 'cast' veut dire un problème de conception (sauf dans des cas précis de générics).

    Exemple:

    ReservationList = (ListView) findViewById(R.id.flightList);

    Ben non... la code complet devrait être du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    View v = findViewById(R.id.flightList);
    if (v == null)
        throw new IllegalStateException("No view matching #"+R.id.flightList);
    if (!(v instanceof ListView))    
        throw new IllegalStateException("View#"+R.id.flightList+ " is a "+v.getClass()+": a ListView was expected.");
    ReservationList = (ListView) v;
    (au passage ReservationList c'est une classe pour moi, seuls les 'types' java commencent par une majuscule... mais c'est un détail)

    CursorAdapter n'est pas un Cursor (c'est juste un Adapter)
    invalidateViews() ne fait que redessiner les views...

    En fait, il faut obtenir un nouveau cursor... et utiser la fonction swapCursor() de l'adapter.
    Ou alors appeler getCursor() sur le cursor adapter, et faire un requery() dessuis.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Merci pour ta réponse. J'avais effectivement exploré cette piste, mais je n'ai trouvé aucun exemple de code ou tuto qui l'explique bien. Tu peux me montrer un exemple, s'il te plait?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    C'est bon, un gus sur StackOverflow m'a filé la solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void onClick(DialogInterface dialog, int id) 
    	        	   {
    	        		   Log.i("ID",""+pos);
    	        		   rdb.removeReservationWithID((int)mAdapter.getItemId(pos));
    	        		   
    	        		   //Refresh ListView automatically
    	                           Cursor c = rdb.queueAll();
    	        	           startManagingCursor(c);
    	        	           mAdapter.changeCursor(c);
    	        	   }

  13. #13
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Attention changeCursor ferme le cursor existant de l'adapter
    swapCursor non
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Merci pour ta réponse.

    Je me suis longuement intéressé à l'utilisation des ContentProvider et CursorLoader pour remplacer les fonctions "deprecated" de Eclipse. Ce ne sont franchement pas des notions simples, et de plus assez mal expliquées sur les tutos du web que j'aie pu trouver. J'ai dû en mélanger plusieurs et m'y concentrer une bonne journée entière pour arriver à en fabriquer.

    Je me permets donc de poster un autre topic qui fait suite à celui-là, histoire d'aller jusqu'au bout, bien faire les choses et en aider un max qui galèreraient autant que moi dans un avenir proche ou lointain.

    http://www.developpez.net/forums/d12...r/#post7008409

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

Discussions similaires

  1. [MySQL] Afficher des enregistrements à partir d'une liste
    Par ljuboja78 dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 13/02/2009, 01h03
  2. Réponses: 30
    Dernier message: 09/01/2009, 10h20
  3. Réponses: 5
    Dernier message: 03/09/2007, 21h36
  4. Réponses: 1
    Dernier message: 25/03/2007, 19h20
  5. Afficher des enregistrements sur deux colonnes
    Par Dauphind dans le forum Access
    Réponses: 1
    Dernier message: 22/06/2006, 15h16

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