Listview Question

Hi People !

I have a listview, which has 4 columns - the size of the data in each column varies - I need to set the width of the columns to the widest entry made

Anyone have any snippet of code I can study from or an example else where ??

Regards

KhrisE
LVL 1
KhrisEAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
VindaConnect With a Mentor Commented:
This should perform what u require....


Private Const LVSCW_AUTOSIZE = -1
Private Const LVSCW_AUTOSIZE_USEHEADER = -2
Private Const LVM_FIRST                          As Long = &H1000
Private Const LVM_SETCOLUMNWIDTH                 As Long = LVM_FIRST + 30

Private Enum AutoSizeStyles
   UseNoHeader = LVSCW_AUTOSIZE
   UseHeader = LVSCW_AUTOSIZE_USEHEADER
End Enum

Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
                                                    (ByVal hwnd As Long, _
                                                     ByVal wMsg As Long, _
                                                     ByVal wParam As Long, _
                                                     ByVal lParam As Long) As Long

Private Sub Command2_Click()
    'Pass the ListView object
    AdjustHeaderWidth ListView1
End Sub

Private Function AdjustHeaderWidth(lv As ListView) As Boolean
    Dim iIndex              As Long
    Dim lAutoSizeOn         As Long
    Dim lColCount           As Long
    Dim SizeToHeader        As Boolean

    'initially set the return value to false
    AdjustHeaderWidth = False

    'get the column count
    lColCount = lv.ColumnHeaders.Count - 1
    'get the resize flag
    lAutoSizeOn = LVSCW_AUTOSIZE_USEHEADER

    'resize each column
    For iIndex = 0 To lColCount
        Call SendMessageLong(lv.hwnd, LVM_SETCOLUMNWIDTH, iIndex, ByVal lAutoSizeOn)
    Next

    'return
    AdjustHeaderWidth = True

End Function
0
 
TimCotteeHead of Software ServicesCommented:
Ok, what you need to do is this, assuming that the font of each column is the same and is the same as the font set on the form (if it is different then it is still achievable but needs an extra step).

Go through each row in the listview for each column and calculate the following value for each column's text:

Me.TextWidth(ListView1.SubItems(2)) 'Assuming column 2

Determine the max value of this and add a little (say 100) for luck. Then set the width of this column equal to that value.
0
 
KhrisEAuthor Commented:
a small example mabe ?
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
OtanaCommented:
Try this:

Dim MaxWidth As Long

MaxWidth = 0

For i = 1 To ListView1.ColumnHeaders.Count
    If ListView1.ColumnHeaders(i).Width > MaxWidth Then
        MaxWidth = ListView1.ColumnHeaders(i).Width
    End If
Next i

For i = 1 To ListView1.ColumnHeaders.Count
    ListView1.ColumnHeaders(i).Width = MaxWidth
Next i
0
 
TimCotteeHead of Software ServicesCommented:
Dim dblMaxWidth As Double

For intCol = 1 To ListView1.ColumnHeaders.Count
  dblMaxWidth = 0
  For intRow = 1 To ListView1.ListItems.Count
    If Me.TextWidth(ListView1.ListItems(intRow).SubItems(intCol) > dblMaxWidth Then
      dblMaxWidth = Me.TextWidth(ListView1.ListItems(intRow).SubItems(intCol)
    End If
  Next
  ListView1.ColumnHeaders(intCol).Width = dblMaxWidth + 100
Next
0
 
OtanaCommented:
I seem to have misread the question. I'm sorry.
0
 
VindaCommented:
This should perform what u require....


Private Const LVSCW_AUTOSIZE = -1
Private Const LVSCW_AUTOSIZE_USEHEADER = -2
Private Const LVM_FIRST                          As Long = &H1000
Private Const LVM_SETCOLUMNWIDTH                 As Long = LVM_FIRST + 30

Private Enum AutoSizeStyles
   UseNoHeader = LVSCW_AUTOSIZE
   UseHeader = LVSCW_AUTOSIZE_USEHEADER
End Enum

Private Declare Function SendMessageLong Lib "user32" Alias "SendMessageA" _
                                                    (ByVal hwnd As Long, _
                                                     ByVal wMsg As Long, _
                                                     ByVal wParam As Long, _
                                                     ByVal lParam As Long) As Long

Private Sub Command2_Click()
    'Pass the ListView object
    AdjustHeaderWidth ListView1
End Sub

Private Function AdjustHeaderWidth(lv As ListView) As Boolean
    Dim iIndex              As Long
    Dim lAutoSizeOn         As Long
    Dim lColCount           As Long
    Dim SizeToHeader        As Boolean

    'initially set the return value to false
    AdjustHeaderWidth = False

    'get the column count
    lColCount = lv.ColumnHeaders.Count - 1
    'get the resize flag
    lAutoSizeOn = LVSCW_AUTOSIZE_USEHEADER

    'resize each column
    For iIndex = 0 To lColCount
        Call SendMessageLong(lv.hwnd, LVM_SETCOLUMNWIDTH, iIndex, ByVal lAutoSizeOn)
    Next

    'return
    AdjustHeaderWidth = True

End Function
0
 
KhrisEAuthor Commented:
Mnay thanks for the assistance Vinda - it was a great help <s> - many thanks to the other guys for putting in the effort

KhrisE
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.