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

selection multiple datagridview form2 -> textbox form1


Sujet :

Windows Forms

  1. #1
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 17
    Par défaut selection multiple datagridview form2 -> textbox form1
    Bonjour,

    J'aurais besoin d'aide pour orienter ma recherche d'informations car visiblement je n'utilise pas les bons termes.

    Le logiciel utilise une base sdf SQL CE à plusieurs tables, je suis sous visual studio 2012 en C#.

    Ce que je cherche à faire :



    Sur un formulaire gérant les enregistrement d'une table, je n'ai pas rencontré de souci particulier mais là ça se complique méchemment pour mon petit niveau. J'en arrive au stade où je ne sais plus où chercher.

    Dois je me focaliser sur la manipulation des dataset ?

    Dois je plutôt me concentrer sur les requêtes SQL et les classes ?

    Ou bien encore vaudrait mieux-t-il utiliser une table temporaire à vider à chaque ajout dans les textbox ou leur modification ultérieure ?

    Les résultats des recherches que j'ai pu faire m'ont complétement perdu, je ne sais plus quoi rechercher ou taper dans les moteurs pour focaliser les résultats sur ce que j'ai vraiment besoin de réaliser pour ce type d'opération.

    L'élégance du code n'est pas ma priorité, surtout si il utilise une somme incroyable de fonctions que je ne maitrise pas encore. J'aimerais étudier ce type d'opérations en limitant un maximum mon champ de documentation pour ne pas me perdre en route.

    Merci d'avance si vous pouvez me ré-aiguiller.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Perso j'ai pas compris ce que tu cherchais à faire... Je sais qu'une image vaut mille mots, mais là je crois que ce serait plus clair si tu expliquais un peu...

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 17
    Par défaut
    bonsoir tomlev,

    Je vais esssayer d'expliquer cela avec mes mots.

    Le formulaire principal comporte une série de textbox, disposées en lignes, dans lesquelles je dois charger les enregistrements d'une base. Ces donnèes servent ultérieurement à calculer d'autres valeurs d'une manière automatisée.

    Chaque ligne de l'interface comporte 4 text box et corespondent à un seul enregistrement, dont trois sont verrouillées car elles contiennent les valeurs de la base de donnèes. La quatrième (seconde en partant de la gauche sur le schéma) sert à rentrer une donnèe qui pondère chaque enregistrement dans un résultat final.

    Pour gérer ces enregistrements, j'ai deux formulaires :

    - le formulaire "stock" qui permet de manipuler les donnèes d'une table (modifier,supprimer, ajouter etc ...). Pas de souci pour celui ci, beaucoup de doc et d'infos m'ont permis de surmonter les difficultés.

    - le formulaire "selection" qui permet de selectionner et charger plusieurs enregistrements dans le formulaire principal. Et là ça se corse méchemment, je suis complétement perdu.

    Ce formulaire secondaire comprend seulement deux éléments :
    - un datagridview avec checkboxes : sélection/desélection multiple donc.
    - un bouton de validation : qui va s'occuper d'envoyer les valeurs des enregistrements sélectionnés au bon endroit dans le formulaire principal (dans les textbox verrouillées mentionnées plus haut).

    La fonction checkboxes en sélection multiple n'est pas encore fonctionnelle mais j'avance, j'ai opté finalement pour un champ "Selection" dans la base qui reçoit un true ou un false et qui est vidé en quittant le logiciel.

    Ce qui me pose souci c'est de transmettre les enregistrements dans le formulaire principal à partir du formulaire secondaire et d'en organiser les valeurs dans les textbox.

    Je ne sais plus par quel bout le prendre ni sur quoi focaliser ma recherche, je voudrais si possible limiter mon "apprentissage sur le tas" sur cette fonction à quelque chose de simple à mettre en place que je peux par la suite rendre plus complexe.

    Je sais que l'exemple est mal choisi mais je regrette la facilité d'utilisation des variables en LUA et son coté modulaire. On pouvait crèer un moteur avec timer qui centralisait les donnèes à traiter puis les traiter dans des sous routines assez facilement. Si je rapportes cela aux classes C#, il me faudrait en crèer beaucoup et au vu de ce que j'ai croisé comme samples et comme posts sur les forums... ça n'a pas l'air d'être conseillé. Ou alors j'ai manqué quelque chose.

    Voilà l'explication, bien que je n'ai pu éditer en temps et en heure, c'est une question d'un parfait débutant.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Codename Voir le message
    Chaque ligne de l'interface comporte 4 text box et corespondent à un seul enregistrement, dont trois sont verrouillées car elles contiennent les valeurs de la base de donnèes. La quatrième (seconde en partant de la gauche sur le schéma) sert à rentrer une donnèe qui pondère chaque enregistrement dans un résultat final.
    Tu as une raison particulière d'utiliser des lignes de TextBox, plutôt qu'un DataGridView qui est fait pour ça ?

    Citation Envoyé par Codename Voir le message
    - un bouton de validation : qui va s'occuper d'envoyer les valeurs des enregistrements sélectionnés au bon endroit dans le formulaire principal (dans les textbox verrouillées mentionnées plus haut).
    Tu abordes le problème à l'envers : ce n'est pas le formulaire secondaire qui doit "envoyer" les données au formulaire principal, mais le formulaire principal qui doit récupérer les données du formulaire secondaire. Ainsi tu n'auras aucune dépendance du formulaire secondaire vers le formulaire principal, ce qui te permettra si besoin de le réutiliser ailleurs.

    Une solution simple est de créer dans le formulaire secondaire une propriété qui renvoie (par exemple) les identifiants des éléments sélectionnés, et qui s'appelle par exemple SelectedIds. En supposant que tu utilises un DataGridView dans ton formulaire de sélection, ça donne quelque chose comme ç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
    16
    17
    public IList<int> SelectedIds
    {
        get
        {
            var ids = new List<int>();
            foreach (DataGridViewRow row in dataGridViewSelection.Rows)
            {
                bool selected = (bool)row.Cells["colonneSelection"].Value;
                if (selected)
                {
                    int id = (int)row.Cells["colonneIdentifiant"].Value;
                    ids.Add(id);
                }
            }
            return ids;
        }
    }
    Ensuite dans le formulaire principal tu as juste à faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var frmSelection = new FormulaireSelection();
    if (frmSelection.ShowDialog() == DialogResult.OK)
    {
        foreach (int id in frmSelection.SelectedIds)
        {
            ...
        }
    }
    Citation Envoyé par Codename Voir le message
    La fonction checkboxes en sélection multiple n'est pas encore fonctionnelle mais j'avance, j'ai opté finalement pour un champ "Selection" dans la base qui reçoit un true ou un false et qui est vidé en quittant le logiciel.
    Ce champ Selection n'a aucune raison de se retrouver dans la base de données ; c'est une donnée purement liée à l'interface graphique, il ne faut surtout pas "polluer" la base de données avec ce genre de choses...

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 17
    Par défaut
    Je comprend mieux mes erreurs de logique maintenant. Merci pour le recadrage.

    Je vais potasser ton code (mais je le comprend) car je ne connaissais pas l'utilisation des listes, en testant deux trois trucs à coté je viens de prendre conscience qu'on peut faire faire aux formulaires bien plus de choses que je ne le pensais sans pour autant faire des milliers d'appels à droite et à gauche. Il faut que je me déconditionne sinon je ne vais pas avancer. Pour le coup google a été mon pire ennemi pour débuter le C#.

    Pour l'interface, les text box me sont venues naturellement comme des conteneurs propices à des donnèes en lecture seule.

    Coté gauche la référence, coté droit les résultats du calcul automatisé et au milieu le contrôle utilisateur qui pondère à la volèe et peur vérifier les résultats en temps réel (calcul intégral refait à chaque "TextChanged").

    Le logiciel est purement une sandbox mais on peut facilement rapporter l'usage à une logiciel de diététique par exemple.

    L'utilisateur rentre les grammes de la référence chargèe et le calcul automatisé sort le nombre de calories et une valeur conseillée en fonction de ce qu'il y a dans la base. Dans d'autres groupbox d'autres textbox seront modifiées à la volèe comme par exemple le prix total de la recette, le nombre total de calories, le ratio gramme/calories, le ratio €/gramme etc ... le but pour moi c'est de rendre complexe quelque chose de simple et fonctionnel pour atteindre toutes les limites des fonctions basiques. Avant de passer à autre chose.

  6. #6
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 17
    Par défaut
    J'ai beau avoir indigéré des pages sur System.Collections, je n'arrive pas à accéder au contenu de la liste. Plus j'avance, plus j'ai l'impression que le MCSE à coté du c# c'était une promenade de santé La POO c'est quand même une sacrèe usine à gaz.

    Je n'en suis pas encore à vouloir exploiter les ID récupérés, mais juste afficher le contenu quelque part.

    Pour vérifier si ce n'était pas une erreur qui venait de l'interface, j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void btnSelectionFrm_Click(object sender, EventArgs e)
            {
                var frmSelection = new frmSelection();
                if (frmSelection.ShowDialog() == DialogResult.OK)
     
                {
                            txtbxBase1.Text = frmSelBas.dataGridView2.SelectedRows[0].Cells[3].Value.ToString();
                    }   
            }
    Et j'ai bien la valeur programmée dans le bon textbox.

    J'ai aussi essayé de binder un dgv du formulaire principal sur la liste (via l'IDE uniquement) mais par contre cela ne donne rien.

    Help, je suis proche de l'AVC là.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Codename Voir le message
    Plus j'avance, plus j'ai l'impression que le MCSE à coté du c# c'était une promenade de santé La POO c'est quand même une sacrèe usine à gaz.
    Mais non, c'est juste que tu t'y prends de travers... C'est juste un pli à prendre, mais forcément ça s'apprend pas du jour au lendemain.

    Citation Envoyé par Codename Voir le message
    Je n'en suis pas encore à vouloir exploiter les ID récupérés, mais juste afficher le contenu quelque part.

    Pour vérifier si ce n'était pas une erreur qui venait de l'interface, j'ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void btnSelectionFrm_Click(object sender, EventArgs e)
            {
                var frmSelection = new frmSelection();
                if (frmSelection.ShowDialog() == DialogResult.OK)
     
                {
                            txtbxBase1.Text = frmSelBas.dataGridView2.SelectedRows[0].Cells[3].Value.ToString();
                    }   
            }
    Et j'ai bien la valeur programmée dans le bon textbox.

    J'ai aussi essayé de binder un dgv du formulaire principal sur la liste (via l'IDE uniquement) mais par contre cela ne donne rien.

    Help, je suis proche de l'AVC là.
    J'ai pas compris ce qui te posait problème au juste. Et c'est quoi frmSelBas ? Qu'est-ce que ça a à voir avec la sélection ?

  8. #8
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 17
    Par défaut
    Le quote est le mélange entre le formulaire de backup (frmSelection) et celui qui me sert de sandbox (frmSelBas). C'est un mélange de copier/coller sur du multi onglets désolé, mais sur les formulaires pas de souci c'est compartimenté comme il faut.

    Ce qui me pose souci, c'est avoir accès au contenu de ce que Ilist renvoie pour comprendre la notion d'index. J'en suis au stade où je ne sais même plus si c'est la version unilatérale ou bilatérale au niveau des modifications possibles.

    Ensuite avec les ID de la base en main triés gràce aux index je pense que je peux m'en sortir et même tester pas mal de trucs derrière, au niveau SQL CE c'est ce qui m'a donné le moins de mal.

    Ou alors j'ai encore tout compris de travers. Sinon et bien, je me suis inscrit quand j'ai commencé le C# en fait. Comme j'ai peu de temps libre, il m'arrive de ne pas toucher à une ligne de code pendant des semaines car je consacre ce temps aux recherches. Mais ce n'est pas productif, j'ai besoin de manipuler et du debugger pour comprendre plus vite.

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Codename Voir le message
    Ce qui me pose souci, c'est avoir accès au contenu de ce que Ilist renvoie pour comprendre la notion d'index.
    Bah tu t'en fous de l'index, il suffit de faire un foreach comme je t'ai montré...
    Si tu tiens à utiliser l'index, fais une boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int index = 0; index < laListe.Count; index++)
    {
        var item = laListe[index];
    }


    Citation Envoyé par Codename Voir le message
    J'en suis au stade où je ne sais même plus si c'est la version unilatérale ou bilatérale au niveau des modifications possibles.
    Je comprends pas ta phrase

    Citation Envoyé par Codename Voir le message
    Ensuite avec les ID de la base en main triés gràce aux index je pense que je peux m'en sortir et même tester pas mal de trucs derrière, au niveau SQL CE c'est ce qui m'a donné le moins de mal.
    Pourquoi tu veux "trier grâce aux index" ? Je ne vois pas à quoi ça pourrait te servir...

    Citation Envoyé par Codename Voir le message
    Ou alors j'ai encore tout compris de travers. Sinon et bien, je me suis inscrit quand j'ai commencé le C# en fait. Comme j'ai peu de temps libre, il m'arrive de ne pas toucher à une ligne de code pendant des semaines car je consacre ce temps aux recherches. Mais ce n'est pas productif, j'ai besoin de manipuler et du debugger pour comprendre plus vite.
    Ah bah c'est sûr que plus tu vas pratiquer, plus tu vas progresser

  10. #10
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 17
    Par défaut
    Ha génial je vais tester ça dès que je peux. L'index c'est plus pour tenter des manip' dessus ensuite, pour ne pas passer à coté.

    Par contre je croyais que les index étaient en quelque sorte aussi les clés primaires des donnèes qu'on chargeait dedans, qu'on ne pouvait manipuler ce qu'il y avait dedans sans y passer. Je pensais donc répartir chaque entrèe gràce à cet ID ... mais visiblement c'est pas ça.

    Pour les listes j'ai lu que certaines pouvaient modifier leur source en étant elles même modifiées, d'autres non.

    Voilà, mais dans l'immédiat c'est le "for each" du formulaire principal qui me pose souci. Je ne sais pas comment écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txtbxBase1.Text = frmSelBas.dataGridView2.SelectedRows[0].Cells[3].Value.ToString();
    En y intégrant un item de la liste à la place de la selection du datagrid. Je cale.

    PS : je parle uniquement de l'ID extrait dans le formulaire secondaire, c'est ce que je veux afficher dans un premier temps.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Codename Voir le message
    Par contre je croyais que les index étaient en quelque sorte aussi les clés primaires des donnèes qu'on chargeait dedans, qu'on ne pouvait manipuler ce qu'il y avait dedans sans y passer. Je pensais donc répartir chaque entrèe gràce à cet ID ... mais visiblement c'est pas ça.
    Bah ça dépend du contexte... Pour une base de données, un index c'est un truc qui permet de retrouver rapidement une ligne d'après une valeur d'une colonne, et la clé primaire est effectivement un cas particulier d'index. Mais dans le contexte d'une liste (en C#, mais pas seulement), c'est la position d'un élément dans la liste ; pour une liste de N éléments, les éléments sont indexés de 0 à N-1

    Citation Envoyé par Codename Voir le message
    Pour les listes j'ai lu que certaines pouvaient modifier leur source en étant elles même modifiées, d'autres non.
    Comment ça "modifier leur source" ? Qu'est-ce que tu appelles leur source ? Je comprends vraiment pas ce que tu veux dire...

    Citation Envoyé par Codename Voir le message
    Voilà, mais dans l'immédiat c'est le "for each" du formulaire principal qui me pose souci. Je ne sais pas comment écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txtbxBase1.Text = frmSelBas.dataGridView2.SelectedRows[0].Cells[3].Value.ToString();
    En y intégrant un item de la liste à la place de la selection du datagrid. Je cale.

    PS : je parle uniquement de l'ID extrait dans le formulaire secondaire, c'est ce que je veux afficher dans un premier temps.
    Bah vu que je vois toujours pas trop le rapport entre ce frmSelBas et le formulaire de sélection, je sais pas trop quoi te dire...
    Est-ce que tu cherches tout simplement ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    txtbxBase1.Text = frmSelection.SelectedIds[0].ToString();
    (remplacer 0 par l'index qui correspond à l'élément que tu veux)

  12. #12
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 17
    Par défaut
    C'est exactement ça que je cherchais, et je ne m'y attendais vraiment pas tel quel. Je me suis bien compliqué la vie pour rien...

    Je viens de dégainer l'IDE dans la foulèe pour tester et le debugger m'arréte ici sur le premier formulaire après avoir validé le second avec la sélection :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool selected = (bool) row.Cells["IDsel"].Value;
    "La référence d'objet n'est pas définie à une instance d'un objet."

    ça me renvoie null ou 0 selon comment je configure la colonne des checkboxes dans la section data, mais comme je l'ai "unbound" de la base ça ne devrait avoir aucune incidence, non ?

    pourtant juste plus haut dans le foreach tout est spécifié clairement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach (DataGridViewRow row in frmSelBas.dataGridView2.Rows)
    J'ai compris sinon pour les index et ses nuances, un peu comme une pile en ASM en (très) gros.

    Pour le coté bilatéral et unilatéral de la liste (je pense répliquat et c'est mal je sais), je faisais allusion à ceci, trouvé sur MSDN :

    IList est un descendant de l'interface ICollection et sert d'interface de base de toutes les listes non génériques. Les implémentations de IList peuvent être classées dans trois catégories : lecture seule, taille fixe et taille variable. Un IList de type lecture seule ne peut pas être modifié. Un IList de taille fixe ne permet pas l'ajout ou la suppression d'éléments, mais permet la modification des éléments existants. Un IList de taille variable permet l'ajout, la suppression et la modification des éléments.
    Sinon aucun rapport entre frmSelection et frmSelBas, j'ai juste fait une copie de frmSelection en frmSelBas pour travailler dessus sans stress (et tout refaire niveau interface si jamais je plantais totalement le code).

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Codename Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool selected = (bool) row.Cells["IDsel"].Value;
    "La référence d'objet n'est pas définie à une instance d'un objet."
    Soit row est null (mais si tu es dans un foreach sur les lignes du DataGridView, ce n'est pas possible a priori)
    Soit row.Cells["IDsel"] est null (mais normalement ça déclenche une ArgumentException si la colonne n'existe pas, donc ça doit pas être ça non plus)
    Soit row.Cells["IDsel"].Value est null, et essayer de convertir null en bool déclenche une exception, parce qu'un bool ne peut pas être null. Essaie de faire ça à la place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool selected = false;
    object value = row.Cells["IDsel"].Value;
    if (value != null)
        selected = (bool)value;
    Ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool selected = Convert.ToBoolean(row.Cells["IDsel"].Value);
    (plus simple mais un peu moins rapide)

  14. #14
    Membre averti
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2011
    Messages : 17
    Par défaut
    J'ai un sourire très niais en ce moment même, ça marche et cerise sur le gateau, je comprend pourquoi. Je peux répartir les données ou bon me semble... c'est géant.

    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
            //-------------------------------------------------------------------
            public IList<int> SelectedIds
            {
               get
                {
                    var ids = new List<int>();
                    foreach (DataGridViewRow row in dataGridView2.Rows)
                    {
                        //bool selected = (bool)row.Cells["IDsel"].Value;
                        bool selected = Convert.ToBoolean(row.Cells["IDsel"].Value);
                        if (selected)
                        {
                            //int id = (int)row.Cells["IDbase"].Value;
                            int id = Convert.ToInt32(row.Cells["IDbase"].Value);
                            ids.Add(id);
                        }
                    }
                    return ids;
                }
            }
            //--------------------------------------------------------------------
    J'ai mis en commentaires les originaux. Il y a pas mal de truc qu'il faut que je revois et valides car j'ai inséré à la volèe sans tout vérifier. Il faut notemment que je vérifies la cohérence de la configuration entre les champs de la base, le dataset et le DGV.

    Coté formulaire principal :

    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
    private void btnSelBas_Click(object sender, EventArgs e)
            {
     
                var frmSelBas = new frmSelBas();
                if (frmSelBas.ShowDialog() == DialogResult.OK)
     
                {
                    foreach (DataGridViewRow row in frmSelBas.dataGridView2.Rows)
                    {
                        //bool selected = (bool) row.Cells["IDsel"].Value;
                        bool selected = Convert.ToBoolean(row.Cells["IDsel"].Value);
                        if (selected)
                        {
                            txtbxBase1.Text = frmSelBas.SelectedIds[0].ToString();
                            txtbxBase2.Text = frmSelBas.SelectedIds[1].ToString();
                        }
                    }   
                }
            }
    J'ai préféré opté pour la conversion d'entrèe, mais je veux aussi bidouiller le reste tant qu'à faire.

    Il n'y a plus qu'un seul truc qui m'échappe, c'est le rapport d'erreur du debugger ""La référence d'objet n'est pas définie à une instance d'un objet." et le lien avec la solution.

    Je n'arrive pas à identifier la référence d'objet qui lui pose problème (le null/non null converti en bolléen?) avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public IList<int> SelectedIds
    ... qui sort lui un int qui n'a rien à voir avec le test de selection en cause.

    Un grand merci pour m'avoir sorti de ce pétrin en tout cas, j'étais à deux doigts de tout lâcher pour être honnête.

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

Discussions similaires

  1. [Débutant] Affichage de la selection datagridview dans les textbox
    Par thierry007 dans le forum VB.NET
    Réponses: 3
    Dernier message: 19/02/2015, 09h10
  2. Select multiple
    Par lfournial dans le forum Struts 1
    Réponses: 20
    Dernier message: 24/02/2011, 12h14
  3. Selection multiple dans un DataGridView
    Par Mathieu231 dans le forum VB.NET
    Réponses: 1
    Dernier message: 04/05/2010, 14h20
  4. <select multiple ...>
    Par ayobo dans le forum ASP
    Réponses: 2
    Dernier message: 06/07/2004, 08h49
  5. [C#]Sauvegarde d'une selection multiple d'une listbox?
    Par onouiri dans le forum ASP.NET
    Réponses: 7
    Dernier message: 29/04/2004, 17h16

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