Comment surcharger la classe "ListView" pour intégrer un "DataSource"
kriesgraf
Messages postés33Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention17 février 2021
-
2 sept. 2008 à 15:01
kriesgraf
Messages postés33Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention17 février 2021
-
3 sept. 2008 à 13:55
Je souhaitais avoir un control ListView avec des grandes icônes qui soit rempli à partir d'une collection d'object "bindable" du genre:
Control.DataSource= list
Control.DisplayMember= "Name"
Control.ValueMember= "Icon"
Chaque object fournirait son nom et le numéro d'index de l'icone dans un control "ImageList".
Voilà comment procéder:
- Créer un nouveau projet genre "ListViewProject"
- Copier d'abord le code source des classes ClassData & DataListView dans un fichier de classe de même nom.
- Compiler tout de suite pour que le nouveau control "DataListView" apparaisse dans la fenêtre "Boîte à outils".
- Créer un nouveau formulaire "Form1" et insérer un composant "ImageList" et ce nouveau composant "DataListView".
- Insérer une fichier .ICO dans le control ImageList1
- Créer une procédure pour l'événement "Me.Load" et "DataListView.SelectedIndexChanged"
- Insérer le code source que vous trouverez ci-dessous dans la classe Form1
Puis incorporer un control "ImageList" (Name=ImageList1) dans Form1.vb
'===================================================================================
Public Class ClassData
Private m_strName As String
Private m_iIcon As Integer
Public Property Name() As String
Get
Return m_strName
End Get
Set(ByVal value As String)
m_strName = value
End Set
End Property
Public Property Icon() As Integer
Get
Return m_iIcon
End Get
Set(ByVal value As Integer)
m_iIcon = value
End Set
End Property
Public Sub New(ByVal value As String)
m_strName = value
m_iIcon = 0
End Sub
End Class
'===================================================================================
Public Class Form1
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim list As New ArrayList
list.Add(New ClassData("Name1"))
list.Add(New ClassData("Name2"))
list.Add(New ClassData("Name3"))
list.Add(New ClassData("Name4"))
list.Add(New ClassData("Name5"))
list.Add(New ClassData("Name6"))
DataListView1.DataSource = list
DataListView1.DisplayMember = "Name"
DataListView1.ValueMember = "Icon"
End Sub
Private Sub DataListView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataListView1.SelectedIndexChanged
Dim list As List(Of Object) = DataListView1.SelectedItems()
Dim first As Object = DataListView1.FirstSelectedItem()
Dim last As Object = DataListView1.LastSelectedItem()
End Sub
End Class
Private m_bindingSource As New BindingSource
Private m_oDataSource As Object
Private m_strDisplayMember As String
Private m_strValueMember As String
''' <summary>
''' Source to bind
''' </summary>
Public Property DataSource() As Object
Get
Return m_oDataSource
End Get
Set(ByVal value As Object)
m_oDataSource = value
InitBinding()
End Set
End Property
''' <summary>
''' Property to bind
''' </summary>
Public Property DisplayMember() As String
Get
Return m_strDisplayMember
End Get
Set(ByVal value As String)
m_strDisplayMember = value
InitBinding()
End Set
End Property
''' <summary>
''' Property to bind
''' </summary>
Public Property ValueMember() As String
Get
Return m_strValueMember
End Get
Set(ByVal value As String)
m_strValueMember = value
InitBinding()
End Set
End Property
''' <summary>
''' Get the first selected object of data source
''' </summary>
Public ReadOnly Property FirstSelectedItem() As Object
Get
Return m_bindingSource.List(MyBase.SelectedIndices(0))
End Get
End Property
''' <summary>
''' Get the last selected object of data source
''' </summary>
Public ReadOnly Property LastSelectedItem() As Object
Get
Dim iLast As Integer = MyBase.SelectedIndices(MyBase.SelectedIndices.Count - 1)
Return m_bindingSource.List(iLast)
End Get
End Property
''' <summary>
''' Get list of selected objects of data source
''' </summary>
Public Overloads ReadOnly Property SelectedItems() As List(Of Object)
Get
Dim listResult As New List(Of Object)
For Each i As Integer In MyBase.SelectedIndices
listResult.Add(m_bindingSource.List(i))
Next i
Return listResult
End Get
End Property
Private Sub InitBinding()
If m_strDisplayMember = "" Or _
m_strValueMember = "" Or _
m_oDataSource Is Nothing _
Then
Exit Sub
End If
Dim lvitem As ListViewItem
m_bindingSource.DataSource = m_oDataSource
Dim descDisplayProperty As PropertyDescriptor = m_bindingSource.GetItemProperties(Nothing)(m_strDisplayMember)
Dim descValueProperty As PropertyDescriptor = m_bindingSource.GetItemProperties(Nothing)(m_strValueMember)
m_bindingSource.Position = 0
While m_bindingSource.Position + 1 < m_bindingSource.Count
Dim strName As String = CType(descDisplayProperty.GetValue(m_bindingSource.Current), String)
Dim iIcon As Integer = CType(descValueProperty.GetValue(m_bindingSource.Current), Integer)
lvitem = New ListViewItem(strName, iIcon)
Items.Add(lvitem)
m_bindingSource.Position = m_bindingSource.Position + 1
End While
End Sub
End Class
'===================================================================================
kriesgraf
A voir également:
Comment surcharger la classe "ListView" pour intégrer un "DataSource"
kriesgraf
Messages postés33Date d'inscriptionmardi 11 mai 2004StatutMembreDernière intervention17 février 2021 3 sept. 2008 à 13:55
J'ai un peu changé la boucle while dans la méthode "DataListView.InitBinding"; car il me manquait le dernier élément.
Attention : la propriété "BindingSource.Position" ne s'incrémente plus si on est à la fin de la liste, ce qui pourrait entraîner une boucle sans fin !!!!
' m_bindingSource.Position 0
Dim bContinue As Boolean = True
While bContinue
Dim strName As String = CType(descDisplayProperty.GetValue(m_bindingSource.Current), String)
Dim iIcon As Integer = 0
If descValueProperty IsNot Nothing Then
iIcon = CType(descValueProperty.GetValue(m_bindingSource.Current), Integer)
End If
lvitem = New ListViewItem(strName, iIcon)
Debug.Print(strName)
Items.Add(lvitem)
If m_bindingSource.Position + 1 < m_bindingSource.Count Then
m_bindingSource.Position = m_bindingSource.Position + 1
Else
bContinue = False
End If
End While