How to enable column dragging when the ListBoxSelectionMode is set in WinForms GridControl?
Selection mode
By default, when you set the ListBoxSelection mode it disables the dragging of columns. This is by design, since the selection of rows in the ListBoxMode does not allow other types of selections (like selecting columns to drag them).
There are a couple of solutions. When you only want to support the SelectionMode, you can use the technique in the link (highlight-current-row-and-column) to highlight the single row, not using the SelectionMode and still enabling the dragging of columns through the property setting.
When you want to support the other SelectionMode setting, then you can derive the Grid and override the OnMouseDown and OnMouseUp events. You can turn off these ListBoxSelections while you are working with moving columns.
C#
public class mygridcontrol : GridControl { public bool inselections = false; protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e) { int row, col; //get the point of the mouse Point pt = this.PointToClient(Control.MousePosition); //get the current position bool colheader = this.PointToRowCol(pt,out row,out col, -1) && row == 0; if (colheader && !inselections) { this.ListBoxSelectionMode = SelectionMode.None; } else if (!colheader && inselections) { this.ListBoxSelectionMode=SelectionMode.MultiSimple; inselections = false; } base.OnMouseDown(e); } protected override void OnMouseUp(MouseEventArgs e) { int row, col; Point pt = this.PointToClient(Control.MousePosition); if (this.PointToRowCol(pt, out row, out col, -1) && row == 0) { if (!inselections) inselections = true; else { this.ListBoxSelectionMode = SelectionMode.MultiSimple; inselections = false; } } else { this.ListBoxSelectionMode = SelectionMode.MultiSimple; inselections = false; } base.OnMouseUp(e); } }
VB
Public Class mygridcontrol Inherits GridControl Public inselections As Boolean = False Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs) Dim row, col As Integer 'get the point of the mouse Dim pt As Point = Me.PointToClient(Control.MousePosition) 'get the current position Dim colheader As Boolean = Me.PointToRowCol(pt,row,col, -1) AndAlso row = 0 If colheader AndAlso (Not inselections) Then Me.ListBoxSelectionMode = SelectionMode.None ElseIf (Not colheader) AndAlso inselections Then Me.ListBoxSelectionMode=SelectionMode.MultiSimple inselections = False End If MyBase.OnMouseDown(e) End Sub Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs) Dim row, col As Integer Dim pt As Point = Me.PointToClient(Control.MousePosition) If Me.PointToRowCol(pt, row, col, -1) AndAlso row = 0 Then If Not inselections Then inselections = True Else Me.ListBoxSelectionMode = SelectionMode.MultiSimple inselections = False End If Else Me.ListBoxSelectionMode = SelectionMode.MultiSimple inselections = False End If MyBase.OnMouseUp(e) End Sub End Class
Samples: