none
CheckedListBox AddRange RRS feed

  • Discussion générale

  • Bonjour,

    J'ai un class qui hérite de CheckedListBox, je souhaite surcharger la méthode AddRange de la propriété Items pour que je puisse ajouter ex: 100000 éléments à ma checkedListBox avec un nouvel état de la propriété check de chaque item (une question de performance et de rapidité)

    Ma réalisation:

    Dim dataListBox = From rowVisible In rowsTable.AsEnumerable()
                                              Select rowVisible

    MyChechedListBox.Items.AddRange(dataListBox)


    Cordialement
    mardi 3 mai 2011 15:19

Toutes les réponses

  • Bonjour,

    Je ne suis pas sûr que l'on puisse ajouter 100000 éléments à une CheckedListBox sans avoir de très gros problèmes de performances et de rapidité d'éxécution. En plus, je me vois mal faire une recherche d'un élément particulier parmi 100000. Il faudrait peut-être voir du coté du contrôle ComboBox qui , lui, permet de positionner sur le 1er élément commençant par une chaîne de caractères.

    Avez-vous regardé ce lien ( pour .Net Framework 3.5 ) ?

    http://msdn.microsoft.com/fr-fr/library/z018s5az(VS.90).aspx

    Sinon , vous avez toujours la possibilité d'utiliser les 2 methodes BeginUpdate() et EndUpdate()

    http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.beginupdate(VS.90).aspx

    Bonne journée

    PS : seriez-vous en train de charger une CheckedListBox à partir d'une requête LINQ ?

     


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    jeudi 5 mai 2011 09:13
  • Bonjour,

    Oui, j'ai déjà consulté tous les liens possible dans MSDN.

    Concernant la recherche d'éléments dans la checkedListBox il y a la méthode FindString() qui marche très bien (bonne performance sur 120000 items)

    Pour les méthodes BeginUpdate() et EndUpdate() (que j'utilise déjà) elles améliorent les performances d'environ 10% .

    Ma solution pour ceux qui sont intéressés:

    Faire des copies de la CheckedListBox. Je m'explique

    dans mon appli (écran), j'ai 3 DataGridViews de deux colonnes (code, libellé), les données des 3 DataGridViews sont liées entre elles (fournisseur, entrepôt, produit). Pour chaqu'une des colonnes, j'ai un objet classe qui créer et gère la checkedListBox dont le contenu correspond au contenu de la colonne du dataGridView (c'est un DropDownFilter)

    Donc, il faut faire des copies des CheckedListBoxs en aval, si les données n'ont pas changée, tu rappel la copie, sinon recréer le liste.

    Ce n'est pas la meilleure façon de faire mais ca marche.

    Voilà.


    Cordialement
    jeudi 5 mai 2011 12:25
  • Bonjour,

    Je suis désolé mais après de nombreuses relectures de vôtre question et vôtre réponse, il y a certains points qui ne me semblent pas clair.

    - la requête que vous avez fournie dans vôtre question est-elle du LINQ ? Et pourquoi utiliser une variable anonyme dedans ? Je sais que la mode est aux variables anonymes, mais je réagis comme une personne ayant dèveloppé pendant 25 ans dans une dizaine de langages aussi différents que APL,COBOL,Pascal,C,Basic ( Borland et microsoft ),C++ et VC# : c'est beau, c'est rapide et c'est illisible , donc maintenance difficile ( chez différents clients , j'ai maintenu pendant 10 ans le même programme sans difficulté car j'écrivais mon code de façon simple et clair ). Quel est le vrai type de datalistBox ?

    - pourquoi ne pas charger vos données dans une datatable d'un dataset ( CheckListBox.DataSource = VotreDataTable ) et utiliser la propriété DataMember pour sélectionner le champ rowVisible ?

    http://msdn.microsoft.com/fr-fr/library/system.windows.forms.listcontrol.datasource(VS.90).aspx

    http://msdn.microsoft.com/fr-fr/library/system.windows.forms.listcontrol.displaymember(VS.90).aspx

    A moins que vous ne puissiez utiliser une CheckedListBox à cause de

    "You cannot bind data to a CheckedListBox. Use a ComboBox or a ListBox for this instead. For more information, see How to: Bind a Windows Forms ComboBox or ListBox Control to Data."

    - Pourriez-vous expliquer ce que vous voulez dire avec "(c'est un DropDownFilter)" ?

    Il est visible que vous connaissez bien vôtre application et vôtre problème. Par contre, les personnes qui vous répondent ne connaissent que ce que écrivez et je sais combien il est difficile de trouver tous les renseignements qui permettraient de vous aider à trouver une solution acceptable ( fiable et simple à mettre en oeuvre ) pour vous. Ce n'est pas une critique à vôtre égard, mais je réponds à des questions concernant VB, VC#,.Net Framework, SQL Server ( T-SQL,SMO,ADO.Net...). Pour chaque fil, j'essaie de cerner au plus près le problème et c'est pourquoi je pose toutes ces questions. 

    - Pourriez-vous nous dire d'où proviennent toutes ces données ( bases de données mais laquelle SQL Server,Oracle,... version et édition) ?

    - version de vôtre .Net Framework et version/edirion de vôtre outil de développement ( sans doute Visual Studio quelle année )

    Bonne journée


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    jeudi 5 mai 2011 20:55
  • Bonjour,

    Excusez moi si je n'étais pas claire.

    Pour la dataListBox c'est une requête Linq et le type anonyme résultant est un tableau DataRow

    Mon code exact de romplissage de ma CheckedListBox

    Dim dataListBox = From rowVisible As DataRow In rowsTable.AsEnumerable() _
                                           Select rowVisible
                    For Each item As DataRow In dataListBox
                        dropDownListBox.Items.Add(item(currentColumnFilter), item(3))
                    Next

    avec : rowsTable as DataRow() de 5 colonnes

    dropDownListBox as CheckedListBox

    currentColumnFilter as String

    FrameWork 4 VB Express 2010

    source de données Multi Base de données (ca peut être Oracle, Postgres, SqlServer, ....)

    DopDownFilter :

    Sur chaque Header de colonne du DataGridView je créer une petit bouton, qui permet d'afficher la CheckedListBox (c'est objet indépendant qui contient la CheckedListBo, un bouton valider, un bouton annuler et un TextBox de recherche dans la CheckedListBox)

    comme son nom l'indique, il sert à filtrer le contenu du DataGridView, on cochant décochant dans la CheckedListBox vous choisissez les enregistrements a affichés.

    Pour l'utilisation de la propriété DataSource j'ai déjà pensé à ça.

    Je pense que je suis un peu plus claire.

     


    Cordialement
    vendredi 6 mai 2011 15:36