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

Windows Presentation Foundation Discussion :

Récupérer plusieurs valeurs d'une table depuis une combobox


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 28
    Points : 24
    Points
    24
    Par défaut Récupérer plusieurs valeurs d'une table depuis une combobox
    Bonjour à tous,

    Je m'exerce un peu en C# en ce moment et je sèche un peu devant un problème.

    J'ai créer une table avec id,nom,prenom.
    Ma combobox se remplit donc automatiquement avec les id de ma table et après sélection, je clic sur un bouton qui m'affiche une fenêtre où il est noté : "L'ID x correspond à l'utilisateur y" où y correspond au nom ou prenom.
    J'aimerais pouvoir récupérer le prenom et le nom en même temps dans la même fenêtre.

    Mon xaml :

    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
     
    <Window x:Class="testLiaisonDB.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
            <Grid>
            <StackPanel Orientation="Horizontal" Width="390" Height="24">
                <Label Content="Select ID :" Height="22" HorizontalAlignment="Right"></Label>
                <ComboBox Name="select_id" Width="120" Height="22" ItemsSource="{Binding}"></ComboBox>
                <StackPanel>
                    <Button Margin="26,0" Name="button_id" Content="Go!" Width="70" Height="20" Click="btnId_click"></Button>
                </StackPanel>
            </StackPanel>
     
            </Grid>
    </Window>
    Le code behind :

    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
     
    namespace testLiaisonDB
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                BindComboBox(select_id);
            }
     
            public void BindComboBox(ComboBox ComboBoxName)
            {
                SqlConnection conn = new SqlConnection("maStringDeConnection");
                SqlDataAdapter da = new SqlDataAdapter("SELECT id, nom, prenom FROM testTableAntonin", conn);
                DataSet ds = new DataSet();
                da.Fill(ds,"testTableAntonin");
                ComboBoxName.ItemsSource = ds.Tables[0].DefaultView;
                ComboBoxName.DisplayMemberPath = ds.Tables[0].Columns["id"].ToString();
                ComboBoxName.SelectedValuePath = ds.Tables[0].Columns["nom"].ToString();
            }
     
            private void btnId_click(object sender, RoutedEventArgs e)
            {
                MessageBox.Show("L'ID = " + select_id.Text + " correspond à l'utilisateur = " + select_id.SelectedValue.ToString());
            }
        }
    }
    J'ai essayé de faire un deuxième lot de SqlDataAdapter et DataSet qui serait chargé de récupérer le prenom et le stocker dans une variable à afficher dans ma fenêtre mais je n'ai pas réussi.

    Merci de votre aide

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    dataset dataadapter et autres ont été prévus pour du winform, en wpf on essaye de les éviter, ils ne sont pas super adaptés ...

    le mieux est de travailler en objet, à savoir faire une classe utilisateur avec des propriétés (id, nom, prénom ...)
    avec ta requete tu remplis une collection d'utilisateur
    ensuite cette collection est utilisée par le binging itemssource

    après sur le click de ton bouton tu pourras écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var u = (utilisateur)combobox.selecteditem;
    var str = "utilisateur id" + u.id + " est " + u.nom + " " + u.prenom;
    il est aussi possible de binder selecteditem sur une propriété de ton window/VM, pourquoi pas typée sur utilisateur évitant un cast et évitant aussi de d'accéder au combobox depuis le code behind
    (normalement on nomme rarement les controles en wpf)

    après si tu ne veux t'embeter à écrire une classe par table, et tout le code pour remplir des collections, il y a entity Framework
    il va générer tout le code pour la structure et génèrera les requetes nécessaires, tu auras juste à écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var utilisateurs = mydb.utilisateurs; // sachant qu'il est possible d'écrire des where de la sorte mydb.utilisateurs.where(u=>u.nom.startswith("a")) et de faire plein d'autres choses comme ca
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    dataset dataadapter et autres ont été prévus pour du winform, en wpf on essaye de les éviter, ils ne sont pas super adaptés ...

    le mieux est de travailler en objet, à savoir faire une classe utilisateur avec des propriétés (id, nom, prénom ...)
    Jusque là je te suis, si ça ne se fait plus et que c'est une bonne habitude à prendre ça m'intéresse.

    avec ta requete tu remplis une collection d'utilisateur
    ensuite cette collection est utilisée par le binging itemssource
    Donc ça correspond à quelque chose sous cette forme https://stackoverflow.com/questions/...operty-in-xaml ?

    il est aussi possible de binder selecteditem sur une propriété de ton window/VM, pourquoi pas typée sur utilisateur évitant un cast et évitant aussi de d'accéder au combobox depuis le code behind
    (normalement on nomme rarement les controles en wpf)
    Là tu m'as perdu Et ça me fait venir une autre question, pourquoi on évite de nommer les contrôles en WPF ? Et si on y accède pas dans le code behind, comment on le manipule ?

    après si tu ne veux t'embeter à écrire une classe par table, et tout le code pour remplir des collections, il y a entity Framework
    il va générer tout le code pour la structure et génèrera les requetes nécessaires, tu auras juste à écrire
    Je vais regarder de ce côté, ça a l'air intéressant !

    Merci de ta réponse en tout cas.

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    en wpf on n'accède pas ou peu aux controles depuis le code behind, tout se fait par binding, et on ne manipules que des données

    si tu veux modifier le texte d'un textbox, tu fais une propriété de type string, tu bindes ton textbox dessus, et dans le code behind modifier la propriété modifiera le texte du textbox
    tout doit être au maximum comme ça, la plupart des propriétés des controles sont bindables, (isenabled, visibility, etc...) donc il suffit alors de faire des propriétés dans ton code behind

    observablecollection est en effet un type de colleciton bien pratique en wpf, car par rapport à List et aux autres il y a un évènement, ce qui fait qu'en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    utilisateurs.Add(new utilisateur());
    dans le code behind, un listbox (ou autre) dont itemssource est bindé sur la propriété de type observablecollection ajoutera automatiquement l'élément sur l'interface


    et donc si tu veux récupérer l'element sélectionné du combobox tu créés une propriété dans ton code behind et tu bind selecteditem à cette propriété
    ensuite dans ton code behind tu vas juste lire cette propriété du code behind

    l'interface et le code behind peuvent donc être complètement dissociés, ce qui fait que modifier l'un n'oblige pas forcément à modifier l'autre
    les boutons aussi on peut se passer de leur event click, ils ont une propriété command qui permet de faire Command={"Binding TelleCommande"}
    mais une commande n'est pas une sub, mais un peu comme un pointeur vers une sub (voir relaycommand pour ca, et datacontext, enfin pas dans un premier temps, concentre toi déjà sur le binding des propriétés)

    enfin ca c'est en théorie, quand tu voudras utiliser certains events qui ne peuvent pas être bindés à une commande tu vas continuer de t'abonner à des events ...

    quand tu auras réussi à faire un listbox qui affiche une observablecollection de classe, avec un itemtemplate défini sur listbox tu seras déjà sur la bonne voie.
    après tu mets un bouton qui dit quel est l'élément sélectionné (plusieurs infos de la classe)

    après tu regarderas MVVM pour ranger un peu mieux ton code
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 28
    Points : 24
    Points
    24
    Par défaut
    C'est pile les pistes dont j'avais besoin, merci beaucoup

    Je vais bosser là dessus ce soir et ce week-end, je ne pensais pas que quelque chose d'aussi "simple" en apparence puisse m'apprendre autant de choses.

  6. #6
    Membre éprouvé Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 844
    Points : 989
    Points
    989
    Par défaut
    dataset dataadapter et autres ont été prévus pour du winform, en wpf on essaye de les éviter, ils ne sont pas super adaptés ...
    Peux-tu mieux expliquer les raisons te faisant affirmer que les Datasets ADO.NET ne sont pas super adaptés à WPF ?
    .
    Diviser c'est régner : United we stand, Divided we fall
    .

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    bonne question, je l'avais lu quelque part mais je ne retrouve pas où (enfin déjà en winforms je n'étais pas fan)
    mais après vérification même si c'est vieux ca a l'air d'être en grande partie supporté quand même, à part icollectionview qui n'est pas compatible avec les datatables (filter/group), et le binding twoway

    mais tant qu'à utiliser un truc peu performant, autant utiliser EF qui permet d'avoir l'intellisense au moins côté code behind plutot que de taper des noms de colonnes non vérifiés (et le binding twoway doit être faisable techniquement)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 7
    Dernier message: 19/01/2012, 08h16
  3. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  4. [AC-2007] Copier une table depuis une base vers une autre
    Par Triton972 dans le forum VBA Access
    Réponses: 3
    Dernier message: 01/11/2009, 19h27
  5. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50

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