2 Answers, 1 is accepted
Indeed, using the RadTaskBoardDragDropService is the suitable approach to handle the task card moving action. Note that in the PreviewDragDrop event you have access to the DropLocation in the event arguments. However, you have also access to the HitTarget. It can be either a RadTaskBoardColumnElement or a RadTaskCardElement. But in both cases you can compare the dragged task card's column and the target column and conclude whether the column is changed:
AddHandler Me.RadTaskBoard1.TaskBoardElement.DragDropService.PreviewDragDrop, AddressOf radTaskBoard1_PreviewDragDrop
End Sub
Private Sub radTaskBoard1_PreviewDragDrop(sender As Object, e As Telerik.WinControls.RadDropEventArgs)
Dim draggedItem As RadTaskCardElement = TryCast(e.DragInstance, RadTaskCardElement)
Dim targetColumnElement As RadTaskBoardColumnElement = TryCast(e.HitTarget, RadTaskBoardColumnElement)
Dim targetCardElement As RadTaskCardElement = TryCast(e.HitTarget, RadTaskCardElement)
If draggedItem Is Nothing AndAlso targetCardElement Is Nothing AndAlso targetColumnElement Is Nothing Then
Return
End If
e.Handled = True
If targetColumnElement Is Nothing Then
targetColumnElement = targetCardElement.FindAncestor(Of RadTaskBoardColumnElement)()
End If
Dim draggedItemColumnElement As RadTaskBoardColumnElement = draggedItem.FindAncestor(Of RadTaskBoardColumnElement)()
If Not draggedItemColumnElement.Equals(targetColumnElement) Then
' moved to another column
End If
Dim CardID As Integer = draggedItem.Tag
Dim ColumnID As Integer = targetColumnElement.Tag
End Sub
I hope this information helps. If you need any further assistance please don't hesitate to contact me.
Regards,
Dess | Tech Support Engineer, Principal
Progress Telerik
Dess, Thank you for your help on this matter... everything works great except for the IndexOf part
Below, I provide the Database Schema for the table I'm trying to update as well as the SQL for that Update.
The problem is that IndexOf always returns -1 at the drop stage.
Is there another method that I'm not understanding here?
Hopefully you can help me address this.
Private Sub radTaskBoard1_PreviewDragDrop(sender As Object, e As Telerik.WinControls.RadDropEventArgs)
Dim SQL As String = ""
Dim draggedItem As RadTaskCardElement = TryCast(e.DragInstance, RadTaskCardElement)
Dim targetColumnElement As RadTaskBoardColumnElement = TryCast(e.HitTarget, RadTaskBoardColumnElement)
Dim targetCardElement As RadTaskCardElement = TryCast(e.HitTarget, RadTaskCardElement)
If draggedItem Is Nothing AndAlso targetCardElement Is Nothing AndAlso targetColumnElement Is Nothing Then
Return
End If
e.Handled = True
Dim CardID As Integer = draggedItem.Tag 'The TaskBoardCards.id of the dragged card
Dim ColumnID As Integer = targetColumnElement.Tag 'The TaskBoardColumnElements.id of the target column
If targetColumnElement Is Nothing Then
targetColumnElement = targetCardElement.FindAncestor(Of RadTaskBoardColumnElement)()
End If
Dim draggedItemColumnElement As RadTaskBoardColumnElement = draggedItem.FindAncestor(Of RadTaskBoardColumnElement)()
If Not draggedItemColumnElement.Equals(targetColumnElement) Then
' moved to another column
'Database Schema
'Select Top(1000) [id]
' ,[TaskBoardColumnElementID]
' ,[TaskBoardCardID]
' ,[TaskBoardCardSequence]
'From [TaskBoard].[dbo].[TaskBoardCardsToColumnElement]
'Execute the SQL to update the database table
SQL = $"UPDATE TaskBoardCardsToColumnElement SET TaskBoardColumnElementID = {targetColumnElement.Tag} WHERE TaskBoardCardID = {CardID}"
'I think that because the dropped card has not yet been recognized as being 'dropped'
'that the indexof doesn't tell me the position (indexof) the drop location at this point
'it always returns -1
Dim TaskBoardCardSequence As Integer = targetColumnElement.TaskCardCollection.IndexOf(draggedItem)
MsgBox(TaskBoardCardSequence)
'The SQL I'd like to execute
SQL = $"UPDATE TaskBoardCardsToColumnElement SET TaskBoardColumnElementID = {targetColumnElement.Tag}, TaskBoardCardSequence = {TaskBoardCardSequence} WHERE TaskBoardCardID = {CardID}"
End If
End Sub
For now, I'm doing this - but it means the user has to click a Save Button instead of the changes being saved automatically via some Event.
Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.ClickDim SQL As String = ""
Dim oSQL As New DAL.SqlServer With {.ConnectionString = _cnTaskBoard}
'the columns are dynamically created from the database table
'the PKID from the database table is placed into the tag property
'of the column
For i = 0 To RadTaskBoard1.Columns.Count - 1
Dim TaskBoardColumnElementID As Integer = i
Dim oRadColumn As RadTaskBoardColumnElement = RadTaskBoard1.TaskBoardElement.Columns(i)
'iterate the cards that are in the column
'the index position will be needed to update the database TaskBoardCardsToColumnElement table
'so that when the cards are loaded to the column they are in the right sequence
Dim CardIndexPosition As Integer = 1
For Each oRadTaskCardElement As RadTaskCardElement In oRadColumn.TaskCardCollection
Dim TaskBoardColumnID As Integer = oRadColumn.Tag
SQL = $"Update TaskBoardColumnElements SET Collapsed = {IIf(oRadColumn.IsCollapsed, 1, 0)} WHERE id = {TaskBoardColumnID}"
oSQL.ExecuteNonQuery(SQL)
Dim TaskBoardCardID As Integer = oRadTaskCardElement.Tag
SQL = $"Update TaskBoardCardsToColumnElement SET TaskBoardCardSequence = {CardIndexPosition}, TaskBoardColumnElementID = {oRadColumn.Tag} WHERE TaskBoardCardID = {TaskBoardCardID}"
oSQL.ExecuteNonQuery(SQL)
CardIndexPosition += 1
Next
Next
LoadTaskBoard()
End Sub
The PreviewDragDrop event allows you to get a handle on all the aspects of the drag and drop operation, the source (drag) control/element, the destination (target) control/element, as well as the task card being dragged. This is where we will initiate the actual physical move of the task(s) from one column to the target column or from one RadTaskBoard to another.
It is expected to get -1 as an index if the task card is not a part of the target column yet. You can check whether the column's TaskCardCollection contains the dragged card, but I believe it doesn't since the returned index is -1. If the Handled argument is set to true, this means that you are managing the drop operation and in order to get a valid index, you need to insert the dragged task to the target column first if it is coming from another column. Then, you can get the index and proceed further with saving the changes to the database.
Hi Dess, thank you for the explanation but I'm not quite sure I understand what you are saying.
So, do I set e.Handled to equal False?
We might be talking about 2 different scenarios here
Scenario 1) Moving a card within the same column
Since there is no TaskCardMoved Event - I still cannot get a valid index from the TaskBoardCardDragDropService_PreviewDragDrop() routine.
So, for example; if I have 2 cards [CardA and CardB] in Column(0) and I move CardA to the position below CardB - in the TaskBoardCardDragDropService_PreviewDragDrop - CardA still gives me IndexOf = 0
Scenario 2) Moving a CardA from Column(0) to Column(1)
In this scenario - Let's pretend that Column(1) already has 2 cards in it... CardC and CardD... and I want to move CardA from Column(0) to Column(1) and drop it between CardC and CardD... so it would look like this in Column(0).
CardC then CardA then CardD - in that sequence.
I know you've done it before for other such examples but would it be possible for you to create a small vbDemo app so that I can see how this is done for both Scenarios? That would probably be faster than attempting to go back and forth via the forum comments. If that would be possible it would be Greatly Appreciated.
Sorry, I should have made this more clear with text formatting
We might be talking about 2 different scenarios here
Scenario 1) Moving a card within the same column
Since there is no TaskCardMoved Event - I still cannot get a valid index from the TaskBoardCardDragDropService_PreviewDragDrop() routine.
So, for example; if I have 2 cards [CardA and CardB] in Column(0) and I move CardA to the position below CardB - in the TaskBoardCardDragDropService_PreviewDragDrop - CardA still gives me IndexOf = 0
Scenario 2) Moving a CardA from Column(0) to Column(1)
In this scenario - Let's pretend that Column(1) already has 2 cards in it... CardC and CardD... and I want to move CardA from Column(0) to Column(1) and drop it between CardC and CardD... so it would look like this in Column(0).
CardC then CardA then CardD - in that sequence.
I know you've done it before for other such examples but would it be possible for you to create a small vbDemo app so that I can see how this is done for both Scenarios? That would probably be faster than attempting to go back and forth via the forum comments. If that would be possible it would be Greatly Appreciated.
When you set the Handled argument to true, this means that the default drop logic wouldn't be performed and you intend to implement such. Hence, in this case you need to remove the task card from the source column and insert it on the target column. If you want the default logic to be performed, leave the Handled argument to false in the PreviewDragDrop event.
The PreviewDragDrop event gives you the state of the dragged task and target location before the drop logic is actually executed. If you want to just to get the index of the affected task card after the drop operation, you can use the following code snippet that I prepared for handling this case:
Me.RadTaskBoard1.TaskBoardElement.DragDropService = New CustomRadTaskBoardDragDropService(Me.RadTaskBoard1.TaskBoardElement)
Public Class CustomRadTaskBoardDragDropService
Inherits RadTaskBoardDragDropService
Dim ownerTaskBoardElement As RadTaskBoardElement
Public Sub New(owner As RadTaskBoardElement)
MyBase.New(owner)
ownerTaskBoardElement = owner
End Sub
Protected Overrides Sub OnPreviewDragDrop(e As Telerik.WinControls.RadDropEventArgs)
Dim draggedItem As RadTaskCardElement = TryCast(e.DragInstance, RadTaskCardElement)
Dim targetColumnElement As RadTaskBoardColumnElement = TryCast(e.HitTarget, RadTaskBoardColumnElement)
Dim targetCardElement As RadTaskCardElement = TryCast(e.HitTarget, RadTaskCardElement)
If draggedItem Is Nothing AndAlso targetCardElement Is Nothing AndAlso targetColumnElement Is Nothing Then
Return
End If
If targetColumnElement Is Nothing Then
targetColumnElement = targetCardElement.FindAncestor(Of RadTaskBoardColumnElement)()
End If
Dim draggedItemColumnElement As RadTaskBoardColumnElement = draggedItem.FindAncestor(Of RadTaskBoardColumnElement)()
If Not draggedItemColumnElement.Equals(targetColumnElement) Then
' moved to another column
Console.WriteLine("moved to another column")
Console.WriteLine(" column before the drop operation: " & ownerTaskBoardElement.Columns.IndexOf(draggedItemColumnElement))
Console.WriteLine(" column after the drop operation: " & ownerTaskBoardElement.Columns.IndexOf(targetColumnElement))
End If
MyBase.OnPreviewDragDrop(e) ' perform the base logic
Dim index = targetColumnElement.TaskCardCollection.IndexOf(draggedItem)
End Sub
End Class
I believe that it would help you for achieving your goal.
Regards,
Dess | Tech Support Engineer, Principal
Progress Telerik
Virtual Classroom, the free self-paced technical training that gets you up to speed with Telerik and Kendo UI products quickly just got a fresh new look + new and improved content including a brand new Blazor course! Check it out at https://learn.telerik.com/.
Dess, This is Excellent and exactly what I was looking for.
I really appreciate your answering this question with the code above. It's Perfect !!!
Thank You Very Much
If I get that from the DragDrop Service how do I get the drop location?
Private Sub TaskBoardCardDragDropService_PreviewDragDrop(sender As Object, e As RadDropEventArgs)Dim draggedItem As RadTaskCardElement = TryCast(e.DragInstance, RadTaskCardElement)
Dim rowElement As RadTaskBoardColumnElement = TryCast(e.HitTarget, RadTaskBoardColumnElement)
Dim tableElement As RadTaskBoardColumnElement = TryCast(e.HitTarget, RadTaskBoardColumnElement)
If rowElement Is Nothing AndAlso tableElement Is Nothing Then
Return
End If
e.Handled = True
Dim CardID As Integer = draggedItem.Tag
Dim ColumnID As Integer = rowElement.Tag
End Sub
Perhaps you can fix any mistakes that I made when you provide the answer??? Please.