powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как лучше реализовать Add/Remove Columns на Listview?
15 сообщений из 15, страница 1 из 1
Как лучше реализовать Add/Remove Columns на Listview?
    #36287223
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как лучше реализовать Add/Remove Columns на Listview?
Видится 2 пути:
1) ListBox "Настройка полей" с галочками(видим/невидим) и кнопками вверх/вниз
2) Два listbox (1:Available columns 2:Displayed columns+move up+move down) с кнопками Add/Remove посредине.

Второй вариант видится красивше.
Сложность вижу такую:
Я хочу все поля хранить в Listbox (т.к. на основании одних, возм. скрытых элементов, могут вычисляться значения других, например индекс иконки в строке, или разрешаться/запрещаться какие-то действия).
Я не хочу давать возможность раздвигать мышью скрытые поля (где width=0)

Причем если вариант (1) c возможностью "раздвигать" еще куда ни шло, то если двигаться по варианту (2), то будет бардак, т.к. в первом случае последовательность полей (и видимых и невидимых) задана, и она одна и понятная: ну раздвинули, значит уже видимое, считай поставили галочку.

Возможно ли реализовать вариант 2 как я хочу, т.е. без дублирующих элементов (дублирующий текстовой файл и так существует, но я стараюсь не считывать его целиком и не лазить туда на тему строк, кот. и так отображаются).

Т.е. чтобы ширину НЕотображаемых столбцов нельзя было менять(не сделав их Displayed из окна настройки), но отображаемых-пожалуйста.

If Displayed=true
двигай меня сколько хочешь
else
моя ширина всегда 0 и не надо такие значки (<-||->) даже рисовать
end if
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36287631
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77If Displayed=true
двигай меня сколько хочешь
else
моя ширина всегда 0 и не надо такие значки (<-||->) даже рисовать
end ifУвы, это не получится, я пробовал. Единственное, что удалось придумать, это устанавливать 0 при MouseMove.

Jah loves you.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36288044
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже думал про это
>устанавливать 0 при MouseMove
при MouseMove чего? потому что
ListView1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, x As Single, y As Single)

похоже срабатывает только при движении по самому листу, а не по заголовкам.
А вообще ощущение что в некоторых даже майкрософтовских программах именно так и сделано, потому как в конце крайнего столбца присутствует значок "отобразить" <-||-> таки, т.е. все hide-столбцы именно в конец и свалены и скорее всего происходит именно то о чем сказали.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36288293
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел пока вот это в тему
http://www.eggheadcafe.com/software/aspnet/29754964/tooltiptext-and-the-listv.aspx

Anyway, a ListView and column headers are actually 2 separate controls..
The column headers are a Header control. The ListView is just capable of
automatically creating a Header control, but being a separate control, it
has its own messages and events (API-wise). The ListView as wrapped in the
Common Controls OCX simply doesn't expose messages/notifications for the
Header control as events. You can, however, subclass the Header control.

You shouldn't have a problem then detecting when the mouse is moved over it .

Страшное слово subclass меня пугает. Надо что нибудь еще найти, пока не догоняю, как движение мыши по Header control отследить.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36288612
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
You can, however, subclass the Header controlВо, блин. А я до этого не додумался, сабклассил только листвью. Попробую на досуге.

Jah loves you.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36288680
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не хорошо, а как нужную mousemove выловить,
хотя бы как вы делали.

Пока что роюсь в примерах здесь в секции "Subclassing"
http://www.vb-helper.com/index_api.html

Там много интересного, но касательно озвученного вопроса (mousemove via headers или даже via чего-то более общего, что содержит via header) пока глухо.
Смотрю в книгу, вижу фигу.
CallWindowProc?
Const WM_MOUSEMOVE = &H200 ?
пока что не вяжется...
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36288692
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ListView1_MouseMove банально.

Jah loves you.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36288737
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
банально то оно банально, но оно реагирует только при движении по самому ListView1, а когда двигаешь мышь вдоль заголовков события не происходит. М.б. свойства какие в Listview1 надо выставить?
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36288791
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, не реагирует. Нет, не выставить. Только сабклассить.

Jah loves you.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36289202
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, допустим в header я попал, однако.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Sub Form_Load()
    Dim hwndH As Long
    'Get a handle to the header control.
    hwndH = SendMessage(ListView1.hwnd, LVM_GETHEADER,  0 ,  0 )

    OldWindowProc = SetWindowLong(hwndH, GWL_WNDPROC, _
        AddressOf NewWindowProc)
End Sub


Мышь стала ловиться и делать то чего надо и где надо,т.е. отслеживаться:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If (Msg = &H200) Then 'событие MouseMove для headers
     Form1.ListView1.ColumnHeaders( 1 ).Width =  0 
    End If
     NewWindowProc = CallWindowProc( _
        OldWindowProc, hwnd, Msg, wParam, _
        lParam)
End Function

Выглядит это похабно, т.е. колонка отодвигается, и только потом пружинит назад.
Чего б такого сделать чтоб без мультипликации?
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36289236
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забейте на MouseMove.
Нужно распечатывать сообщения, постепенно отфильтровывая те, которые не имеют отношения к изменению ширины колонки (например то же &h200). Вероятно будут отдельные сообщения для <-||-> и для драга. Когда они приходят, делайте exit function.

Jah loves you.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36289266
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот наверно
http://www.gotdotnet.ru/DotNet/FAQ/WindowsForms/ListView/24432.aspx
правда не в готовом виде
case Messages.WM_LBUTTONDOWN: 201
case Messages.WM_LBUTTONDBLCLK:203
это я ловлю через предыдущий код

дальше надо разобраться тогда с
//посылаем сообщение HDM_HITTEST для определения дальнейших действий

if (hitInfo.flags == HHT_ONDIVIDER)
//не позволяем обработать WM_LBUTTONDOWN
//(кнопка мыши была нажата для изменения ширины столбца)
return;
//позволяем обработать WM_LBUTTONDOWN
break;
}

но при этом хорошо бы еще понять, в каком столбце находимся,
т.к. открытые то я двигать позволяю.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36289299
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но при этом хорошо бы еще понять, в каком столбце находимсяЭто делается через сообщение HDM_HITTEST со структурой HDHITTESTINFO, в поле iItem которой возвращается индекс колонки.

Jah loves you.
...
Рейтинг: 0 / 0
Как лучше реализовать Add/Remove Columns на Listview?
    #36289771
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем вывел среднее геометрическое. В тестовом проекте приведенный код намертво стопорит
HTI.iItem = 2

Public Const HHT_ONHEADER = &H2
Public Const HHT_ONDIVIDER = &H4 'это <-|->
Public Const HHT_ONDIVOPEN = &H8 'это <-||->

Стопорить надо оба значка <-|-> <-||->
ибо первый при некоторых манипуляциях мышью тоже может "раздвинуть"
Для неотображаемых колонок надо из окна настройки ставить ширину 0, скидывать их вправо и блокировать эти значки. И имеем чего надо в лучшем виде. Естествено для отображаемых колонок сдвиг на 0 не запретит их раздвижение снова, т.к. запрета нет а номер столбца проверяется.



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Public Function NewListWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Static pt As POINTAPI
    Static HTI As HD_HITTESTINFO
    If (Msg = &H201) Then 'WM_LBUTTONDOWN
    ElseIf (Msg = &H203) Then 'WM_LBUTTONDBLCLK
    Else
        GoTo Dalshe
    End If
    Call GetCursorPos(pt)
    Call ScreenToClient(hwnd, pt)
    'get the header's hit-test info
    With HTI
        .pt = pt
    End With
    Call SendMessage(hwnd, HDM_HITTEST,  0 &, HTI)
    If (HTI.flags = HHT_ONDIVIDER Or HHT_ONDIVOPEN) And (HTI.iItem =  2 ) Then Exit Function 'HHT_ONDIVOPEN HHT_ONDIVIDER
Dalshe:
    NewListWindowProc = CallWindowProc( _
        OldListWindowProc, hwnd, Msg, wParam, _
        lParam)
End Function

Private Sub Form_Load()
    Dim hwndH As Long
    'Get a handle to the header control.
    hwndH = SendMessage(ListView1.hwnd, LVM_GETHEADER,  0 ,  0 )
    OldListWindowProc = SetWindowLong(hwndH, GWL_WNDPROC, _
        AddressOf NewListWindowProc)
End Sub
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как лучше реализовать Add/Remove Columns на Listview?
    #38450850
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нравится мне это
Код: vbnet
1.
2.
3.
GoTo Dalshe
...
If (HTI.flags = HHT_ONDIVIDER Or HHT_ONDIVOPEN)


Переписал более грамотно:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Public Function NewList0WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  'для событий LView1(0)
  Static pt As POINTAPI
  Static HTI As HD_HITTESTINFO
  Select Case Msg
    Case WM_LBUTTONDOWN, WM_LBUTTONDBLCLK
      Call GetCursorPos(pt)
      Call ScreenToClient(hwnd, pt)
      'get the header's hit-test info
      HTI.pt = pt
      Call SendMessage(hwnd, HDM_HITTEST, 0&, HTI)
      If (HTI.Flags And (HHT_ONDIVIDER Or HHT_ONDIVOPEN)) And _
       (IsMovePossible(0, HTI.iItem) = False) Then Exit Function
    Case Else
  End Select
  NewList0WindowProc = CallWindowProc(OldListWindowProc(0), hwnd, Msg, wParam, lParam)
End Function
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как лучше реализовать Add/Remove Columns на Listview?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]