選択したdatagridviewの最後の行を設定するのに問題があります。この方法で最後の行を選択します。
if (grid.Rows.Count > 0)
{
try
{
grid.Rows[grid.Rows.Count - 1].Selected = true;
grid.CurrentCell = grid.Rows[grid.Rows.Count - 1].Cells[1]
}
catch (IndexOutOfRangeException)
{ }
catch (ArgumentOutOfRangeException)
{ }
}
このコードを実行すると、例外が発生します:IndexOutOfRangeException occurred
:インデックス1には値がありません。
Rows
collectionと対応するCells
コレクションをデバッグすると、両方のコレクションがいっぱいになっていることがわかります。 Rows andCellsコレクションのインデックスも存在します。
ここで何が間違っているのかわかりません。ここで私を助けることができる誰か? Thnx
編集:
完全な例外は次のとおりです。
System.IndexOutOfRangeException: Index -1 does not have a value.
at System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
at System.Windows.Forms.CurrencyManager.get_Current()
at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
at System.Windows.Forms.DataGridView.set_CurrentCell(DataGridViewCell value)
試してください:
dataGridView1.ClearSelection();//If you want
int nRowIndex = dataGridView1.Rows.Count - 1;
int nColumnIndex = 3;
dataGridView1.Rows[nRowIndex].Selected = true;
dataGridView1.Rows[nRowIndex].Cells[nColumnIndex].Selected = true;
//In case if you want to scroll down as well.
dataGridView1.FirstDisplayedScrollingRowIndex = nRowIndex;
次の出力を提供します :(最後の行、スクロールして選択)
これは少し遅いかもしれませんが、他の誰かに役立つかもしれません。
これを試しましたか:
grid.Rows.Row[grid.Rows.Count -1].Selected = true;
私のWindowsアプリでは、最初にdatagridviewでコードを使用しましたが、同じ例外が発生しました。それから、夜、ベッドにいるときにそれが発生しました(私はプログラミングの初心者です)。
Rows[Rows.count-1]
と書くと、最初の行は「0」と「0-1 = -1」なので、範囲外です:)
次に、コードをRows.Row[index]
に変更すると、機能しました。 :)
C#3.0以降を使用する場合の代替手段:CellAddress();を確認してください。 ;)
心から
これにLinqを使用することを考えましたか?
grid.Rows.OfType<DataGridViewRow>().Last().Selected = true;
grid.CurrentCell = grid.Rows.OfType<DataGridViewRow>().Last().Cells.OfType<DataGridViewCell>().First(); // if first wanted
IndexOutOfRangeExceptionの「catch」ブロックは空であり、エラーはまったく表示されません。
質問が正確でないか、例外が別の場所にスローされています。
EDIT:追加したコールスタックを調べたところ、エラーは確かにnotここでスローされているのではなく、CurrencyManager
クラスのCurrent
/Item
にスローされていることがわかります。プロパティ。これは、最終的にはCurrentCell
セッターの呼び出しによってトリガーされます。
結論:問題はこのコードにはありません。例外は、現在のセルの設定によってトリガーされる他のコードによってスローされます。
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;
それは非常に簡単です。使用:dataGridView.CurrentCell = dataGridView [ColumnIndex、RowIndex];
dataGridView [X、y].。
の代わりに
dataGridView [Y、X] .. ..
IndexOutOfRangeExceptionを回避するには、表示されている行のみを選択するようにしてください。私は提案します:
// Find last visible row
DataGridViewRow row = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => r.Visible).Last();
// scroll to last row if necessary
dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows.IndexOf(row);
// select row
row.Selected = true;