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 :

Comment créer une colonne dynamique d'items ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Par défaut Comment créer une colonne dynamique d'items ?
    Bonjour

    Le principe est de créer une colonne unidimensionnelle, sans en-tete de colonne/ligne, contenant initialement une seule combobox dont le .Text = "" et dont la liste déroulante contient tous les enregistrements du champ "Names" d'une Datatable exisstante. Cette Datatable a également un champ "Coût" pour chacun de ses items.
    Un Label au dessus de cette colonne affichera "X/50", où X représente la somme des "coûts" de chaque item si selectionné.

    Lorque l'utilisateur sélectionne 1 item dans cette 1ère combobox :
    - la valeur X est incrémentée avec le coût de l'item sélectionné
    - une nouvelle combo apparait juste en dessous avec sa liste déroulante contenant les mêmes items sauf celui qui a déjà été selectionné ET sans les items dont le coût est > à 50 - X.

    Au final l'utilisateur aura donc une liste d'items dont le nombre sera limité par le coût total autorisé (50).

    A priori, j'ai pensait créer un DataGridViiew monocolonne de type DataGridViewComboxColumn. Puis d'utiliser un Dataview de la Datatable dont le rowfilter serait dynamique avec la valeur de la combo précédente. Et enfin d'affecter ce dataview a la propriété Datasource de la comboboxcell courante.

    Je n'ai pas eu de problème pour créer la dgv et sa DGVcombocolumn, mais :
    - PB1: ce n'est pas un combobox mais un dropdownbutton alors que j'aurais préféré un "vrai" combobox avec autocompletion...
    - PB2: au niveau syntaxe, si ma dgvcombocolumn s'appelle "Column1" et que je tape dans mon Main_Load quelle propriété faut-il utiliser pour cibler la bonne comboboxcell puis ensuite quelle propiété utiliser pour "datasource" et "displaymember" ? VB2010 me dit que ces propriétés n'existent pas... du coup je suis bien emmerdé pour affecter ma dataview dynamique...

    L'autre possibilité auquel j'ai pensé etait d'ajouter au DGV non pas un DGVcomboboxcolumn mais un KryptonDGVcomboboxcolumn (free toolkit de ComponentFactory) qui lui est un "vrai" comboboxcell, cela resout le PB1 expliqué ci-dessus, mais le PB2 reste...

    donc me voilà a venir poster ici pour demander si quelqu'un aurait une meilleure idée du point de vue conceptuel, ou saurait la bonne syntaxe pour le PB2 ?

    Merci d'avance.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    il y a plein de moyens de faire ca en plus simple, les combobox personnellement je suis pas fan, pour l'utilisateur c'est super chiant

    tu peux faire 2 datagrids, celui de gauche avec tous les items et leur cout (2 colonnes), celui de droite avec la selection et en haut un label disant x/50
    un drag drop de gauche à droite et tu retires un items dans le dg de gauche et tu le rajoutes à droite (et inversement)
    avec possibilité de tri sur le nom et le cout de chaque coté
    ceux qui ont un cout supérieur à ce qu'il est possible de rajouter tu les grises

    en wpf ca serait très simple à écrire (et plus joli que 2 datagrids) avec 2 listbox et un template, en windows forms ca risque de prendre plus de lignes de code


    autre méthodes sans les datagrid, un flowlayoutpanel avec autoscroll à true dans lequel tu add des combobox, ca correspond plus à ce que tu recherches, mais moins à ce qu'un utilisateur recherche
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Par défaut
    Re bonjour Pol63

    Merci de ton interet à mes topics ^^

    Oui j'avoue que c chiant les comboboxs (pour utilisateur) mais bon quand tu dois choisir 1 item parmi 100... tu t'amuses pas a afficher une listbox. Bien + rapide pour l'utilisateur de taper les 3 premieres lettres et hop autocompletion, ou meme s'il sen souvient mal juste la 1ere lettre et chercher dans les 5 items de la dropdownlist. Enfin pour moi je ne connait pas + pratique :s

    Sinon concernant ta proposition avec drag drop oué c pas bete mais je suis limité en place sur mon interface: l'item le + long tient dans un combo de 150px de large + je dois faire 2 de ces "grids" sur un flowlayoutpanel de largeur 374. Ce qui ne laisse pas de place pour le 1er grid de gauche (celui ayant tous les items)...

    Mais tu me donne une idée: une checkedListBox dans lequel y aurait tous les items initialement (et leur coût en vis-a-vis). Puis lorsque l'utilisateur "check" 1 item, la list se rafraichirait auto avec les items "trop chers" grisés ?
    Serait-ce trop compliqué a coder ?

    pour ta derniere remarque, en fait c le point de vue utilisateur qui m'importe, pas le point de vue codeur (bien que je sois un débutant ca m'arrangerait lol)
    et aussi pour l'instant je reste en winForms pour apprendre, parce que le WPF a ce que j'ai lu n'a plus rien a voir...

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Une fonction recherche sur le datagridview avec un textbox c'est pas hyper compliqué non plus....

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Par défaut
    Bon... j'ai opté pour la solution Listbox + grisage selon valeur de paramètres connus.

    Mais avant de poster le code que j'ai actuellement j'ai un léger problème préliminaire : Comment faire une checkedlistbox à 2 colonnes à partir de 2 champs d'une datatable ?

    Là j'ai fait une simple concaténation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub MainWindow_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ...
        For Each Row As DataRow In Me.DataSet.BLUspells
             Me.CheckedListBox1.Items.Add(Row.Item("Names").ToString & " (" & Row.Item("SetPoint").ToString & ")")
        Next
        ...
    End Sub
    Ca marche mais pour la suite c'est pas très pratique. Ce qui m'arrangerait + serait de pouvoir recup directement à partir de la 2e colonne de cette checkedlistbox la valeur de SetPoint. Mais pour cela il me faudrait la syntaxe correcte pour faire une listbox à 2 "vraies" colonnes.
    Je n'ai trouvé aucun exemple ni sur le forum, ni sur MSDN...

    EDIT: je viens d'essayer en LINQ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Lvl As Byte = 85
    Me.CheckedListBox1.Items.AddRange(From Row As DataRow In Me.DataSet.BLUspells _
                                      Where CByte(Row.Item("Level")) <= Lvl _
                                      Select {Row.Item("Names"), Row.Item("SetPoint")})
    Erreur de syntaxe: AddRange n'accepte qu'un tableau à 1-dimension...

    EDIT2: 2e essai avec une syntaxe sans erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Me.CheckedListBox1.Items.AddRange(New Object() {From Row As DataRow In Me.DataSet.BLUspells _
                                      Where CByte(Row.Item("Level")) <= Lvl _
                                      Select {Row.Item("Names"), Row.Item("SetPoint")}})
    Mais il ne m'affiche qu'une seule unique ligne "System.Data.EnumerableRowCollection(Of object())"

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    et le ListView ne répondrait il pas à tes attentes?
    http://msdn.microsoft.com/fr-fr/libr...VS.100%29.aspx

Discussions similaires

  1. comment créer une arborescence dynamique
    Par amine84 dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 22/09/2008, 11h42
  2. Réponses: 2
    Dernier message: 20/07/2008, 19h22
  3. Réponses: 1
    Dernier message: 15/02/2008, 16h55
  4. [RaveReport] Comment créer une page dynamiquement
    Par bullrot dans le forum C++Builder
    Réponses: 1
    Dernier message: 18/12/2007, 16h33
  5. [reports] comment créer une requete dynamiquement
    Par lifeisgood dans le forum Reports
    Réponses: 4
    Dernier message: 31/01/2007, 12h15

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