[英]Drag and Drop rows of Datagrid WPF Code convertion from C# to VB.NET
因此,我一直试图在vb.net中为WPF datagrid实现拖放功能。 我发现本教程在做同样的事情。 我唯一的问题是-教程和代码在C#中。
C#代码:
namespace WPF40_DataGrid_Row_Drag_Drop
{
// Declare a Delegate which will return the position of the
// DragDropEventArgs and the MouseButtonEventArgs event object
public delegate Point GetDragDropPosition(IInputElement theElement);
public partial class MainWindow : Window
{
int prevRowIndex = -1;
public MainWindow()
{
InitializeComponent();
//The Event on DataGrid for selecting the Row
this.dgEmployee.PreviewMouseLeftButtonDown +=
new MouseButtonEventHandler(dgEmployee_PreviewMouseLeftButtonDown);
//The Drop Event
this.dgEmployee.Drop += new DragEventHandler(dgEmployee_Drop);
}
void dgEmployee_Drop(object sender, DragEventArgs e)
{
if (prevRowIndex < 0)
return;
int index = this.GetDataGridItemCurrentRowIndex(e.GetPosition);
//The current Rowindex is -1 (No selected)
if (index < 0)
return;
//If Drag-Drop Location are same
if (index == prevRowIndex)
return;
//If the Drop Index is the last Row of DataGrid(
// Note: This Row is typically used for performing Insert operation)
if (index == dgEmployee.Items.Count-1)
{
MessageBox.Show("This row-index cannot be used for Drop Operations");
return;
}
EmployeeCollection myEmps = Resources["EmpDs"] as EmployeeCollection;
Employee movedEmps = myEmps[prevRowIndex];
myEmps.RemoveAt(prevRowIndex);
myEmps.Insert(index, movedEmps);
}
void dgEmployee_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
prevRowIndex = GetDataGridItemCurrentRowIndex(e.GetPosition);
if (prevRowIndex < 0)
return;
dgEmployee.SelectedIndex = prevRowIndex;
Employee selectedEmp = dgEmployee.Items[prevRowIndex] as Employee;
if (selectedEmp == null)
return;
//Now Create a Drag Rectangle with Mouse Drag-Effect
//Here you can select the Effect as per your choice
DragDropEffects dragdropeffects = DragDropEffects.Move;
if (DragDrop.DoDragDrop(dgEmployee, selectedEmp, dragdropeffects)
!= DragDropEffects.None)
{
//Now This Item will be dropped at new location and so the new Selected Item
dgEmployee.SelectedItem = selectedEmp;
}
}
private bool IsTheMouseOnTargetRow(Visual theTarget, GetDragDropPosition pos)
{
Rect posBounds = VisualTreeHelper.GetDescendantBounds(theTarget);
Point theMousePos = pos((IInputElement)theTarget);
return posBounds.Contains(theMousePos);
}
private DataGridRow GetDataGridRowItem(int index)
{
if (dgEmployee.ItemContainerGenerator.Status
!= GeneratorStatus.ContainersGenerated)
return null;
return dgEmployee.ItemContainerGenerator.ContainerFromIndex(index)
as DataGridRow;
}
private int GetDataGridItemCurrentRowIndex(GetDragDropPosition pos)
{
int curIndex = -1;
for (int i = 0; i < dgEmployee.Items.Count; i++)
{
DataGridRow itm = GetDataGridRowItem(i);
if (IsTheMouseOnTargetRow(itm, pos))
{
curIndex = i;
break;
}
}
return curIndex;
}
}
}
VB代码:
Public Delegate Function GetDragDropPosition(ByRef element As IInputElement) As Point
public partial class MainWindow : Window
Dim prevRowIndex As Integer = -1
public Sub MainWindow()
InitializeComponent()
AddHandler datagridRoll.PreviewMouseLeftButtonDown, AddressOf datagridRoll_PreviewMouseLeftButtonDown
AddHandler datagridRoll.Drop, AddressOf datagridRoll_Drop
End Sub
Private Sub datagridRoll_Drop(sender As Object, e As System.Windows.DragEventArgs)
If prevRowIndex < 0 Then
Return
End If
Dim index As Integer = GetDataGridItemCurrentRowIndex(e.GetPosition(datagridRoll))
If (index < 0) Then
Return
End If
If (index = prevRowIndex) Then
Return
End If
If (index = datagridRoll.Items.Count - 1) Then
MessageBox.Show("This row-index cannot be used for Drop Operations")
Return
End If
End Sub
Private Sub datagridRoll_PreviewMouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
prevRowIndex = GetDataGridItemCurrentRowIndex(e.GetPosition(datagridRoll))
prevRowIndex = datagridRoll.SelectedIndex
If (prevRowIndex < 0) Then
Return
End If
datagridRoll.SelectedIndex = prevRowIndex
Dim selectedEmp As DataGridRow = TryCast(datagridRoll.ItemContainerGenerator.ContainerFromIndex(prevRowIndex), DataGridRow)
If (selectedEmp Is Nothing) Then
Return
End If
Dim DragDropEffects As DragDropEffects = DragDropEffects.Move
If (DragDrop.DoDragDrop(datagridRoll, selectedEmp, DragDropEffects) <> DragDropEffects.None) Then
datagridRoll.SelectedItem = selectedEmp
End If
End Sub
Public Function IsTheMouseOnTargetRow(theTarget As Visual, pos As GetDragDropPosition) As Boolean
Dim posBounds As Rect = VisualTreeHelper.GetDescendantBounds(theTarget)
posBounds = VisualTreeHelper.GetContentBounds(theTarget)
Dim theMousePos As Point = pos(DirectCast(theTarget, IInputElement))
Return posBounds.Contains(theMousePos )
End Function
Public Function GetDataGridRowItem(index As Integer) As DataGridRow
If datagridRoll.ItemContainerGenerator.Status <> GeneratorStatus.ContainersGenerated Then
Return Nothing
End If
Return TryCast(datagridRoll.ItemContainerGenerator.ContainerFromIndex(index), DataGridRow)
End Function
Public Function GetDataGridItemCurrentRowIndex(pos As Point) As Integer
Dim curIndex As Integer = -1
For i As Integer = 0 To datagridRoll.Items.Count - 1 - 26
Dim itm As DataGridRow = GetDataGridRowItem(i)
If IsTheMouseOnTargetRow(itm, pos) Then
curIndex = i
Exit For
End If
Next
Return curIndex
End Function
End Class
现在,在行prevRowIndex = GetDataGridItemCurrentRowIndex(e.GetPosition(datagridRoll))处出现类似-> 错误类型'System.Windows.Point'的错误值,无法转换为'MyappWPF.GetDragDropPosition'的错误。 我想这与委托GetDragDropPosition的类型有关。 我无法找出问题所在。
转换中有一些错误:
您没有明显的原因使委托参数“ ByRef”-它应该是:
公共委托函数GetDragDropPosition(ByVal theElement作为IInputElement)作为点
您没有正确指定基类-它应该是:
部分公共类MainWindow
继承窗口
您的“ For”循环减去26-再次没有明显原因-应该是:
对于i As Integer = 0到dgEmployee.Items.Count-1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.