Итак, вам нужно DELETE
связать строки из конфликтующих таблиц или более логично UPDATE
их столбец FOREIGN KEY
для ссылки на другие PRIMARY KEY
из родительской таблицы.
Кроме того, вы можете прочитать эту статью Не удаляйте - просто не делайте
Я все еще пытаюсь решить эту же проблему. Я использую слегка измененную версию перетаскивания Bea's Drag and Drop, найденную здесь , которая находится на VB вместо C #. Когда я использовал ScrollIntoView, как описано выше, я мог прокручивать вниз, но не вверх. Так что я напортачил и придумал это как мой DropTarget_PreviewDragOver:
Private Sub DropTarget_PreviewDragOver(ByVal sender As Object, ByVal e As DragEventArgs)
Dim draggedItem As Object = e.Data.GetData(Me.m_format.Name)
Me.DecideDropTarget(e)
If (Not draggedItem Is Nothing) Then
If (TypeOf m_targetItemsControl Is ListBox) Then
Dim lb As ListBox = CType(m_targetItemsControl, ListBox)
Dim temp As Integer = m_insertionIndex
Dim scroll As ScrollViewer = Utilities.GetScrollViewer(lb)
If scroll.VerticalOffset = temp Then
temp -= 1
End If
If temp >= 0 And temp <= (lb.Items.Count - 1) Then
lb.ScrollIntoView(lb.Items(temp))
End If
End If
Me.ShowDraggedAdorner(e.GetPosition(Me.m_topWindow))
Me.UpdateInsertionAdornerPosition()
End If
e.Handled = True
End Sub
, и мне пришлось включить эту служебную функцию, взятую из здесь
Public Shared Function GetScrollViewer(ByVal listBox As ListBox)
Dim scroll_border As Decorator = CType(VisualTreeHelper.GetChild(listBox, 0), Decorator)
If (TypeOf scroll_border Is Decorator) Then
Dim scroll As ScrollViewer = CType(scroll_border.Child, ScrollViewer)
If (TypeOf scroll Is ScrollViewer) Then
Return scroll
Else
Return Nothing
End If
Else
Return Nothing
End If
End Function
, и это здорово и все такое. Затем выполнив то, что упомянул вышеупомянутый туберк, с перемещением украшения, и в духе того, чтобы облегчить это для кого-то еще, я добавил переменную в класс DragDropAdorner:
Private m_mouseDelta As Point
Добавил это в последнюю строку DragSource_PreviewMouseLeftButtonDown:
Me.m_mouseDelta = e.GetPosition(m_sourceItemContainer)
И превратил ShowDraggedAdorner в:
Private Sub ShowDraggedAdorner(ByVal currentPosition As Point)
If (Me.m_draggedAdorner Is Nothing) Then
Dim adornerLayer As AdornerLayer = adornerLayer.GetAdornerLayer(Me.m_topWindow.Content)
Me.m_draggedAdorner = New DraggedAdorner(Me.m_draggedData, DragDropBehavior.GetDragTemplate(Me.m_sourceItemsControl), m_topWindow.Content, adornerLayer)
End If
Me.m_draggedAdorner.SetPosition((currentPosition.X - m_mouseDelta.X), (currentPosition.Y - m_mouseDelta.Y))
End Sub
Я воспользовался преимуществом метода ListBox.ScrollIntoView
. В принципе, когда вы обновляете цель перетаскивания, вы можете просто вызвать для нее этот метод, и wpf сделает всю работу. Все, что вам нужно знать, это индекс целевого элемента перетаскивания. Это обрабатывает как вертикальную, так и горизонтальную прокрутку.
this.listView.ScrollIntoView (this.listView.Items [index]);
Когда вы используете этот метод, ваш украшение может перемещаться вместе с прокручивающимся ListBox. Чтобы исправить это, я просто установил свой родительский элемент украшения и родительский слой слоя украшения на содержимое окна в верхней части визуального дерева (например, topWindow.Content
).
Другой возможностью прокрутки является использование ScrollBar-Commands. Вы можете сделать это, не спускаясь по VisualTree. Если у вас есть ListBox стилей без границы, GetScrollViewer () - Method больше не будет работать.
Я использую первый элемент ItemContainerGenerator как CommandTarget для ScrollBar.LineXXXCommand:
Point p = e.GetPosition(itemsControl);
IInputElement commandTarget = itemsControl.ItemContainerGenerator.ContainerFromIndex(0) as IInputElement;
if (commandTarget != null)
{
if (p.Y < OFFSET_TO_SCROLL)
ScrollBar.LineUpCommand.Execute(null, commandTarget);
else if (p.Y > itemsControl.ActualHeight - OFFSET_TO_SCROLL)
ScrollBar.LineDownCommand.Execute(null, commandTarget);
if (p.X < OFFSET_TO_SCROLL)
ScrollBar.LineLeftCommand.Execute(null, commandTarget);
else if (p.X > itemsControl.ActualWidth - OFFSET_TO_SCROLL)
ScrollBar.LineRightCommand.Execute(null, commandTarget);
}
Вызов LineXXXCommands аналогичен нажатию кнопок со стрелками на ScrollBar: ScrollViewer прокручивает определенное количество, которое вы можете настроить, установив Свойство SmallAmount полосы прокрутки.