DataGridに基づいた非常にシンプルなスプレッドシート機能を実装しようとしています。
ユーザーがセルをクリックする
ユーザーが値を入力してReturnキーを押す
現在の行がスキャンされ、クリックされたセルに依存するセル数式が更新されます。
これは私の要件に最適なイベントハンドラのようです。
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の値が実際に変更される前に発生するようです。
こんにちは、あなたはあなたのスプレッドシートをするためにこのような何かをすることができます
//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
}
}
}
この助けを願っています
Grantからの解決策は、ItemsSource
に参照の重複がなくなるまで機能します。それ以外の場合は、オブジェクトの最初の出現のインデックスを取得します。
BRAHIM Kamelのソリューションは、選択するまで機能します。それ以外の場合(2回クリックしてセル/行の選択を解除すると)SelectedIndex
がなくなります。YourDataGrid.ItemContainerGenerator.ContainerFromItem( _dataItemFromCurentCell ) as DataGridRow
を使用すると、データ項目の最後の出現が常に重複して取得されます。
I would _DataGrid.PreviewMouseLeftButtonDown
_イベントを処理し、DatagridRow.GetIndex()
メソッドを持つDatagridRow
までのビジュアルツリーをハンドラーで検索します。 つまり、常に正しい行インデックスを取得します。
_<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();
}
_