|
|
|
| хочу запретить установку флажка на ноде с отпределенный KEY.
на событие NodeCheck
пишу:
If Node.Key = "r_0" Then
DoEvents
Node.Checked = False
End If
|
причем что интересно, если делать "по шагам", то получается такая картина:
If Node.Key = "r_0" Then ' флажок установлен
DoEvents ' флажок установлен
Node.Checked = False ' флажок НЕ установлен
End If ' флажок НЕ установлен
' флажок установлен
|
Если просто программно (ну например при нажатии на кнопку) поменять Checked, то все работает...
Кто знает как побороть?
или как запретить ставить галку на определенной ноде? | |
|
| |
|
|
|
| хм.... не знаю, Олег, у меня вот так вот на ноде root отключается спокойно
Private Sub tv_NodeCheck(ByVal Node As MSComctlLib.Node)
Select Case Node.Tag
Case "root":
Node.Checked = False
End Select
End Sub
зы.
может попробуй так сделать:
If Node.Key = "r_0" Then ' флажок установлен
DoEvents ' флажок установлен
Node.Checked = False ' флажок НЕ установлен
exit sub ' :)))
End If ' флажок НЕ установлен
' флажок установлен | |
|
| |
|
|
|
| А у меня поисходит таже хрень, что и у osmor
может это от версии компонента зависит
я использую Microsoft windows common controls 6.0 (sp6) на Access XP + Win 2k AdvServer | |
|
| |
|
|
|
| нее, уменя тоже оказываеццо так :)
я сконфабулировал себе, панимаешь.... | |
|
| |
|
|
|
|
Dim mClickedNode As MSComctlLib.Node
Private Sub TreeView1_Click()
If Not mClickedNode Is Nothing Then
If mClickedNode.Key = "r_0" Then
mClickedNode.Checked = False
End If
End If
End Sub
Private Sub TreeView1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Set mClickedNode = TreeView1.HitTest(x, y)
End Sub
|
Но конечно некрасиво, что метка будет появляться и пропадать.
Субклассингом должно получиться лучше. | |
|
| |
|
|
|
| >Субклассингом должно получиться лучше.
У кого-нибудь есть примеры сабклассинга в Access 2000+
Что-то те, которые у меня есть не хотят работать, хотя раньше вроде работали .... | |
|
| |
|
|
|
| Это не пойдет?
http://hiprog.com/index.php?option=com_content&task=view&id=450 | |
|
| |
|
|
|
| Спасибо, мои примеры тоже работают, я забыл о:
=============================================
'ВНИМАНИЕ!!! Если до начала работы субкласса был загружен
'редактор VBA, субкласс может (и будет!) работать некорректно!!!
'Закройте Access, потом снова откройте и запустите пример.
============================================= | |
|
| |
|
автор: Аноним (27.10.2006 в 16:49) |
|
| Видимо, в данном случае, в событии NodeCheck нельзя менять свойство элемента Checked,
так как иначе бы это привело к рекурсивному вызову события,
(именно изменение свойства приводит к возникновению события.)
Можно отследить мышку и на событие MouseUp для этого нода сбрасывать птицу.
Dim idx as Integer
Private Sub mTvw_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As stdole.OLE_XPOS_PIXELS, ByVal y As stdole.OLE_YPOS_PIXELS)
If idx > 0 Then mTvw.Nodes(idx).Checked = False
End Sub
Private Sub mTvw_NodeCheck(ByVal Node As MSComctlLib.Node)
If Node.Key = "r_0" Then
idx = Node.Index
Else
idx = -1
End If
End Sub
Хотя нажатие кнопок клавиатуры тоже нужно отследить | |
|
| |
|
|
|
| я пошел немного другим путем :)
просто на обработчике проверяю Tag и если он тот, что нужен, то выполняю соответсвующие действия с данными, иначе - просто игнорирую его :) хотя можно и сообщение было бы вывести :)
Private Sub tv_NodeCheck(ByVal Node As MSComctlLib.Node)
Dim rs2 As Recordset
Dim I As Long
Select Case Node.Tag
Case "root":
Node.Checked = False '-- как выяснилось не работает в этом месте, но и деструктивного ничего не делает тоже :)
Case "regions":
Set rs = db.OpenRecordset(TBLoc, dbOpenTable)
With rs
.Index = "PrimaryKey"
.Seek "=", Trim(Node.Text)
If Not .NoMatch Then
.Edit
Else
.AddNew
End If
.Fields("LOCAT") = Nz(Trim(Node.Text), "- nothing -")
.Fields("STATUS") = Nz(Node.Checked, False)
.Update
End With
Set rs2 = db.OpenRecordset("SELECT dbo_vw_analyze01_locations.ÃÎÐÎÄ, " & _
"dbo_vw_analyze01_locations.ÑÊËÀÄ, dbo_vw_analyze01_locations.ENBL " & _
"FROM dbo_vw_analyze01_locations WHERE Trim([ÃÎÐÎÄ])='" & Trim(Node.Text) & _
"' GROUP BY dbo_vw_analyze01_locations.ÃÎÐÎÄ, dbo_vw_analyze01_locations.ÑÊËÀÄ, " & _
"dbo_vw_analyze01_locations.ENBL;")
With rs2
Do While Not .EOF
rs.Seek "=", Trim(.Fields("ÑÊËÀÄ"))
If rs.NoMatch Then
rs.AddNew
Else
rs.Edit
End If
rs.Fields("LOCAT") = Nz(Trim(.Fields("ÑÊËÀÄ")), "- nothing -")
rs.Fields("STATUS") = Nz(Node.Checked, False)
rs.Update
.MoveNext
Loop
.Close
End With
Node.Expanded = True
For I = 0 To Node.Children - 1
tv.Nodes(Node.Child.Index + I).Checked = Nz(Node.Checked, False)
Next I
rs.Close
Case "locations":
Set rs = db.OpenRecordset(TBLoc, dbOpenTable)
With rs
.Index = "PrimaryKey"
.Seek "=", Trim(Node.Text)
If Not .NoMatch Then
.Edit
Else
.AddNew
End If
.Fields("LOCAT") = Nz(Trim(Node.Text), "- nothing -")
.Fields("STATUS") = Nz(Node.Checked, False)
.Update
.Close
End With
End Select
End Sub
|
| |
|
| |