from:
Basically, you should handle the GridView.DoubleClick, get the mouse cursor position, and pass it to the CalcHitInfo method to check whether the mouse points to a grid row, and not, for example, to column headers or footer. Finally, perform your action.
[C#]
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
private void gridView1_DoubleClick(object sender, EventArgs e) {
GridView view = (GridView)sender;
Point pt = view.GridControl.PointToClient(Control.MousePosition);
DoRowDoubleClick(view, pt);
}
private static void DoRowDoubleClick(GridView view, Point pt) {
GridHitInfo info = view.CalcHitInfo(pt);
if(info.InRow || info.InRowCell) {
string colCaption = info.Column == null ? "N/A" : info.Column.GetCaption();
MessageBox.Show(string.Format("DoubleClick on row: {0}, column: {1}.", info.RowHandle,
colCaption));
}
}
[VB.NET]
Imports DevExpress.XtraGrid.Views.Grid
Imports DevExpress.XtraGrid.Views.Grid.ViewInfo
Private Sub gridView1_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) Handles
gridView1.DoubleClick
Dim view As GridView = CType(sender, GridView)
Dim pt As Point = view.GridControl.PointToClient(Control.MousePosition)
DoRowDoubleClick(view, pt)
End Sub
Private Shared Sub DoRowDoubleClick(ByVal view As GridView, ByVal pt As Point)
Dim info As GridHitInfo = view.CalcHitInfo(pt)
If info.InRow OrElse info.InRowCell Then
Dim colCaption As String
If info.Column Is Nothing Then
colCaption = "N/A"
Else
colCaption = info.Column.GetCaption()
End If
MessageBox.Show(String.Format("DoubleClick on row: {0}, column: {1}.", info.RowHandle,
colCaption))
End If
End Sub
The above code works fine until your grid is not editable, said differently, until the GridView.OptionsBehavior.Editable option is set to False. Once you enable inplace editing, a click on a grid cell activates an editor. After that all mouse events are sent to that very editor and cannot be handled at the GridView level, so your GridView.DoubleClick event handler is no longer being executed.
If you need inplace editing and also need to handle double-clicks, set the GridView.OptionsBehavior.EditorShowMode property to Click. This is the easiest solution. In this case, the DoubleClick event is fired before an inplace editor is activated, so your code is executed as expected.
However, end-users may complain that now, with option EditorShowMode set to Click, they have to click twice to activate a cell editor. These complains may force you to revert EditorShowMode to its Default value and improve your double-click handler.
As it was mentioned above, the grid doesn't receive mouse events while a cell editor is activate. This means that the double-click event must be handled at the editor level.
To attach/detach event handlers of an inplace editor, use the ShownEditor and HiddenEditor events, as explained in the How to assign an event handler to the in-place editor article.
[C#]
using DevExpress.XtraEditors;
using DevExpress.XtraGrid;
BaseEdit inplaceEditor;
private void gridView1_ShownEditor(object sender, EventArgs e) {
inplaceEditor = ((GridView)sender).ActiveEditor;
inplaceEditor.DoubleClick += inplaceEditor_DoubleClick;
}
private void gridView1_HiddenEditor(object sender, EventArgs e) {
if(inplaceEditor != null) {
inplaceEditor.DoubleClick -= inplaceEditor_DoubleClick;
inplaceEditor = null;
}
}
void inplaceEditor_DoubleClick(object sender, EventArgs e) {
BaseEdit editor = (BaseEdit)sender;
GridControl grid = (GridControl)editor.Parent;
Point pt = grid.PointToClient(Control.MousePosition);
GridView view = (GridView)grid.FocusedView;
DoRowDoubleClick(view, pt);
}
[VB.NET]
Imports DevExpress.XtraEditors
Imports DevExpress.XtraGrid
Private inplaceEditor As BaseEdit
Private Sub gridView1_ShownEditor(ByVal sender As Object, ByVal e As EventArgs) Handles
gridView1.ShownEditor
inplaceEditor = (CType(sender, GridView)).ActiveEditor
AddHandler inplaceEditor.DoubleClick, AddressOf inplaceEditor_DoubleClick
End Sub
Private Sub gridView1_HiddenEditor(ByVal sender As Object, ByVal e As EventArgs) Handles
gridView1.HiddenEditor
If inplaceEditor IsNot Nothing Then
RemoveHandler inplaceEditor.DoubleClick, AddressOf inplaceEditor_DoubleClick
inplaceEditor = Nothing
End If
End Sub
Private Sub inplaceEditor_DoubleClick(ByVal sender As Object, ByVal e As EventArgs)
Dim editor As BaseEdit = CType(sender, BaseEdit)
Dim grid As GridControl = CType(editor.Parent, GridControl)
Dim pt As Point = grid.PointToClient(Control.MousePosition)
Dim view As GridView = CType(grid.FocusedView, GridView)
DoRowDoubleClick(view, pt)
End Sub
Besides handling the inplace editor's DoubleClick event, you still need to handle the grid's DoubleClick to allow a user to double-click the row indicator.
See Also:
How to assign an event handler to the in-place editor
How to Disable the Immediate Opening of In-Place Editors
Why is the DoubleClick event for the GridView not triggered?
===============================
This example demonstrates three different solutions of handling the double-click event on a grid row or column cell. The solution you should choose for your project depends on your grid settings: whether it allows editing and how an inplace editor is activated. Please refer to the How to handle a double-click on a grid row or cell article to learn implementation details.