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# Discussion :

les élements d'une listbox, à partir de la bd, avec linq to sql [Débutant]


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 25
    Points : 19
    Points
    19
    Par défaut les élements d'une listbox, à partir de la bd, avec linq to sql
    Bonjour (bonsoir amis du soir),
    Je suis débutant en c# et je voudrai que vous m'aidiez sur un petit point, :
    Je viens de créer une listbox, et je ne sais pas comment je peux la remplir de la base de données comme suit:

    La "descProc" de tous les enregistrement "agent" lié au projet de "idProjet" = 1 triés par "date_creation" des "agent" de la plus ancienne à la plus recente (la plus recente en dernier)
    Pour tout eclaircissement je suis là, et Merci infiniment car j'ai vraiment besoin de le faire le plus tot posible et cela m'aidera en plus à comprendre franchir la première étape pour apprendre linq to sql, Merciiiiii
    Images attachées Images attachées  

  2. #2
    Membre du Club
    Homme Profil pro
    Developpeur .Net
    Inscrit en
    Mai 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations professionnelles :
    Activité : Developpeur .Net
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2011
    Messages : 32
    Points : 40
    Points
    40
    Par défaut Les elements d'une ListBox
    Il est beaucoup plus simple et facile d'utilise Entity Framework pour resoudre votre probleme:
    - Cliquez droite sur votre projet -> Add new Item et choisissez ADO.NET Entity Data Model (biensur donnez le nom de votre choix). un fichier .edmx

    - Choisissez dans le wizard Generate from database -> selectionnez votre base de donnees et les tables que vous souhaitez utiliser(Nomez aussi votre entite ex: MyClientsEntity) et That's it!

    - je prefere toujours creer une classe dans laquelle ma logique sera effectue (public class MyDataProvider)
    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
     
    public class MyDataProvider
    {
            //Notez qu'ici c'est presque du sql vous n'aurez donc pas de probleme
            //Vous pouvez faire plus complexe en ajoutant: Where, Join, Order by, 
           // And... selon vos desires.
     
            public List<Agent> GetAllAgents()
            {
                MyClientsEntity entity = new MyClientsEntity ();
                //retourne tous les agents de la table Agent
                return (from ag in entity.Agent select ag).ToList();
            }
    }
    //et pour votre ListBox
    MyDataProvider provider=new MyDataProvider();
    MyListBox.DataSource = provider.GetAllAgents();
    Biensur ca prendra quelques heures pour s'habituer mais c'est vraiment COOL de travailler avec Ado.Net Entity framework.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    Je prends pour acquis que le nombre de résultats est raisonable, et que par conséquent pas besoin de paginer ton truc (sinon, il ne faut pas utiliser une listbox)

    Pour récupérer les données, ceci devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    var result = (from a in model.agent join p in model.processus on a.IdProc equals p.IdProc where a.idProjet==1 orderby a.date_creation ascending select p.DescProc).ToArray();

    Ce qui, en considérant qu'il vaut mieux ne pas appeler une BDD depuis le thread UI, donnera le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // Démarre une tâche asynchrone pour charger depuis la BDD
    System.Threading.Tasks.Task.Factory.StartNew(() =>
                {
                    return (from a in model.agent join p in model.processus on a.IdProc equals p.IdProc where a.idProjet == 1 orderby a.date_creation ascending select p.DescProc).ToArray();
                }).ContinueWith((t)=>{
                    // Continue sur une tâche synchrone pour afficher les résultats dans la listbox
                    if (t.Exception != null)
                        MessageBox.Show("Error occured", t.Exception.Message);
                    else
                        maListBox.Items = t.Result;
                }, System.Threading.Tasks.TaskScheduler.FromCurrentSynchronizationContext());

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 25
    Points : 19
    Points
    19
    Par défaut
    Merci a vous deux,
    J'ai essayé ce que tu m'as proposé icareo, sauf qu'il me souligne model dans model.agent et model.processus, je suis connécté à ma bd et tout, est ce que je devrai modifier ce mot par quelque chose d'autre ou quoi?? excusez moi ignorance..

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    "model" est sensé être une variable que tu as initialisée auparavant, de la même manière que l'a fait jonanirina.

    En créant ton modèle d'entité (ce que tu as posté comme capture d'écran), visual studio génère automatiquement un certain nombre de classes :

    - Une par table que tu as référencé : Ce sont tes classes d'entité. (tu pourras constater via l'autocomplétition de visual studio l'existence dans ton projet des classes : projet, agent, processus...). Leur structure (i.e. leurs propriétés) correspond aux champs qu'on voit sur ta capture d'écran

    - Une qui représente ta base de donnée : Elle contient des "sets d'entités" : autrement dit, la "matérialisation" en .Net de ta base de donnée et de tes tables.


    C'est cette dernière qu'il faut instancier : Je ne peux pas te dire ton nom : C'est toi qui l'a spécifié lors de la création de ton modèle ADO.Net (dans l'assistant qui a conduit à la création de tes tables)
    A priori, il doit ressembler au nom de ton fichier. (regarde ton fichier .edmx : quand tu déplies son arborescence, tu dois avoir un ***.Designer.cs : Il contient toutes tes classes, et en tête, tu pourras voir ta classe ObjectContext)

    Pour simplifier, tu aurras donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class Program{
        static TonObjectContext model;
        public static void Main(string[] args){
            model = new TonObjectContext();
            // le code que je t'ai montré plus haut
        }
    }

    PS : Essaie de n'instancier qu'une seule fois ta classe qui représente la base de données (c'est pour ça que je l'ai mise static et non locale) : C'est une opération trop lourde pour être faite à chaque requête (d'autant plus qu'elle engendre une connexion à la BDD qui peut être longue alors qu'elle peut être réutilisée plus tard)

  6. #6
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 25
    Points : 19
    Points
    19
    Par défaut
    D’accord, Ce point est nickel,
    Là encore il me donne 3 erreurs autre part sur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listBox1.Items = t.Result;
    on me dit que :

    Erreur 1 La propriété ou l'indexeur 'System.Windows.Forms.ListBox.Items' ne peut pas être assigné -- il est en lecture seule C:\Users\zikog\Documents\Visual Studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Onglets.cs 41 21 WindowsFormsApplication2

    Erreur 2 Impossible de convertir implicitement le type 'string[]' en 'System.Windows.Forms.ListBox.ObjectCollection' C:\Users\zikog\Documents\Visual Studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Onglets.cs 41 38 WindowsFormsApplication2

    Erreur 3 'System.Threading.Tasks.Task' ne contient pas une définition pour 'Result' et aucune méthode d'extension 'Result' acceptant un premier argument de type 'System.Threading.Tasks.Task' n'a été trouvée (une directive using ou une référence d'assembly est-elle manquante*?) C:\Users\zikog\Documents\Visual Studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Onglets.cs 41 40 WindowsFormsApplication2
    Merci de m’éclaircir ce point encore

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 25
    Points : 19
    Points
    19
    Par défaut
    j'ai mis a la place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listBox1.Items.AddRange( t.Result);
    et cela a marché merciiiii enormémennntttttt,,

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 135
    Points : 179
    Points
    179
    Par défaut
    Ah oui... bien vu, c'est ma faute

    You're welcome.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/06/2012, 13h51
  2. Réponses: 5
    Dernier message: 15/04/2011, 13h10
  3. Obtenir les champs d'une listbox à partir d'un fichier.
    Par daemon rom dans le forum GWT et Vaadin
    Réponses: 3
    Dernier message: 21/08/2008, 12h05
  4. [VBA-E] Séparer les colonnes d'une listbox par des lignes?
    Par mulot03 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/05/2006, 14h03
  5. Réponses: 5
    Dernier message: 22/02/2006, 17h32

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