Vider une listbox en VB.NET

Fermé
Lh - 23 nov. 2016 à 00:57
arion320 Messages postés 233 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 4 février 2022 - 7 janv. 2017 à 13:17
Bonjour et Merci de votre attention que vous porterez à mon égard !
Je suis novice en VB.NET sur Visual Basic et j’aimerai avoir votre aide sur ce problème svp !





Voici afficher les éléments liés à LOUHOU de la listbox1 dans la listbox2(Orange,Galette,Safou,Pulpe).
But : A chaque Double Clique sur un Nom de la Listbox1, J’aimerai afficher les marchandises qui lui sont liées puis, lors d’un nouveau Double clique sur un Nom, j’aimerai vider le contenu précédant de la listbox2, puis afficher les marchandises liées à ce nouveau Nom Double Cliqué.
Problème:
J’ai cherché sans trouver, mais j’ai comme même réussi à afficher les marchandises liées au Nom cliqué à chaque fois. Mais quand je clique encore sur un autre ou sur le même nom, les marchandises s’accumulent dans la listbox2,alors que je dois d'abord vider la listbox2 avant d'afficher les marchadises consernées par le nom Double cliqué.

Tentative: J'ai essayé de vider la listbox2 et j'ai obtenu une erreur disant que: DataSource is set. Donc je ne peux pas vider la listbox2 tant qu'il l'est. Svp j'en ai mare, aidez-moi. Alors que puis-je faire????
Voici mon Code en VB.NET :

Imports System
Imports System.Data
Imports System.Data.OleDb

Public Class Form1
    Private ObjetConnection As OleDbConnection
    Private ObjetCommand As OleDbCommand
    Private ObjetDataAdapter As OleDbDataAdapter
    Private ObjetDataSet As New DataSet
    Private N As Integer
    Private M As String
    Private strSql As String
    Private ObjetDataTable As DataTable
    Private ObjetDataRow As DataRow
    Private RowNumber As Integer
    Private strConn As String
    Private ObjetCommandBuilder As OleDbCommandBuilder

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=C:\logiciel de reseaux pour TP\BaseActuelessai.mdb;"
        strSql = "SELECT TableInfos .* FROM TableInfos"
        ObjetConnection = New OleDbConnection
        ObjetConnection.ConnectionString = strConn
        ObjetConnection.Open()
        ObjetCommand = New OleDbCommand(strSql)
        ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
        ObjetCommand.Connection() = ObjetConnection
        ObjetDataAdapter.Fill(ObjetDataSet, "TableInfos")
        ListBox1.DataSource = ObjetDataSet.Tables("TableInfos")
        ListBox1.DisplayMember = "Nom"
    End Sub

    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
        ListBox1.DisplayMember = "Nom"
        ListBox1.ValueMember = "NumeroInterne"
        ListBox1.DataSource = ObjetDataSet.Tables("TableInfos")
        RowNumber = ListBox1.SelectedValue
    End Sub

    Private Sub ListBox1_DoubleClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.DoubleClick
       
        strSql = "SELECT marchandises FROM ObjetsAchetés WHERE NombredAchat=" & ListBox1.SelectedValue & ""
        
        ObjetConnection = New OleDbConnection
        ObjetConnection.ConnectionString = strConn
        ObjetConnection.Open()
        ObjetCommand = New OleDbCommand(strSql)
        ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
        ObjetCommand.Connection() = ObjetConnection
        ObjetDataAdapter.Fill(ObjetDataSet, "ObjetsAchetés")
        ListBox2.DataSource = ObjetDataSet.Tables("ObjetsAchetés")
        ListBox2.DisplayMember = "marchandises"
    End Sub
End Class


Merci Beaucoup !
A voir également:

2 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
23 nov. 2016 à 08:13
Bonjour

Essaye de mettre Nothing au datasource avant de le réaffecter.
Si ça ne marche pas je peux te proposer une solution en chargeant ta base de données dans une liste et en travaillant sur cette liste, car les bases de données je n'en utilises pas donc je ne serai pas de bons conseils.
0
arion320 Messages postés 233 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 4 février 2022 22
7 janv. 2017 à 05:13
Me.ListBox1.Items.Clear()


C'est ça ?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
7 janv. 2017 à 08:54
Bonjour, non, dans son code on voit bien que la liste est bindée.
Dans ce cas on ne peut pas intervenir directement sur la collection Items.
D'ailleurs c'est ce qu'il a essayé e ce que dit le message d'erreur
J'ai essayé de vider la listbox2 et j'ai obtenu une erreur disant que: DataSource is set.

Il faut agir sur la source de donnée.

Or quand on modifie le datasource il peut y avoir une sorte de "conflit de référence" (je ne sais pas si c'est la bonne expression, mais en gros le datasource conserve la référence initiale, qui ne pointe plus vers rien) donc forcer Nothing avant d'affecter une nouvelle référence est souvent la solution la plus simple.
Ça le fait aussi avec une requête Linq que l'on cast en List, Tableau ou Dictionnaire avec ToList(), ToArray() ou ToDictonnary,(), car ces méthodes créent une nouvelle référence.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728
7 janv. 2017 à 09:00
Bonjour,

Comme ceci:

ObjetDataSet.Clear
ListBox2.Items.Clear()

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié par Whismeril le 7/01/2017 à 09:24
Peut être
ObjetDataSet.Clear
comme je l'avais indiqué initialement, je ne me sers jamais de bases de données, alors certaines fonctionnalités m'échappent.

Mais
ListBox2.Items.Clear()
non, sauf si au milieu tu as repassé le datasource à Nothing, mais en faisant
        ObjetDataAdapter.Fill(ObjetDataSet, "ObjetsAchetés")
        ListBox2.DataSource = Nothing 'juste cette ligne plus
        ListBox2.DataSource = ObjetDataSet.Tables("ObjetsAchetés")
        ListBox2.DisplayMember = "marchandises"

Cela suffit 9 fois sur 10, et comme la question a 2 mois, qu'il ne s'est jamais remanifesté, ben on peut supposer que cela a convenu.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 728 > Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024
7 janv. 2017 à 09:25
Bonjour Whismeril, je n'avais pas vu que la question avait 2 mois. A quoi sert-il de ressortir de tel post!
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
7 janv. 2017 à 09:26
Ha c'est à Arion qu'il faut le demander!
0
arion320 Messages postés 233 Date d'inscription lundi 20 décembre 2010 Statut Membre Dernière intervention 4 février 2022 22
7 janv. 2017 à 13:17
Oups désolé, je suis tomber dessus par hasard. C'est entièrement de ma faute. :x
0