AndreaP92 Ответов: 2

Listview несколько столбцов ширины


Здравствуйте, я использую два listview в режиме "Detail".
потому что я хотел бы сделать что-то вроде этого
|   HELLO   |   WORLD   |        HI       | --- Listview2
| Ch1 | Ch2 | Ch3 | Ch4 | Ch5 | Ch6 | Ch7 | --- Listview1
| etc.| ... | ...


и я хочу иметь возможность изменять размер каждого столбца из каждого списка. Изменение размера другого в другом listview.
Кто-нибудь может мне помочь?
я получаю
An unhandled exception of type 'System.StackOverflowException' in System.Windows.Forms.dll


Что я уже пробовал:

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

[no name]

Вероятно, потому, что вы меняете ширину столбца, который запускает событие, которое изменяет ширину столбца, который запускает событие, пока вы не переполните стек.

AndreaP92

Извините за мой плохой английский! да я тоже думаю но не могу найти никакого решения :(

2 Ответов

Рейтинг:
4

AndreaP92

Решается вот так, Спасибо тебе, Майкл.

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


Michael_Davies

Вы тестируете неправильное логическое значение:

Если ListView1Changing = False, То
ListView2Changing = True

Рейтинг:
1

Michael_Davies

Попробуйте любой из этих методов:

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

Или
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


AndreaP92

Спасибо Майклу, я попробовал, оба кода работают только для первого столбца listview2 и первых двух listview1.

Michael_Davies

Покажите свой измененный код.

AndreaP92

Форма Публичного Класса 1

Private ListView1Changing As Boolean = False
Private Sub ListView1_ColumnWidthChanged (sender As Object, e As ColumnWidthChangedEventArgs) обрабатывает ListView1. ColumnWidthChanged
Если ListView1Changing = False, То
ListView1Changing = True
ColumnHeader1.Ширина = ColumnHeader4.Ширина + ColumnHeader5.Ширина
ColumnHeader2.Ширина = ColumnHeader6.Ширина + ColumnHeader7.Ширина
ColumnHeader3.Ширина = ColumnHeader8.Ширина + ColumnHeader9.Ширина + ColumnHeader10.Ширина
ListView1Changing = False
Конец, Если
Конец Подводной Лодки

Private ListView2Changing As Boolean = False
Private Sub ListView2_ColumnWidthChanged (sender As Object, e As ColumnWidthChangedEventArgs) обрабатывает ListView2. ColumnWidthChanged
Если ListView2Changing = False, То
ListView2Changing = True
ColumnHeader4.Ширина = ColumnHeader1.Ширина / 2
ColumnHeader5.Ширина = ColumnHeader1.Ширина / 2
ColumnHeader6.Ширина = ColumnHeader2.Ширина / 2
ColumnHeader7.Ширина = ColumnHeader2.Ширина / 2
ColumnHeader8.Ширина = ColumnHeader3.Ширина / 3
ColumnHeader9.Ширина = ColumnHeader3.Ширина / 3
ColumnHeader10.Ширина = ColumnHeader3.Ширина / 3
ListView2Changing = False
Конец, Если
Конец Подводной Лодки

'Private Sub ListView1_ColumnWidthChanged (sender As Object, e As ColumnWidthChangedEventArgs) обрабатывает ListView1. ColumnWidthChanged

'Метод Removehandler Мыши Listview1.ColumnWidthChanged, Оператором Addressof ListView1_ColumnWidthChanged

'ColumnHeader1.Ширина = ColumnHeader4.Ширина + ColumnHeader5.Ширина
'ColumnHeader2.Ширина = ColumnHeader6.Ширина + ColumnHeader7.Ширина
'ColumnHeader3.Ширина = ColumnHeader8.Ширина + ColumnHeader9.Ширина + ColumnHeader10.Ширина

'Добавитьобработчик Мыши Listview1.ColumnWidthChanged, Оператором Addressof ListView1_ColumnWidthChanged

- Конец Субмарины

'Private Sub ListView2_ColumnWidthChanged (sender As Object, e As ColumnWidthChangedEventArgs) обрабатывает ListView2. ColumnWidthChanged

'RemoveHandler ListView2. ColumnWidthChanged, AddressOf ListView2_ColumnWidthChanged

'ColumnHeader4.Ширина = ColumnHeader1.Ширина / 2
'ColumnHeader5.Ширина = ColumnHeader1.Ширина / 2
'ColumnHeader6.Ширина = ColumnHeader2.Ширина / 2
'ColumnHeader7.Ширина = ColumnHeader2.Ширина / 2
'ColumnHeader8.Ширина = ColumnHeader3.Ширина / 3
'ColumnHeader9.Ширина = ColumnHeader3.Ширина / 3
'ColumnHeader10.Ширина = ColumnHeader3.Ширина / 3

'AddHandler ListView2. ColumnWidthChanged, AddressOf ListView2_ColumnWidthChanged

- Конец Субмарины

Конец Класса

Michael_Davies

Обработчик работает для любого изменения ширины столбца в listview, помещает разрыв в обработчик событий и использует отладчик, чтобы увидеть, что происходит.

Например, глядя на вашу логику, если вы измените ширину столбца columnheader4 LV2, обработчик событий сбросит его на ширину header1/2, так что вы никогда не увидите изменений.