如何确定在XCeed Datagrid中双击哪一行的哪一列?

时间:2014-07-18 20:38:42

标签: wpf xceed-datagrid

我有一个从DataTable填充的XCeed Datagrid。当用户双击一个单元格时,我希望能够确定选择哪一行的列。我该怎么做?

2 个答案:

答案 0 :(得分:1)

好吧,现在似乎简单地提出一个问题会受到惩罚,我认为在提供任何代码时都没有任何意义。

解决方案确实(荒谬地)复杂,对WPF的作者感到羞耻。

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

我为XCeed DataGridControl(在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

答案 1 :(得分:0)

首先,您希望在DataCell目标上双击。要在代码隐藏文件中执行此操作,您可以编写

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

接下来是处理程序方法:

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;
}