1

I have an XCeed Datagrid that is filled from a DataTable. When the user doubleclicks a cell I want to be able to determine which column from which row was selected. How do I do that?

Dabblernl
  • 15,831
  • 18
  • 96
  • 148

2 Answers2

1

Well, it seems that asking a question succinctly is punished nowadays, I see no point at all at providing any code.

The solution is indeed (ridiculously) complicated, shame on the authors of WPF.

The solution for a standard WPF DataGrid can be found here.

I reworked this solution for the XCeed DataGridControl (in VB)

Public Class MyXAMLWindow

    Private Sub grdResults_MouseDoubleClick(sender As Object, e As MouseButtonEventArgs)
        'Cast the sender parameter to the XCeed DataGridControl'
        Dim dg As Xceed.Wpf.DataGrid.DataGridControl = sender

        'Extract the cell information to a custom CellInfo structure.'
        Dim info = GetCellInfo(e.OriginalSource, dg.SelectedIndex)

        'Pass the cellinfo to the ViewModel'
        dg.DataContext.SelectedInfo = info
    End Sub

    ''' <summary>
    ''' Contructs a <see cref="CellInfo(Of String)">cellinfo</see> structure from the cell that was clicked.
    ''' </summary>
    ''' <param name="originalSource">The value of the OriginalSource property of the MouseButtonEventArgs.</param>
    ''' <param name="rowIndex">The index of the row on which was clicked.</param>
    ''' <returns><see cref="CellInfo(Of string)">cellinfo</see> object.</returns>
    ''' <remarks>This function uses the OriginalSource property of the MouseButtonEventArgs as a starting point.</remarks>'
    Private Function GetCellInfo(originalSource As Object, rowIndex As Integer) As CellInfo(Of String)
        Dim dep As DependencyObject = originalSource

        Dim cellInfo = New CellInfo(Of String)

        'Find the DataCell that is associated with the original source.'
        While (dep IsNot Nothing) AndAlso Not (TypeOf dep Is DataCell)
            dep = VisualTreeHelper.GetParent(dep)
        End While

        If dep Is Nothing Then
            Return New CellInfo(Of String) With {.ColumnIndex = -1, .RowIndex = -1, .Value = String.Empty}
        End If

        If TypeOf dep Is DataCell Then
            Dim cell As DataCell = TryCast(dep, DataCell)

            cellInfo.ColumnIndex = cell.ParentColumn.Index
            cellInfo.RowIndex = rowIndex
            cellInfo.Value = cell.Content

        End If

        Return cellInfo
    End Function
End Class

'A custom Structure to hold the data of the selected Cell.'
Public Structure CellInfo(Of TValue)
    Public RowIndex As Integer
    Public ColumnIndex As Integer
    Public Value As TValue
End Structure
Dabblernl
  • 15,831
  • 18
  • 96
  • 148
1

First you want to handle double clicks on DataCell target. To do this in code behind file you can write

    EventManager.RegisterClassHandler(
        typeof(DataCell),
        DataCell.MouseDoubleClickEvent,
        new MouseButtonEventHandler(OnDataCellMouseDoubleClick));

Next goes handler method:

private void OnDataCellMouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var clickedCell = sender as DataCell;
    var row = clickedCell.ParentRow;
    var rowNum = row.TabIndex;
    var column = clickedCell.ParentColumn;
    var columnNum = column.Index;
}
cantcodethis
  • 11
  • 1
  • 1