我正在尝试基于 DataGrid 实现一个非常简单的电子表格功能。
用户点击一个单元格
用户输入一个值并按回车键
扫描当前行并更新依赖于单击的单元格的任何单元格公式。
这似乎是满足我要求的最佳事件处理程序:
private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)
问题:如何检测当前行的行索引?
我正在尝试基于 DataGrid 实现一个非常简单的电子表格功能。
用户点击一个单元格
用户输入一个值并按回车键
扫描当前行并更新依赖于单击的单元格的任何单元格公式。
这似乎是满足我要求的最佳事件处理程序:
private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)
问题:如何检测当前行的行索引?
试试这个(假设你的网格名称是“my_dataGrid”):
var currentRowIndex = my_dataGrid.Items.IndexOf(my_dataGrid.CurrentItem);
通常,您可以使用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();
}
嗨,你可以做这样的事情来做你的电子表格
//not recomended as it always return the previous index of the selected row
void dg1_CurrentCellChanged(object sender, EventArgs e)
{
int rowIndex = dg1.SelectedIndex;
}
但是如果你想要一个更详细的例子,你可以这样做
namespace WpfApplication2
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ObservableCollection<Tuple<string,string>> observableCollection = new ObservableCollection<Tuple<string,string>>();
public MainWindow()
{
InitializeComponent();
for (int i = 0; i < 100; i++)
{
observableCollection.Add( Tuple.Create("item " + i.ToString(),"=sum (c5+c4)"));
}
dg1.ItemsSource = observableCollection;
dg1.CurrentCellChanged += dg1_CurrentCellChanged;
}
void dg1_CurrentCellChanged(object sender, EventArgs e)
{
//int rowIndex = dg1.SelectedIndex;
Tuple<string, string> tuple = dg1.CurrentItem as Tuple<string, string>;
//here as you have your datacontext you can loop through and calculate what you want
}
}
}
希望这有帮助
1.点击Datagrid里面的Cell,获取CurrentCell信息
2.从DatagridCellInfo中,我们可以找到特定单元格的列和行索引
private void CellClick(object sender,RoutedEventArgs e)
{
DataGridCellInfo cell=DataGrid.CurrentCell;
int columnindex=cell.Column.DisplayIndex;
int rowIndex=DataGrid.Items.IndexOf(cell.Item);
}
GRD.Items.Count;
DataGridRow row = (DataGridRow) GRD.ItemContainerGenerator.ContainerFromIndex(i);
DataGridCell TXTGROUPID = GRD.Columns[2].GetCellContent(row).Parent as DataGridCell;
string str = ((TextBlock) TXTGROUPID.Content).Text;
MessageBox.Show(str);