Hi,
I''ve used the VirtTreeGrid code to create a tree in the row header of the grid.
I want my user to be able to drag and drop row to modify the tree in real time.
The problem is when a row is selected; the user can not expand or collapse the tree because the drag event is enabled when the mouse down event is called. Is there a solution to this?
AD
Administrator
Syncfusion Team
August 29, 2005 04:06 PM UTC
Check out this forum thread to see if the technique discussed there handles the problem you are seeing.
http://www.syncfusion.com/Support/Forums/message.aspx?MessageID=4470
AD
Administrator
Syncfusion Team
August 29, 2005 06:00 PM UTC
I''ve overrides the OnHitTest in the GridStaticCellRenderer
Protected Overloads Overrides Function OnHitTest(ByVal row_index As Integer, ByVal col_index As Integer, ByVal e As MouseEventArgs, ByVal controller As Syncfusion.Windows.Forms.IMouseController) As Integer
If e.X < 100 Then
Return 1
End If
Return 0
End Function
When I click on the left side of the cell, everything handles perfectly (no drag). When I click on the right side I can drag drop, but when I come back to the left side I''m able to drag and drop (it seem to ignore the code).
AD
Administrator
Syncfusion Team
August 29, 2005 06:31 PM UTC
>>because the drag event is enabled when the mouse down event is called.
Are you calling DoDragDrop in OnMouseDown? Is this what you mean by the drag event is enabled when mouse down is called? If so, then you should move the call to DoDragDrop from OnMouseDown to OnMouseMove.
Then in OnMouseDown, set a variable to be remember the mousedown point. Then in your OnMouseMove, if e.Button = Left and if the mouse point is further than SystemInformation.DragSize away from the MouseDown point (that you saved in OnMouseDown), then call DoDragDrop. Waiting until your user has moved the mouse outside of the DragSize will allow a click to happen normally.
AD
Administrator
Syncfusion Team
August 29, 2005 06:36 PM UTC
I set the: Me.AllowDragSelectedRows = True
And I will handle the TreeGridControl_SelectionDragging to call my own DoDragDrop(info, DragDropEffects.Move)
Should I do this differently?
AD
Administrator
Syncfusion Team
August 29, 2005 06:53 PM UTC
Yes. I would try turning off the grid''s row moving and initiating the DowDagDrop in MouseMove instead. Here is a KB link that shows how you can go about this.
http://www.syncfusion.com/support/kb/grid/Default.aspx?ToDo=view&questId=236
Just look at how the move is triggerred in the code of the sample using OnMouseDown and OnMouseMove.
AD
Administrator
Syncfusion Team
August 29, 2005 07:10 PM UTC
Great, no need of the OnHitTest.
Now I only need to find out how to enable the selection of 1 row only. I want to user to highlight 1 row on a single click. Right now rows are being selected as a row is being dragged.
I tried: Me.AllowSelection = Me.AllowSelection And (Not GridSelectionFlags.Multiple)
With no success.
AD
Administrator
Syncfusion Team
August 29, 2005 08:44 PM UTC
You can try setting grid.ListBosSelectionMode = One to see if that gives you waht you want.
Another thing you can do if you want to seelct the row when your user clicks the first cell is to modify the OnCellClick in the renderer class. There you can explicitly sect the row if you do not click the +/- button.
Protected Overloads Overrides Sub OnClick(ByVal rowIndex As Integer, ByVal colIndex As Integer, ByVal e As MouseEventArgs)
Me.Grid.Selections.Clear(False)
Dim rect As Rectangle
rect = GetCellBoundsCore(rowIndex, colIndex)
Dim X As Integer
X = (rect.X _
+ (IndentSize * CType(Me.Grid.Model(rowIndex, colIndex).Tag, Integer)))
rect.X = X
rect.Width = Me.bitmapWidth
rect.Height = Me.bitmapHeight
'' }
If rect.Contains(New Point(e.X, e.Y)) Then
If (Me.Grid.Model(rowIndex, colIndex).ImageIndex = CType(TreeNodeState.Opened, Integer)) Then
Me.Grid.Model(rowIndex, colIndex).ImageIndex = CType(TreeNodeState.Closed, Integer)
OnCollapseRow(rowIndex)
Else
If (Me.Grid.Model(rowIndex, colIndex).ImageIndex = CType(TreeNodeState.Closed, Integer)) Then
Me.Grid.Model(rowIndex, colIndex).ImageIndex = CType(TreeNodeState.Opened, Integer)
OnExpandRow(rowIndex)
End If
End If
Else
Me.Grid.Selections.SelectRange(GridRangeInfo.Row(rowIndex), True)
MyBase.OnClick(rowIndex, 0, e) ''set it to col 0 so you do not see a white cell
End If
End Sub
AD
Administrator
Syncfusion Team
August 30, 2005 01:30 PM UTC
Thanks, its working.
I modified the OnClick, the other option did not do what I wanted.