Click here to Skip to main content
15,887,683 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello, i'm using two listview in "Detail" mode.
cause i'd like to do something like this
HTML
|   HELLO   |   WORLD   |        HI       | --- Listview2
| Ch1 | Ch2 | Ch3 | Ch4 | Ch5 | Ch6 | Ch7 | --- Listview1
| etc.| ... | ...


and i want be able to resize each column from each listviews. Changing the size of the other in the other listview.
Can somebody help me?
i'm getting
VB.NET
An unhandled exception of type 'System.StackOverflowException' in System.Windows.Forms.dll


What I have tried:

VB
Private Sub ListView1_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView1.ColumnWidthChanged
    Ch_hello.Width = ColumnHeader1.Width + ColumnHeader2.Width
    Ch_world.Width = ColumnHeader3.Width + ColumnHeader4.Width
    Ch_hi.Width = ColumnHeader5.Width + ColumnHeader6.Width + ColumnHeader7.Width
End Sub
Private Sub ListView2_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView2.ColumnWidthChanged
     ColumnHeader1.Width = Ch_hello.Width / 2
     ColumnHeader2.Width = Ch_hello.Width / 2
     ColumnHeader3.Width = Ch_World.Width / 2
     ColumnHeader4.Width = Ch_World.Width / 2
     ColumnHeader5.Width = Ch_hi.Width / 3
     ColumnHeader6.Width = Ch_hi.Width / 3
     ColumnHeader7.Width = Ch_hi.Width / 3
End Sub
Posted
Updated 9-Dec-16 5:42am
v2
Comments
[no name] 9-Dec-16 10:50am    
Probably because you are changing the column width which triggers the event that changes the column width which triggers the event until you overflow the stack.
AndreaP92 9-Dec-16 10:53am    
Sorry for my bad english! yes i think too but i can't find any solution :(

Try either method:
VB
Private ListView1Changing as Boolean = false
Private Sub ListView1_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView1.ColumnWidthChanged
if ListView1Changing = false Then
   ListView1Changing = true
    Ch_hello.Width = ColumnHeader1.Width + ColumnHeader2.Width
    Ch_world.Width = ColumnHeader3.Width + ColumnHeader4.Width
    Ch_hi.Width = ColumnHeader5.Width + ColumnHeader6.Width + ColumnHeader7.Width
   ListView1Changing = false
Endif
End Sub

Or
VB
Private Sub ListView1_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView1.ColumnWidthChanged

RemoveHandler ListView1, AddressOf ListView1_ColumnWidthChanged

    Ch_hello.Width = ColumnHeader1.Width + ColumnHeader2.Width
    Ch_world.Width = ColumnHeader3.Width + ColumnHeader4.Width
    Ch_hi.Width = ColumnHeader5.Width + ColumnHeader6.Width + ColumnHeader7.Width

AddHandler ListView1, AddressOf ListView1_ColumnWidthChanged

End Sub
 
Share this answer
 
Comments
AndreaP92 9-Dec-16 11:11am    
Thanks Michael, i tried, both the codes are working only for the first column of listview2 and the first two of listview1.
Michael_Davies 9-Dec-16 11:18am    
Show your altered code.
AndreaP92 9-Dec-16 11:23am    
Public Class Form1

Private ListView1Changing As Boolean = False
Private Sub ListView1_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView1.ColumnWidthChanged
If ListView1Changing = False Then
ListView1Changing = True
ColumnHeader1.Width = ColumnHeader4.Width + ColumnHeader5.Width
ColumnHeader2.Width = ColumnHeader6.Width + ColumnHeader7.Width
ColumnHeader3.Width = ColumnHeader8.Width + ColumnHeader9.Width + ColumnHeader10.Width
ListView1Changing = False
End If
End Sub

Private ListView2Changing As Boolean = False
Private Sub ListView2_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView2.ColumnWidthChanged
If ListView2Changing = False Then
ListView2Changing = True
ColumnHeader4.Width = ColumnHeader1.Width / 2
ColumnHeader5.Width = ColumnHeader1.Width / 2
ColumnHeader6.Width = ColumnHeader2.Width / 2
ColumnHeader7.Width = ColumnHeader2.Width / 2
ColumnHeader8.Width = ColumnHeader3.Width / 3
ColumnHeader9.Width = ColumnHeader3.Width / 3
ColumnHeader10.Width = ColumnHeader3.Width / 3
ListView2Changing = False
End If
End Sub

'Private Sub ListView1_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView1.ColumnWidthChanged

' RemoveHandler ListView1.ColumnWidthChanged, AddressOf ListView1_ColumnWidthChanged

' ColumnHeader1.Width = ColumnHeader4.Width + ColumnHeader5.Width
' ColumnHeader2.Width = ColumnHeader6.Width + ColumnHeader7.Width
' ColumnHeader3.Width = ColumnHeader8.Width + ColumnHeader9.Width + ColumnHeader10.Width

' AddHandler ListView1.ColumnWidthChanged, AddressOf ListView1_ColumnWidthChanged

'End Sub

'Private Sub ListView2_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView2.ColumnWidthChanged

' RemoveHandler ListView2.ColumnWidthChanged, AddressOf ListView2_ColumnWidthChanged

' ColumnHeader4.Width = ColumnHeader1.Width / 2
' ColumnHeader5.Width = ColumnHeader1.Width / 2
' ColumnHeader6.Width = ColumnHeader2.Width / 2
' ColumnHeader7.Width = ColumnHeader2.Width / 2
' ColumnHeader8.Width = ColumnHeader3.Width / 3
' ColumnHeader9.Width = ColumnHeader3.Width / 3
' ColumnHeader10.Width = ColumnHeader3.Width / 3

' AddHandler ListView2.ColumnWidthChanged, AddressOf ListView2_ColumnWidthChanged

'End Sub

End Class
Michael_Davies 9-Dec-16 11:44am    
The handler works for any columnwidth change on the listview, put a break in the event handler and use the debugger to see what is happening.

For instance, looking at your logic, if you alter the column width of LV2's columnheader4 the event handler would reset it to header1's width/2, so you would never see a change.
Solved like this thank you Michael.

VB
Private ListView2Changing As Boolean = False
Private ListView1Changing As Boolean = False

Private Sub ListView2_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView2.ColumnWidthChanged
    If ListView1Changing = False Then
        ListView2Changing = True
        ColumnHeader4.Width = ColumnHeader1.Width / 2
        ColumnHeader5.Width = ColumnHeader1.Width / 2
        ColumnHeader6.Width = ColumnHeader2.Width / 2
        ColumnHeader7.Width = ColumnHeader2.Width / 2
        ColumnHeader8.Width = ColumnHeader3.Width / 3
        ColumnHeader9.Width = ColumnHeader3.Width / 3
        ColumnHeader10.Width = ColumnHeader3.Width / 3
        ListView2Changing = False
    End If
End Sub
Private Sub ListView1_ColumnWidthChanged(sender As Object, e As ColumnWidthChangedEventArgs) Handles ListView1.ColumnWidthChanged
    If ListView2Changing = False Then
        ListView1Changing = True
        ColumnHeader1.Width = ColumnHeader4.Width + ColumnHeader5.Width
        ColumnHeader2.Width = ColumnHeader6.Width + ColumnHeader7.Width
        ColumnHeader3.Width = ColumnHeader8.Width + ColumnHeader9.Width + ColumnHeader10.Width
        ListView1Changing = False
    End If
End Sub
 
Share this answer
 
Comments
Michael_Davies 9-Dec-16 12:09pm    
You test the wrong boolean:

If ListView1Changing = False Then
ListView2Changing = True

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900