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?
问问题
1030 次
2 回答
1
好吧,现在似乎简洁地提出问题会受到惩罚,我认为提供任何代码毫无意义。
解决方案确实(荒谬地)复杂,让 WPF 的作者感到羞耻。
我为 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
于 2014-07-19T07:07:48.593 回答
1
首先,您要处理对 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;
}
于 2014-07-30T10:16:43.833 回答