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

VB.NET Discussion :

optimisation de code, manipluation des items d'une combobox


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Par défaut optimisation de code, manipluation des items d'une combobox
    Dans une fenêtre de mon application, je remplis "automatiquement" (via un datatable) une combobox avec des dates, issues d'un champ en base de données Sql Server 2008.

    En base données, les dates doivent être obligatoirement stockées "au complet", avec le format YYYY-MM-DD HH:MM:SS (Merci Sql Server )

    Mais cette combobox sert de "filtre" pour moduler l'affichage des données dans un datagridview.

    Du coup, pour faciliter son utilisation, et à cause de la pertinence de la sélection, je "réduis", dans la combobox, la date au format DD/MM/YYYY et je supprime les redondances.

    Mais tout cela prend du temps, un peu trop pour le client.

    Je sollicite donc vos lumières pour améliorer le code suivant :

    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
    Dim ListVal As New List(Of String)
    Dim val_crt_item As String = String.Empty
    Dim index As Integer = 0
     
    Dim cb_item As DataRowView
     
    While index < CbDate.Items.Count
     
            cb_item = CbDate.Items(index)
     
            val_crt_item = cb_item.Row("Date").ToString().Substring(0, 10)
     
            If ListVal.Contains(val_crt_item) Then
                cb_item.Delete()
            Else
                index += 1
                cb_item.Row("Date") = val_crt_item
                ListVal.Add(val_crt_item)
            End If
     
    End While

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Peut-être qu'en le faisant en LinQ et en amont du chargement de ton combobox ce sera plus rapide...

    Code VB.NET : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim result = From item In dt.AsEnumerable() _
                         Group item By key = item.Field(Of DateTime)("Date").Date Into Group _
                         Select GrouppedValue = key.ToShortDateString()
    Ensuite tu bind la variable result sur ton combobox.

    [EDIT] je viens de mettre le code en VB.NET.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Pourquoi ne pas traiter le problème à la source ? C'est-à-dire dans la requête SQL ?

    Il est parfaitement et facilement possible de ne renvoyer que la partie DATE de la colonne (et non pas champ) qui vous occupe.

  4. #4
    Membre éprouvé Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    Peut-être qu'en le faisant en LinQ et en amont du chargement de ton combobox ce sera plus rapide...
    LinQ !? C'est quoi ? C'est compatible avec ma base de données sous SQL Server 2008 ?

    Le code que tu me montres est en C#, je peux faire l'équivalent en VB .Net ?

    Citation Envoyé par Kropernic Voir le message
    Pourquoi ne pas traiter le problème à la source ? C'est-à-dire dans la requête SQL ?

    Il est parfaitement et facilement possible de ne renvoyer que la partie DATE de la colonne (et non pas champ) qui vous occupe.
    Ok pour formater la date dans la requete SQL (utliser convert non ?), mais qu'en est-il de la suppression des redondances ?

  5. #5
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Montrez donc votre requête. S'il n'y a qu'une combo de remplie avec ça, un simple distinct suffira (après avoir formaté la colonne retournée).

  6. #6
    Membre éprouvé Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Montrez donc votre requête. S'il n'y a qu'une combo de remplie avec ça, un simple distinct suffira (après avoir formaté la colonne retournée).
    J'ai déjà un distinct dans ma requête, je crois que je vais mettre tout le code utilisé pour remplir ma combobox, ça aidera peut être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      Dim req_cb_date As String = "select distinct Id, DateRise from T_AlarmOcc where DateFall is Null"
     
     Dim dt_cb_date As New DataTable
     
     Dim cmd_cb_date As New SqlCommand(req_cb_date, SqlCon)
     
      SqlCon.Open()
     
    Dim dtadapter_cbdate As New SqlDataAdapter(cmd_cb_date)
     
      dtadapter_cbdate.Fill(dt_cb_date)
     
     DbsAlarmOcc.DataSource = dt_cb_date
    Sachant que DbsAlarmOcc est un objet de type "BindingSource" et que pour le DataBinding (dans l'onglet des proriétés) de ma Combobox, j'ai

    Selected Item = DbsalarmOcc - Id

    Selected Value = DbsalarmOcc - DateRise


    Merci pour les liens DotNetMatt, je vais les étudier

  7. #7
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Dim req_cb_date As String = "select distinct(DateRise), Id from T_AlarmOcc where DateFall is Null"
    Je "suppose" que le distinct ne marche pas car l'Id est "je suppose encore" une clé avec contrainte d'intégrité. Donc il ne faut distinct que sur la date, sinon étant donné que l'ID est différent, le Sgbdr estime qu'il n'y pas de doublons.

  8. #8
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Essayez avec cette requête :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT  DISCTINCT
        ID,
        CAST(DATERISE AS DATE) AS 'DATERISE'
    FROM
        T_ALARMOCC
    WHERE
        DATEFALL IS NULL

  9. #9
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    LinQ c'est pour Language Integrated Query. En gros ça permet de requêter une liste d'objet. Il y a Linq To XML pour interroger du XML, Linq to SQL pour interroger une base de données, Linq to Object, etc.

    De manière très schématique, c'est un peu comme si tu pouvais lancer une requête SQL sur une collection.

    Tu trouveras des exemples ici : http://msdn.microsoft.com/en-us/vstudio/bb688088.aspx, et pour apprendre regarde ici et .

    Entre temps j'ai mis le code en VB.NET

    Mais sinon oui tu peux le faire à la source directement via la requête SQL, ce qui aura pour avantage de déléguer cette opération au serveur de base de données.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

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

Discussions similaires

  1. Couleur d'arrière-plan des items d'une QComboBox
    Par mr_samurai dans le forum Qt
    Réponses: 7
    Dernier message: 18/10/2019, 11h06
  2. comment blquer la liste des items d une combobox
    Par ryoussef19 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 01/08/2007, 11h27
  3. [PHP-JS] Optimisation du code avec des boucles
    Par jiojioforever dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2007, 16h02
  4. Réponses: 3
    Dernier message: 29/08/2006, 12h50
  5. [Portal 9iAS] : ordre des items dans une région
    Par melitta dans le forum Oracle
    Réponses: 8
    Dernier message: 21/10/2004, 14h01

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