DataGridView の現在の行のインデックスを取得したいと考えています。問題は、現在の行が新しい行である場合、CurrentRow が新しい行ではない最後の行に設定されることです。行が選択されている場合、それが現在の行であるとは限らず、現在の行が必ずしも選択されているとは限らないため、行が選択されているかどうかを確認できません。
新しい行のインデックスを取得できますが、新しい行が現在の行であるかどうかはどうすればわかりますか?
DataGridView の現在の行のインデックスを取得したいと考えています。問題は、現在の行が新しい行である場合、CurrentRow が新しい行ではない最後の行に設定されることです。行が選択されている場合、それが現在の行であるとは限らず、現在の行が必ずしも選択されているとは限らないため、行が選択されているかどうかを確認できません。
新しい行のインデックスを取得できますが、新しい行が現在の行であるかどうかはどうすればわかりますか?
次のコードを使用して、CellClick イベントにフックしました。
private void uiEntries_CellClick(object sender, DataGridViewCellEventArgs e)
{
Console.WriteLine(e.RowIndex == uiEntries.NewRowIndex);
}
その条件が真の場合、ユーザーは新しい行を「選択」しました。その情報に基づいて、新しい行が実際にはコレクションに存在しないため、実際に何かを行う前に (..Rows.Add() メソッドを使用して) 新しいレコードを実際に挿入する必要がある場合があります。新しい行を表すプレースホルダーとしてそこにあるだけです。
このプロパティ値で問題を解決できますか?
dataGridView1.CurrentCell.RowIndex
CellEnter イベントを使用して、CurrentCell.RowIndex をフォーム変数に保存します。別のボタンをクリックすると、必要な新しい行インデックスではなく、最後の既存の行インデックスでこのイベントが発生するため、そのケースを無視するようにフォーカスをテストします。
これにより、CellClick イベントで行うように、カーソルを新しい行に移動する可能性のあるすべてのキーおよびマウス アクションをチェックする必要がなくなります。
VB から自動変換されたコード:
private int ActualCurrentRowIndex;
private void DataGridView1_CellEnter(object sender, System.Windows.Forms.DataGridViewCellEventArgs e)
{
if (DataGridView1.Focused) {
ActualCurrentRowIndex = DataGridView1.CurrentCell.RowIndex;
}
}