Combodata acces - liste un champ et donne son index dans la base

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 065 fois - Téléchargée 33 fois

Contenu du snippet

C'est un controle personnaliser pour le DAO et access.
Vous lui passé un recordset en paramètre, lui dite quel champ il doit afficher
On peut lui dire d'afficher tel index de la base, tel index du combo, il renvoi toujours la valeur de la base et son index correspondant.
Enfin, le code est court et simple je pense.

Source / Exemple :


Imports dao

Public Class CboxData
    Inherits System.Windows.Forms.ComboBox

#Region " Code généré par le Concepteur Windows Form "

    Public Sub New()
        MyBase.New()

        'Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        'Ajoutez une initialisation quelconque après l'appel InitializeComponent()

    End Sub

    'La méthode substituée Dispose du UserControl pour nettoyer la liste des composants.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Requis par le Concepteur Windows Form
    Private components As System.ComponentModel.IContainer

    'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
    'Elle peut être modifiée en utilisant le Concepteur Windows Form.  
    'Ne la modifiez pas en utilisant l'éditeur de code.
    Friend WithEvents ComboBox1 As System.Windows.Forms.ComboBox
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.ComboBox1 = New System.Windows.Forms.ComboBox
        '
        'ComboBox1
        '
        Me.ComboBox1.Location = New System.Drawing.Point(17, 17)
        Me.ComboBox1.Name = "ComboBox1"
        Me.ComboBox1.TabIndex = 0
        Me.ComboBox1.Text = ""

    End Sub

#End Region

#Region "Variables Privées"
    Private m_table As Recordset
    Private m_Champ As Integer = 0
    Private m_ChampMax As Integer = 0
    Private m_IndexBase As Integer = -1
    Private m_cb As ComboBox
#End Region

#Region "Propriètès Publiques"
    Public ReadOnly Property DataTable() As Recordset 'Table utilisée
        Get
            Return m_table
        End Get
    End Property
    Public Property DataChampALister() As Integer 'Champs qui sera listé
        Get
            Return m_Champ
        End Get
        Set(ByVal Value As Integer)
            If Value < 0 Then Value = 0
            If Value > m_ChampMax Then Value = m_ChampMax
            m_Champ = Value
        End Set
    End Property
    Public ReadOnly Property DataIndex() As Integer 'Index dans la base du champ en cours
        Get
            Return m_IndexBase
        End Get
    End Property
#End Region

#Region "Methodes"
    'Permet de charger la table (recordset) dans le combo (et le combo des index)
    Public Sub DataLoad(ByVal DataTable As Recordset, ByVal DataChampALister As Integer)
        If m_cb Is Nothing Then m_cb = New ComboBox 'Création d'un combo caché pour les index
        m_table = DataTable
        m_ChampMax = m_table.Fields.Count - 1
        If DataChampALister < 0 Then m_Champ = 0
        If DataChampALister > m_ChampMax Then m_Champ = m_ChampMax
        m_Champ = DataChampALister
        Me.Items.Clear()
        m_cb.Items.Clear()
        If m_table Is Nothing Then Exit Sub 'Si pas de table on sort
        If m_table.RecordCount = 0 Then Exit Sub 'Si pas de données on sort
        Try
            With m_table
                .MoveFirst()
                Do While Not .EOF
                    Me.Items.Add(.Fields(m_Champ).Value) 'Met valeur
                    m_cb.Items.Add(.Fields(0).Value) 'Met index base (on suppose que c'est le champ 0
                    .MoveNext()
                Loop
            End With
        Catch ex As Exception

        End Try
    End Sub
    'Affiche valeur pour l'index de la base donné
    Public Sub DataShow(ByVal DataIndex As Integer)
        If DataIndex = -1 Then Me.Text = ""
        If m_table Is Nothing Then Exit Sub
        If m_cb Is Nothing Then Exit Sub
        m_cb.Text = DataIndex.ToString
        Me.SelectedIndex = m_cb.SelectedIndex
    End Sub
#End Region

#Region "Suivi Selection"
    'Surveille les changement du combodata pour mettre a jour l'index de la base
    Private Sub CboxData_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.SelectedIndexChanged
        Actualiser()
    End Sub
    Private Sub CboxData_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.SelectedValueChanged
        Actualiser()
    End Sub
    Private Sub CboxData_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.TextChanged
        Actualiser()
    End Sub
    Private Sub Actualiser()
        On Error Resume Next
        If m_cb Is Nothing Then Exit Sub
        m_cb.SelectedIndex = Me.SelectedIndex
        m_IndexBase = Val(m_cb.Text)
    End Sub
#End Region
End Class

Conclusion :


Il s'agit d'un usercontrol basé sur un combobox et qui utilise la reference COM DAO
Donc à ajouter aux références de votre projet

A voir également

Ajouter un commentaire

Commentaires

Messages postés
91
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
3 décembre 2011

Auto Critique :
Il est posible avec DAO de se passer de ce controle,

à savoir un recordset à la propriètè absoluteposition, donc si on veut remplir un combobox avec une table, on obteint :
combobox.SelectedIndex = Recodset.absoluteposition.

Je ne me sers plus que de ça, sauf si des tris sont affectés dans le recordset après sa création et non dans sa création.
Messages postés
50
Date d'inscription
vendredi 6 août 2004
Statut
Membre
Dernière intervention
16 janvier 2015

Public cn As New OleDb.OleDbConnection
Public WithEvents da As OleDb.OleDbDataAdapter
Public ds As New DataSet

cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\Base de données\la base de donné.mdb;"

da = New OleDb.OleDbDataAdapter("SELECT * FROM Discipline", cn)
da.Fill(ds, "Discipline")

'cmb_discipline étant la combo
Cmb_Discipline.DataSource = ds
Cmb_Discipline.DisplayMember = "Discipline.Nom"

voila pour un remplissage facile de la combo!
Pour le reste je cherche!
Messages postés
91
Date d'inscription
mercredi 27 février 2002
Statut
Membre
Dernière intervention
3 décembre 2011

Et bien que l'on me donne une manière simple rapide et efficace pour utiliser adp.net et conserver la meme souplesse au niveau du code que celle des objets recordset de dao. Car à ma connaissance, en ado (.net ou non) les propriètè et méthodes des dataset (recordset) n'ont pas les mêmes méthodes, et certaines manque plus que cruellement (Le findfirst par exemple).

Bref.......
Messages postés
31
Date d'inscription
jeudi 26 mai 2005
Statut
Membre
Dernière intervention
17 novembre 2005

C'est cool, mais quel est l'intêret de passer par DAO alors qu'on a ADO.Net? Là t'es obligé d'ajouter la référence alors que sinon non. Et vaut mieux utiliser les dataset que les recordset, ils sont là pour ça.
Bref, quitte à utiliser VB.Net, autant faire du .Net et non du VB6... ;-)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.