web-dev-qa-db-ja.com

DatagridView最後の行を選択

選択した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には値がありません。

Rowscollectionと対応する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)
9
Martijn

試してください:

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;

次の出力を提供します :(最後の行、スクロールして選択)

alt text

14
KMån

これは少し遅いかもしれませんが、他の誰かに役立つかもしれません。

これを試しましたか:

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();を確認してください。 ;)

心から

4
sihirbazzz

これにLinqを使用することを考えましたか?

    grid.Rows.OfType<DataGridViewRow>().Last().Selected = true;
    grid.CurrentCell = grid.Rows.OfType<DataGridViewRow>().Last().Cells.OfType<DataGridViewCell>().First(); // if first wanted
2
danijels

IndexOutOfRangeExceptionの「catch」ブロックは空であり、エラーはまったく表示されません。

質問が正確でないか、例外が別の場所にスローされています。

EDIT:追加したコールスタックを調べたところ、エラーは確かにnotここでスローされているのではなく、CurrencyManagerクラスのCurrent/Itemにスローされていることがわかります。プロパティ。これは、最終的にはCurrentCellセッターの呼び出しによってトリガーされます。

結論:問題はこのコードにはありません。例外は、現在のセルの設定によってトリガーされる他のコードによってスローされます。

1
Shaul Behr
dataGridView1.Rows[dataGridView1.Rows.Count - 1].Selected = true;
1
Ozkan Konca

それは非常に簡単です。使用:dataGridView.CurrentCell = dataGridView [ColumnIndex、RowIndex];
dataGridView [X、y].。
の代わりに
dataGridView [Y、X] .. ..

0
mehrdad safa

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;
0
zeitgeist02