Tra*_*ger 18 c# wpf datagrid datagridcell
我正在尝试基于DataGrid实现一个非常简单的电子表格功能.
用户单击一个单元格
用户键入值并按回车键
扫描当前行,并更新依赖于单击的单元格的任何单元格公式.
这似乎是我的要求的最佳事件处理程序:
private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)
Run Code Online (Sandbox Code Playgroud)
问题:如何检测当前行的行索引?
Gra*_*ICA 40
试试这个(假设你的网格名称是"my_dataGrid"):
var currentRowIndex = my_dataGrid.Items.IndexOf(my_dataGrid.CurrentItem);
Run Code Online (Sandbox Code Playgroud)
通常,您可以使用my_dataGrid.SelectedIndex
,但似乎对于CurrentCellChanged
事件,SelectedIndex的值始终显示先前选择的索引.在SelectedIndex的值实际发生更改之前,此特定事件似乎已触发.
接受的解决方案将一直有效,直到 中没有引用重复项为止ItemsSource
,否则您将获得对象第一次出现的索引。BRAHIM Kamel 的解决方案
将一直有效,直到您进行选择,否则(如果您单击两次并取消选择单元格/行)您将不会有.
这样,您将始终获得最后一次出现的数据项的重复项。我将处理事件并在处理程序中搜索可视化树直至 a ,其中有方法。所以你总是会得到正确的行索引。 SelectedIndex
YourDataGrid.ItemContainerGenerator.ContainerFromItem( _dataItemFromCurentCell ) as DataGridRow
DataGrid.PreviewMouseLeftButtonDown
DatagridRow
DatagridRow.GetIndex()
<DataGrid ... PreviewMouseLeftButtonDown="Previe_Mouse_LBtnDown" >
...
</DataGrid>
private void Previe_Mouse_LBtnDown(object sender, MouseButtonEventArgs e)
{
DataGridRow dgr = null;
var visParent = VisualTreeHelper.GetParent(e.OriginalSource as FrameworkElement);
while (dgr == null && visParent != null)
{
dgr = visParent as DataGridRow;
visParent = VisualTreeHelper.GetParent(visParent);
}
if (dgr == null) { return; }
var rowIdx=dgr.GetIndex();
}
Run Code Online (Sandbox Code Playgroud)