Установка отмечена на событии NodeCheck

Установка отмеченного свойства во время NodeCheck событие заставляет его вернуться к своему предыдущему состоянию.

Например: узел проверен, и событие ниже запускается. Он находит, что узел проверен, и устанавливает для него значение false. Если я пройду код с перерывом, узел отразит это в пользовательском интерфейсе. Хотя, как только код попадет в конец sub, флажок вернется к значению true.

Private Sub treeviewExample_NodeCheck(ByVal Node As Object)
     If Node.Checked = True Then
            Node.Checked = False
     ElseIf Node.Checked = False Then
            Node.Checked = True
     End If
end sub

Как установить проверенное свойство во время NodeCheck событие?

Я попробовал здесь решение, которое устанавливает узел в локальную или глобальную переменную, а затем устанавливает его, и он делает то же самое.

2 ответа

Решение

Вы можете оставить свойство Checkboxes False и использовать Windows API для установки свойства checkboxes. Затем используйте событие NodeClick, чтобы выбрать, проверять или не отмечать узел.

Option Explicit

Private Const TVS_CHECKBOXES As Long = &H100
Private Const GWL_STYLE As Long = (-16)
Private Const TVS_HASLINES As Long = 2
Private Const TV_FIRST As Long = &H1100
Private Const TVM_SETBKCOLOR As Long = (TV_FIRST + 29)

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Sub Form_Load()

    SetTVCheckboxStyle TreeView1

End Sub

Private Sub SetTVCheckboxStyle(pobjTV As TreeView)

    Dim lngCurStyle As Long
    Dim lngResult   As Long

    ' === Set the Checkbox style of the TreeView ===
    ' As advised by Microsoft, due to a bug in the TreeView control,
    ' set the Checkbox style of the TreeView by using the following
    ' API calls, rather than simply setting the "Checkboxes" property
    ' to True ...
    lngCurStyle = GetWindowLong(pobjTV.hwnd, GWL_STYLE)
    lngResult = SetWindowLong(pobjTV.hwnd, GWL_STYLE, _
                              lngCurStyle Or TVS_CHECKBOXES)

End Sub

Когда вы добавляете свой узел, установите какое-либо свойство тех узлов, которые вы хотите отключить, чтобы вы могли проверить это свойство позже. Я решил использовать свойство ForeColor, чтобы отключенные узлы имели отключенный вид. Затем используйте событие NodeClick для проверки, очистки или игнорирования пользовательских кликов.

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)

    If Node.ForeColor <> vbGrayText Then
        Node.Checked = Not Node.Checked
    End If

End Sub

Я столкнулся с этой проблемой и обнаружил обходной путь.

Вы не можете установить флажок 'check-ness' для дерева в его собственном событии NodeCheck.

Однако, предполагая, что вы захватываете пользователя, установившего флажок, событие Treeview_Click срабатывает сразу после этого (как они должны были щелкнуть, чтобы изменить его), и вы можете установить флажки в этом событии.

Поэтому все, что вам нужно сделать, это сохранить ссылку на флажок, который необходимо изменить, и установить его в событии Click, прежде чем очистить ссылку.

Private WithEvents tv As TreeView

Private checkBoxToSet_Node As Node
Private checkBoxToSet_value As Boolean


Private Sub tv_NodeCheck(ByVal Node As MSComctlLib.Node)

    Dim prompt As VbMsgBoxResult

    prompt = MsgBox("Do you REALLY want to set this checkbox?", vbQuestion + vbYesNoCancel)

    ' can't set the checked-ness here, so we store it

    If (prompt <> vbYes) Then
        Set checkBoxToSet_Node = Node
        checkBoxToSet_value = Not Node.checked
    End If

End Sub


Private Sub tv_Click()

    ' check if we had previously set a node to have its checkbox changed

    If (Not checkBoxToSet_Node Is Nothing) Then
        tv.Nodes(checkBoxToSet_Node.key).checked = checkBoxToSet_value

        Set checkBoxToSet_Node = Nothing
    End If

End Sub
Другие вопросы по тегам