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

ASP.NET Discussion :

[C#] Manipulation DataTable à partir d'un DataGrid


Sujet :

ASP.NET

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [C#] Manipulation DataTable à partir d'un DataGrid
    Arpès de longues heures à coder, j'arrive à peu près à faire ce que je voulais au départ : insérer ligne après ligne, le détail d'un "contrat" à partir de contrôles WinForm.

    Mais j'ai d'autres soucis maintenant :p

    Mon DataGrid qui prend le DataSet en cache comme source de données possède une colonne avec des boutons pour détruire toutes les lignes comportant la même marque ET le même modèle que ceux de la ligne du bouton. Sauf que, je vous arrête de suite, il ne s'agit pas de détruire les lignes du DataGrid, mais bien du DataTable auquel il est relié ( et ensuite de rebinder le DataGrid avec le DataTable ).

    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
     
    // handler pour réaliser la suppression lors du clic sur le bouton d'une des lignes
     
    protected void DG_NvlPMS1_ItemCommand(object sender, DataGridCommandEventArgs e) {
     
    // récupération du DataTable en cache pour le traiter
                DTNvlPMS = (DataTable) Cache["Accord"];
     
    // parcours du DataTable à la recherche des lignes ayant
    // même marque et modèle que ceux de la ligne du
    // bouton appuyé dans le DataGrid.
     
                foreach( DataRow myRow in DTNvlPMS.Rows ) {
     
                    if ( myRow["Marque"] == e.Item.Cells[0].ToString() && myRow["Modele"] == e.Item.Cells[1].ToString() ) {
     
                        DTNvlPMS.Rows.Remove(myRow);
                    }
                }
     
    // Je vide la variable du cache et je la relie au nouveau tableau
                Cache.Remove("Accord");
     
                Cache.Insert("Accord",DTNvlPMS);
     
    // je rebind mon DataGrid avec le DataTable
                DG_NvlPMS1.DataSource = (DataTable)Cache["Accord"];
                DG_NvlPMS1.DataBind();
     
            }
    A priori, rien de sorcier. Mais ça ne marche pas. Je n'ai aucun résultat réel affiché après l'action. Lorsque je clique sur le bouton d'une ligne du DataGrid, je vois bien qu'il recharge la page, mais rien ne change.

    Pour info, j'ai bien vérifier le OnItemCommand="DG_NvlPMS1_ItemCommand" dans la définition du DataGrid.

    C'est désespérant.


    De plus, j'ai un soucis presque identique. Lorsque j'insère une donnée dans mon DataTable du cache, j'aimerais contrôler qu'il n'existe pas déjà une ligne avec cette marque et ce modèle, auquel cas, je ne ferais qu'une MAJ de la ligne et non pas une nouvelle insertion.

    Et bien, devinez quoi ? ça ne marche pas. Le code a l'air bon, il compile, mais il m'ajoute toujours une ligne et ne mets pas à jour pour une même marque et un même modèle.

    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
     
     
     
            protected DataTable setDT() {
     
                DataTable DTtmp = new DataTable();
     
                DataColumn DC1 = new DataColumn();
                DC1.ColumnName = "Marque";
     
                DTtmp.Columns.Add(DC1);
     
                DataColumn DC2 = new DataColumn();
                DC2.ColumnName = "Modele";
     
                DTtmp.Columns.Add(DC2);
     
                DataColumn DC3 = new DataColumn();
                DC3.ColumnName = "Quantite";
     
                DTtmp.Columns.Add(DC3);
     
                return(DTtmp);
     
            }
     
            protected DataTable insDT ( DataTable DT, string marque, string modele, string quantite ) {
     
    // on dit par défaut que c'est un nouvel enregistrement
                bool newrow = true;
     
    // on vérifie qu'il n'y a pas de lignes ayant
    // même marque et modèle, sinon MAJ.
     
                foreach( DataRow myRow in DT.Rows ){
                    if ( myRow["Marque"] == marque && myRow["Modele"] == modele ) {
                        myRow["Quantite"] = quantite;
                        newrow = false;
                        break;
                    }
                    else {
                        newrow = true;
                    }
     
                }
     
    // Si c'est une nouvelle ligne, on l'insère
                if ( newrow ) {
     
                DataRow myDR = DT.NewRow();
     
                myDR["Marque"] = marque;
                myDR["Modele"] = modele;
                myDR["Quantite"] = quantite;
     
                DT.Rows.Add(myDR);
                }
     
                return (DT);
            }
     
     
     
    protected void B_NvlPMS1_Click(object sender, EventArgs e) {
     
    // initialisation de mon DataTable dont je me sers 
    // pour les traitements
                DTNvlPMS = setDT();
     
    // S'il existe un DataTable dans mon cache non nul
    // je le récupère
     
                if ( Cache["Accord"] != null ) {
     
                    DTNvlPMS = (DataTable) Cache["Accord"];
     
                }
     
    // j'insère une nouvelle ligne
                DTNvlPMS = insDT ( DTNvlPMS, LB_NvlPMS1.SelectedValue.ToString(), LB_NvlPMS2.SelectedValue.ToString(), TB_NvlPMS2.Text);
     
    // comme précédemment, je MAJ le cache et je rebind
    // le DataGrid
     
                Cache.Remove("Accord");
     
                Cache.Insert("Accord",DTNvlPMS);
     
     
                DG_NvlPMS1.DataSource = (DataTable)Cache["Accord"];
                DG_NvlPMS1.DataBind();
     
                Label1.Text = DTNvlPMS.Rows.Count.ToString();
     
            }
    Alors, je sais qu'il y a un soucis avec le break, puisqu'il fait quitter du if et non pas du foreach. Mais même dans ce cas, il devrait mettre à jour la ligne concernée, et insérer encore cette ligne à la fin. Or, il ne fait même pas cette MAJ.

    Encore une fois, je vous remercie pour le temps que vous accorderez à lire mon fouilli et à me donner une réponse

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je sens que ça va vous irriter, mais je remonte ce post car niveau délai, c'est vraiment l'extrême urgence là.

    J'vous en priiiiiiie .... help !

  3. #3
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par Talis
    Je sens que ça va vous irriter, mais je remonte ce post car niveau délai, c'est vraiment l'extrême urgence là.

    J'vous en priiiiiiie .... help !
    alors franchement s'il y a urgence
    Dans ton algo autant utiliser une astuce du genre
    1. Je modifie maSource
    2. Je détruis la datagrid et j'en crée une nouvelle
    Et tu connais la suite DatSource= et DataBind
    Si çà marche pas alors c'est obligatoirement la modification de la source qui pêche
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Neguib, c'est exactement ce que je fais déjà !

    A chaque chargement de page, je vais chercher en cache mes données, je les mets dans un DataTable, là je les traite, et en dernier je rebind le DataGrid avec le DataTable.

    Donc, c'est l'attaque du DataTable qui foire, mais où ?

  5. #5
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Citation Envoyé par Talis
    Neguib, c'est exactement ce que je fais déjà !
    ....et en dernier je rebind le DataGrid avec le DataTable...
    Tu as dû mal me lire alors
    car moi je te dis : détruis le datagrid ancien et crée un nouveau datagrid et c'est le nouveau que tu bind (et non rebind)
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    ouppppssss ... k, j'essaye ça.

    Mais dès que j'ai résolu un autre problème. Je fais un autre post, puisque rien à voir.

    Je te tiens au courant. En tout cas, merci pour toute l'aide neguib !

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bon, ça y est, j'ai exactement ce que je veux !

    Il y avait différentes erreurs, notament l'accès au nom d'un objet ( cellule ) au lieu de son contenu, un mauvais parcours des lignes du DataSet, etc ...

    Quand j'aurais les sources sous la main, je les copierai : ça peut toujours servir aux autres.

    Merci encore aux personnes qui ont cherché à m'aider !

    Et en attendant : Tag Résolu.

  8. #8
    Futur Membre du Club
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Impression
    bonjour a tous, je suis nouvo dans le site et j ai besoin d aide.
    si kelkin a kelke chose pr moi, je suis preneur et je le remerci d avance. voici moi pb:
    j ai sur une form :
    - un combo qui contient les types de produits (qui vienne de la table TypeProduit)
    - un datagridview qui contient la liste de tous les produits.
    le truc est que lorsqu on selectionne un type de produit, celui ci se filtre les produits correspondants. jusque la pas de pb.

    j aimerais enfin concevoir un etat crystal report sous vb net 2005 qui imprimera les produits en fonction du type choisi.

    une fois de + merci pr votre aide

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/12/2011, 16h11
  2. impression a partir d'un DataGrid
    Par reeda dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 23/09/2006, 23h51
  3. inserer les données dans une base de donnée a partir d'un datagrid
    Par sundjata dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 31/07/2006, 00h46
  4. [C#] remplir un formulaire a partir d'un dataGrid
    Par leycho dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/02/2006, 01h12

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