Mon cpomosant ListView n'affiche rien !?

Résolu
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 - 1 juin 2013 à 18:11
Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 - 2 juin 2013 à 13:21
Bonjour à toute la communauté !!!

J'ai fait un composant personnalisé, hérité d'une listview que j'ai adapté pour ajouter des fichiers en affichant son icone sur la même ligne.
Bref... Depuis que je l'ai transféré de ma Form en Composant, il ne m'affiche plus rien pourtant j'ai bien désactivé le OwnerDraw.

Merci d'avance pour votre aide, je sèche ^^
Le composant:
Imports System.Drawing.Drawing2D
Imports System.ComponentModel
Imports System.Runtime.InteropServices

Public Class ListViewExplorer
    Inherits ListView

    Private Structure SHFILEINFO
        Public hIcon As IntPtr
        Public iIcon As Integer
        Public dwAttributes As Integer
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:= 260)> _
        Public szDisplayName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
        Public szTypeName As String
    End Structure

    Private Declare Ansi Function SHGetFileInfo Lib "shell32.dll" (ByVal pszPath As String, _
    ByVal dwFileAttributes As Integer, ByRef psfi As SHFILEINFO, ByVal cbFileInfo As Integer, _
    ByVal uFlags As Integer) As IntPtr

    Private Const SHGFI_ICON = &H100
    Private Const SHGFI_SMALLICON = &H1
    Private Const SHGFI_LARGEICON = &H0
    Private nIndex = 0

    Public Sub New()
        MyBase.New()
        MyBase.OwnerDraw = False
        MyBase.View = View.Details
        MyBase.FullRowSelect = True
        MyBase.SmallImageList = MyClass.ImageListExplorer
        MyBase.Font = New Font("Verdana", 8)
        MyBase.BackColor = Color.White
        MyBase.ForeColor = Color.Black
        MyBase.HeaderStyle = ColumnHeaderStyle.None
        MyBase.Scrollable = True
    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        MyBase.WndProc(m)
    End Sub

#Region "Public Fonctions"
    Public Sub _RefreshColumn()
        MyBase.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
    End Sub
    Public Sub _AppendAny(ByVal any As String)
        Dim extkey As String = CatchExtension(any)
        If MyClass.ImageListExplorer.Images.ContainsKey(extkey) = False Then
            'Me.ImageListExplorer.Images.Add(extkey, Icon.ExtractAssociatedIcon(any))
            MyClass.ImageListExplorer.Images.Add(extkey, GetSHIcon(any))
        End If
        MyBase.Items.Add(any, extkey)
    End Sub
    Private Function GetSHIcon(ByVal any As String) As Icon
        Dim hImgSmall As IntPtr
        Dim shinfo As SHFILEINFO = New SHFILEINFO
        hImgSmall = SHGetFileInfo(any, 0, shinfo, Marshal.SizeOf(shinfo), SHGFI_ICON Or SHGFI_SMALLICON)
        Dim myIcon As Icon = System.Drawing.Icon.FromHandle(shinfo.hIcon)
        Return myIcon
    End Function
    Private Function CatchExtension(ByVal any) As String
        Dim ext As String = IO.Path.GetExtension(any)
        If ext = "" Then Return "file"
        Return ext.ToUpper
    End Function
#End Region

#Region "Properties"
    Private ImageListEx As New ImageList
    Property ImageListExplorer() As ImageList
        Get
            Return ImageListEx
        End Get
        Set(ByVal value As ImageList)
            ImageListEx = value
            Invalidate()
        End Set
    End Property
#End Region

#Region "Mouse Events"
    Private Sub ListViewExplorer_MouseHover(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseHover
        If MyBase.ContainsFocus Or MyBase.CanFocus And Not MyBase.Focused Then
            MyBase.Focus()
        End If
    End Sub
    Private Sub ListViewExplorer_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
        Invalidate()
    End Sub
#End Region

End Class


Pour l'utilisation (sur un bouton):
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim diag As New OpenFileDialog
        Dim rt As String()
        diag.CheckFileExists  = True
        diag.CheckPathExists = True
        diag.Multiselect = True
        diag.DefaultExt = "*.*"
        diag.Filter = "Tous les fichiers (*.*)|*.*"
        diag.DereferenceLinks = False
        diag.Title = "Sélectionnez vos fichiers sources"
        If diag.ShowDialog = DialogResult.OK Then
            If Not diag.FileName = "" Then
                rt = diag.FileNames
                For Each file As String In rt
                    Me.ListViewExplorer1._AppendAny(file)
                Next
                Me.ListViewExplorer1._RefreshColumn()
            End If
        End If
    End Sub

1 réponse

Duke49 Messages postés 552 Date d'inscription jeudi 12 octobre 2006 Statut Non membre Dernière intervention 24 janvier 2023 4
2 juin 2013 à 13:21
MDR ^^

Si vous avez une listview avec le paramètre view.details et que les données que vous ajoutez ne s'affichent pas...
Bah c'est tout bête... comme moi ^^.
Vous devez simplement ajouter une colonne.

Je reprend un bout de mon code avec la correction:

    Public Sub New()
        MyBase.New()
        MyBase.OwnerDraw = False
        MyBase.View = View.Details
        MyBase.FullRowSelect = True
        MyBase.SmallImageList = MyClass.ImageListExplorer
        MyBase.Font = New Font("Verdana", 8)
        MyBase.BackColor = Color.White
        MyBase.ForeColor = Color.Black
        MyBase.HeaderStyle = ColumnHeaderStyle.None
        MyBase.Scrollable = True
        MyBase.Columns.Add("HiddenColHeader")
    End Sub
3
Rejoignez-nous