我正在尝试基于DataGrid实现一个非常简单的电子表格功能。
用户点击一个单元格
用户键入一个值并按回车
扫描当前行,并更新依赖于单击单元格的任何单元格公式。
这似乎是我的要求的最佳事件处理程序:
private void my_dataGrid_CurrentCellChanged(object sender, EventArgs e)
问题:如何检测当前行的行索引?
答案 0 :(得分:36)
试试这个(假设你的网格名称是“my_dataGrid”):
var currentRowIndex = my_dataGrid.Items.IndexOf(my_dataGrid.CurrentItem);
通常情况下,您可以使用my_dataGrid.SelectedIndex
,但似乎对于CurrentCellChanged
事件,SelectedIndex的值始终显示之前选定的索引。这个特殊事件似乎在SelectedIndex的值实际发生变化之前触发。
答案 1 :(得分:3)
您好,你可以做这样的事情来做电子表格
//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
}
}
}
希望这个帮助
答案 2 :(得分:1)
格兰特(Grant)的解决方案将一直运行,直到ItemsSource
中没有引用重复项为止,否则将获得该对象首次出现的索引。
在选择之前,BRAHIM Kamel的解决方案将一直有效,否则,如果您单击两次并取消选择一个单元格/行,您将没有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();
}
答案 3 :(得分:0)
1。单击Datagrid内的单元格时,获取CurrentCell信息
2。从DatagridCellInfo中,我们可以找到特定单元格的Column和Row索引
<?php
$user = wp_get_current_user();
if ( $user ) : ?>
<img src="<?php echo esc_url( get_avatar_url( $user->ID ) ); ?>" />
<?php endif; ?>
答案 4 :(得分:-3)
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);