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 :

Trouver la dernière ligne d'une DataTable


Sujet :

ASP.NET

  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Trouver la dernière ligne d'une DataTable
    Bonjour tout le monde.

    Je me pose une question peut-être un peu bizarre, mais je ne trouve pas de réponse (ou alors, je passe à côté du truc !)

    J'ai fabriqué une datable avec des données de ma base de donnée et je la lis avec un For Each.

    Lorsque j'arrive au dernier enregistrement, je voudrais faire un traitement particulier et donc mettre un test conditionnel (If). L'ennui c'est que je ne trouve pas quoi tester.

    Alors bien sur, je sais faire un compteur et prende en amont la longueur de la DataTable, mais je me demandais s'il n'y avait pas un statut dans la DataRow qui permettait de savoir que c'est la dernière facilement.

    Pour plus de clarté voici un peu de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            Dim dtMenuDetail As DataTable = Unerequete de la base de donnée
            For Each dr As DataRow In dtMenuDetail.Rows
    'un traitment sur les données
                 If "c'est la dernière" Then
                        'un traitemtn particulier
                 End If
            Next
    Pouvez vous m'aider ?

  2. #2
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Pour moi, for each doit etre utilisé pour des traitements identiques sur tous les objets. Si tu fais un traitement différent sur l'un d'eux, c'est que tu ne devrais pas utiliser de for each. Remarque, on voit souvent des commandes utilisées de maniere detournée alors qu'il existe une fonction adaptée (par exemple utiliser un for/break plutot qu'un while).

    Mais bon, peut etre qu'il y a des arguments dans l'autre sens (mais comme ca, je vois pas)

  3. #3
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Ok, je vois ce que tu veux dire.
    Alors pour être plus précis (mon traitement est assez simple en fait) dans mon For Each, je prends deux champs texte dans la base de donnée, je les colle dans un label et j'ajoute le label.
    A la suite de chaque Label je place un <hr> (pour faire une "séparation"). Mon idée est juste de détecter le dernier enregistrement et ne pas ajouter le <hr>.

    Du coup, là, je vois pas bien comment utiliser autre chose que le For Each.

  4. #4
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Bah comme tu l'as mis dans ton premier message, un simple for avec un index

  5. #5
    Membre éprouvé
    Inscrit en
    Septembre 2007
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 137
    Par défaut
    Soit le foreach avec le compteur comme tu as proposé.
    Soit apres ton foreach, tu traites á part le cas de la derniere ligne.

  6. #6
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    ok, merci les gars.

    Donc, on peut légitimement déduire que dans la lecture des ligneq de la DataTable on ne peut pas déterminer un statut de position sur les lignes.

    Elles ont pas un index, au moins ?

  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
    Non, pas d'index...

    Tu peux tout simplement faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            Dim dtMenuDetail As DataTable = Unerequete de la base de donnée
            Dim lastRow As DataRow = Nothing
            For Each dr As DataRow In dtMenuDetail.Rows
                 'un traitement sur les données
                 ...
                 lastRow = dr
            Next
     
            If Not lastRow Is Nothing Then
                  'un traitement particulier
            End If

  8. #8
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci Tomlev, l'idée est bonne.

    Mais je suis ennuyé pour la mettre en oeuvre parce que mon traitement particulier est de ne PAS ajouté un truc !!!
    Du coup, avec ton idée (encore une fois, trés bonne) ben faudrait que j'enlève le contrôle qui vient d'être ajouté et je ne sais pas trop comment faire.

    Voici la solution que j'ai fini par trouvé, si tu vois une amélioration possible, n'hésites pas.

    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
    Dim dtMenuDetail As DataTable = New DManager("DataDev").RetournerTable("SELECT * FROM GITE_MenuGiteDetail WHERE MenuGiteId = '" & idMenu & "' ORDER BY OrdreMenuGite")
            For Each dr As DataRow In dtMenuDetail.Rows
                Dim r As New TableRow
                Dim c As New TableCell
                Dim l As New Label
                l.Text = dr.Item("TexteMenu")
                l.CssClass = "GITE_MenuDetail"
                c.CssClass = "GITE_celMenuDetail"
                With c.Controls
                    .Add(l)
                    If dtMenuDetail.Rows.IndexOf(dr) <> dtMenuDetail.Rows.Count - 1 Then
                    .Add(New HtmlGenericControl("hr class='GITE_MenuHR'"))
                    End If
                    lastrow = dr
                End With
                r.Cells.Add(c)
                t.Rows.Add(r)
            Next
    En gros, je liste des champs texte et je les ajoute les uns au dessus des autres. Entre chaque je colle un HR pour faire une petite séparation et pour le dernier, je ne le colle pas. Du coup avec ton idée, il faudrait que je récupère la dernière cellule et que je retire le HR que j'ai mis dedans. et ça, je vois pas bien comment faire simplement.

  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
    Ah ok... dans ce cas ce serait nettement plus simple avec une boucle For, vu qu'il suffirait de vérifier l'index

    Sinon, il y a une méthode d'extension SkipLast dans la librairie Dvp.NET, qui renvoie tous les éléments d'une séquence sauf le dernier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    For Each dr As DataRow In dtMenuDetail.AsEnumerable().SkipLast()
    ...
    (la méthode AsEnumerable est définie dans l'assembly System.Data.DataSetExtensions)

  10. #10
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci pour le tuyaux, je vais étudier cette librairie.

  11. #11
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Mouais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dtMenuDetail.Rows.IndexOf(dr)
    a chaque iteration, c'est sortir les armes lourdes pour rien.

    Vu ce que tu fais le plus simple est de ne pas faire un for each mais plutot un simple for avec un index que tu peux comparer.

    C'est juste que je prefere ne pas faire compliqué quand je peux faire simple

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

Discussions similaires

  1. trouver la dernière valeur d'une ligne
    Par Stardust31 dans le forum Excel
    Réponses: 5
    Dernier message: 18/04/2018, 10h41
  2. [XL-2010] Existe-t-il une methode universelle pour trouver la dernière ligne
    Par Denis_67 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/06/2015, 14h07
  3. [Débutant] trouver une ligne dans une datatable
    Par Ashireon dans le forum VB.NET
    Réponses: 30
    Dernier message: 22/08/2012, 09h00
  4. [XL-2003] Trouver la dernière ligne d'une feuille
    Par Taiby dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/02/2012, 13h39
  5. [XL-2007] Trouver la dernière ligne après filtre et coller une selection
    Par Systémicien dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/03/2011, 08h19

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