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 :

Index row DGV correspondant a row Dataset


Sujet :

C#

  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Index row DGV correspondant a row Dataset
    Bonjour

    Comment peut on avoir l'index d'un row DataTable liée a un DGV a partir du rowindex DGV

    Je m'explique
    Je charge un DGV a partir d'une table d'un DataSet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DGV.datasource=DS.Table[0];
    A ce moment le row 0 du DGV correspond au row 0 du dataset

    Mais j'efface le Row 0 du dataset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DS.Tables[0].Rows[0].Delete();
    Le DGV n'affiche plus le ROW 0 MAIS
    A ce moment le row 0 du DGV correspond au row 1 du dataset

    Donc si l'utilisateur veut agir sur le row 0 du DGV, je dois agir sur le ROW 1 du dataset
    Mais la problèmatique est similaire si je trie le DGV !!

    Comment donc identifier l'index dataset correspondant a l'index DGV ???

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    La propriété DataBoundItem d'une DatGridViewRow permet de savoir comme son nom l'indique quel objet est lié à une ligne de la grille. Pas besoin de faire dataTable.Rows[truc] pour récupérer un DataRow. Pratique

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Merci mais comment tu l'utilise
    La je me sens idiot ! mais il me manque la colle ...

    j'ai un row de dgv : cRow
    j'ai une table DataSet liée au DGV

    comment je sais quel row de cette table correspond au cRow.DataBoundItem ??

    Le but par exemple etant de faire un

    Ds.Tables[0].Rows[n].Delete();

    Le delete ne pouvant evidement pas se faire de cette maniere dans le DGV ?

  4. #4
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    La voilà, ta colle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DataRow row = (cRow.DataBoundItem) as DataRow;
     
    row.Delete();

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    pourquoi il ne pourrait pas ?

    databound te retourne le datarow associé... dans la mesure ou il s'agit d'un datarow... si tu fait Delete() dessus il s'effacera de son parent et les changements propagés dans DGV.

    j'ai une question conne, mais pourquoi avoir créé deux topics identiques ?
    ta deja créé le 502766 qui est identique ?!?

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Topic identique
    2 choses

    1- Pour le delete : il me semble avoir déja essayé de "programaticaly" delete un row de DGV bindé et je me suis fait jeter par contre le faire dans le datable marchait : je vais reessayer

    2- 2 topics différent : amon avis petit bug de forum j'avais fait un preview, ensuite back(browser) ensuite creer nouvelle discussion et puis je ne sais comment j'ai vu mon preview a l'ecran j'ai cru ne pas avoir creé puisque le bouton etait la et j'ai reenvoyé

  7. #7
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Pas si simple
    1- La methode delete n'existe pas sur un row DGV
    2- Si je fais ce que tu propose je recois un message a l'execution C# :

    DataRow tRow = (DataRow) dgv_addr.Rows[Index].DataboundItem;

    {"Unable to cast object of type 'System.Data.DataRowView' to type 'System.Data.DataRow'."}

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Moi j'utiliserai un petit BindingSource (qui pourrait s'avérer utile si tu décide par la suite d'utiliser un BindingNavigator)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          BindingSource bs = new BindingSource();
          bs.DataSource = dt;//où dt est ton DataTable
          this.Dgv.DataSource = bs;
    et puis tu delete comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            bs.RemoveAt( Dgv.CurrentRow.Index );
    la gestion sera faite.

  9. #9
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"Unable to cast object of type 'System.Data.DataRowView' to type 'System.Data.DataRow'."}
    Il te reste plus qu'à trouver comment retrouver une datarow à partir d'une datarowview, je te laisse faire.

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Mais encore
    Bonjour

    Je n'ai jamais employé de Bindingsource (mais ca ne fait que 4 semaines que je fais du .NET)
    Je ne sais pas tres bien ce que ca fait en plus
    Mais il m'avais semblé que c'était obsolete avec un DGV lié a une table de dataset

  11. #11
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Retour au bindingsource
    Salut binoo

    Bon apres maintes circonvolution +/- efficaces, j'ai toujour des situation ou la mecanique a des ratés


    Je pense que ton bindingsource est une bonne suggestion
    Peux-tu en deux mots m'expliquer le concept ..
    pratiquement c'est une table de liens entre deux tables ?

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Oui le BindingSource permet de faire la liaison entre des contrôles situés sur un formulaire (le DataGridView pour ton cas) à des données.

    Pour cela tu lies ton composant BindingSource à ta source de données, puis tu lies ton DataGridView au composant BindingSource.

    Les avantages que tu peux avoir à l'utiliser : la navigation, le tri, le filtre et la mise à jour.



    Le BindingSource permet de gérer un curseur sur les données. Tu peux alors faire un parcours unique des données pour chaque BindingSource crée en utilisant la même source de données.

    Par exemple, si tu as :
    - 2 DataGridView
    - 2 BindingSource
    - 1 Source de données

    Chaque DataGridView est relié à un BindingSource qui sont relié à la même Source de données.
    Tu as alors 2 curseurs actifs. Si tu sélectionnes une ligne dans un DataGridView, la position de la ligne sélectionnée dans l'autre DataGridView ne sera pas changée.

    Mais si tu as :
    - 2 DataGridView
    - 1 Source de données

    Chaque DataGridView est relié à la même source de données. Et tu as alors 1 seul curseur et si tu sélectionnes une ligne d'un DataGridView, la position de la ligne sélectionnée de l'autre DataGridView est automatiquement modifiée.


    En espérant que tu y vois plus clair

  13. #13
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Yesss
    Merci braucoup c'est tres clair

    C'est deja un bon pas en avant

    Derniere petite question

    Ayant un DataGridViewRow et son indice

    Comment je peux directement acceder au DataRow du datatable lié via le databindingsource

  14. #14
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut LA SOLUTION
    Salut

    L'usage d'un bindingsource est certainement utile dans des situations que je n'ai pas encore eprouvée

    CEPENDANT

    Pour ce que je voulais faire, (retrouver un DataRow lie a un DataGridViewRow)
    c'est bien le DataSourceItem qu'il faut utiliser
    Encore faut il pouvoir s'en servir et c'est la la bouteille a encre
    Mais quand on sait, la solution est simple

    L'erreur est de penser que DataBoundItem est un datarow et je suis resté suspendu a ca deux jours en ecartant cette solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          dgv_addr.DataSource =  MyConn.dsAddr.Tables[0];
    // d'abord passer par un DataRowView qui contient le DataRow
          DataRowView drv = (DataRowView)dgv_addr.Rows[5].DataBoundItem;
    // Et voila le datarow
          DataRow dr = drv.Row;

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Pour répondre quand même à cette question :
    Comment je peux directement acceder au DataRow du datatable lié via le databindingsource
    Le DataTable, le BindingSource et le DataGridView étant lié, si tu modifies une ligne du DatGridView, le dataTable est automatiquement modifié. Donc tu accèdes à la ligne du DataTable en accédant à celle du DataGridView.

    Sinon, si ton besoin est d'y accéder à partir du BindingSource, tu dois pouvoir faire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataRow dr = ( (DataTable) monBindingSource.DataSource ).Rows[index];

  16. #16
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Encore un drole de truc
    1- Je remplis (par programmation) une cellulle du DGV avec une nouvelle valeur
    2- La valeur se retrouve aussi dans le dr (lié)

    MAIS :
    1- le dr state reste unchanged
    2- Je force a modified

    et HOP : il retrouve l'ancienne valeur ????

Discussions similaires

  1. [MySQL] Unable to jump to row 0 on MySQL result index 8
    Par biddal dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 13/03/2008, 18h08
  2. dataset add row ne pas ajouter de clé double?
    Par gregcat dans le forum Windows Forms
    Réponses: 2
    Dernier message: 30/01/2008, 11h25
  3. Création d'index sur tables avec 400000 rows
    Par Poisson59 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/07/2007, 13h53
  4. [C#]Correspondance DatagridView et Dataset après un tri
    Par cmoiscrat dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/06/2006, 17h52
  5. [VB.NET] [DataSet] Acceder a l'index d'une row
    Par graphicsxp dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/04/2005, 13h28

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