Как переместить корневые узлы вверх и вниз в древовидной структуре Access / VBA - PullRequest
0 голосов
/ 30 августа 2011

Хорошо.Я много работал над древовидной структурой и решил, что было бы удобно позволить пользователям перемещать узлы древовидной структуры вверх и вниз по своему усмотрению.Моя структура - это просто двухуровневое древовидное представление, однако у каждого корневого узла должен быть дочерний элемент.Например:

Root
  child
  child
  child
Root
  child
  child
Root
  child
  child
  child
  child

У меня написан код, в котором вы можете установить только один флажок из корневых узлов за раз.То, что я хочу сделать, - это нажать на кнопку и заставить проверенный корневой узел переместиться вверх (или вниз) на одну позицию (конечно, взяв с собой его потомков).полностью перестроить узел на один уровень выше, чем был ранее.Кажется, что это будет слишком много времени, когда узлы начинают иметь больше детей и т. Д.

Когда я искал, я нашел тонну результатов C #, но, поскольку я использую VBA, это не помоглосовсем.Если у кого-нибудь есть какие-либо предложения, кроме перестройки всего узла, я бы с удовольствием его услышал.Спасибо

1 Ответ

0 голосов
/ 31 августа 2011

Я решил это, сохранив ключи и текст моих узлов во временных переменных, очистив ключи и затем переключив их.

На этом этапе я перебираю все дочерние элементы идобавить их в массив узлов.Я установил свойство node.Parent каждого из них на противоположный узел, а затем все это было практически сделано.

Это возможно, потому что данные в таблице зависят от того, как пользователь структурирует древовидную структуру, поэтому, когда у него есть древовидная структура, отображающая, как они этого хотят, я могу сохранить необходимую информацию и перестроить ее, когда они ееконкретная запись резервная копия.Я надеюсь, что это понятно, но у меня есть несколько фрагментов кода ниже, чтобы помочь в этом разобраться.

 Private Sub MoveUP()
 Dim n As Node
 Dim key1 As String
'etc.....

 key1 = n.Key
 text1 = n.Text
 key2 = n.Previous.Key
 text2 = n.Previous.Text

'We have to clear out the keys now.
 n.Key = ""
 n.Previous.Key = ""

'Now replace the keys
 n.Key = key2
 n.Text = text2
 n.Previous.Key = key1
 n.Previous.Text = text1

 Call SwitchParents(n, n.Previous)
 End Sub

^ Приведенный выше код сделан для перемещения n вверх в n.Предыдущее место Следующий код, чтобы переключитьпотомки узлов (если есть)

 Private Sub SwitchParents(n1 As Node, n2 As Node)
 Dim nds1() As Node 'Declare with no size to ReDim later
 Dim nds2() As Node
 Dim c As Node 'this is the child node we will use to push into the array
 Dim i As Integer 

 i = n1.Children
 ReDim nds1(0 To i)
 Set c = n1.Child
 'Notice in both loops that i remains the number of children, the arrays fill backwards
 'because when you reassign the nodes.Parent property, the node jumps to the beginning,
 'so we pack them backwards and they come out displaying the same way they did before.
 Do While Not (c Is Nothing)
   i = i - 1
   Set nds1(i) = c
   Set c = c.Next
 Loop

 i = n2.Children
 ReDim nds2(0 To i)
 Set c = n2.Child
 Do While Not (c Is Nothing)
   i = i - 1
   Set nds2(i) = c
   Set c = c.Next
Loop

If Not IsEmpty(nds1()) Then
  For i = 0 To UBound(nds1()) - 1
    Set nds1(i).Parent = n2
  Next i
End If

If Not IsEmpty(nds2()) Then
  For i = 0 To UBound(nds2()) - 1
    Set nds2(i).Parent = n1
  Next i
End If
End Sub

Надеюсь, этот пример поможет всем, кто имеет похожую двухуровневую древовидную структуру и хочет сделать что-то подобное.Я делаю это по нажатию кнопки, однако это может быть переработано для метода перетаскивания.

...