"BaseChange"というオブジェクトのリストにバインドされたDataGridViewがあります。 BaseChangeオブジェクトは4つのプロパティで構成され...オプションstrictが有効な場合、LinqクエリでDataGridViewRowの暗黙的キャストエラーが発生する
- 変更タイプ
- ChangeStatus
- ChangeDescription
- LastChangeDate
DataGridViewのは、すべての4つの値の列、ならびに5を有しています(「colIsSelected」というチェックボックスの列)。リストをグリッドにバインドして項目を表示する際に問題はありません。
問題は、グリッド内で選択された項目を取得するクエリが、オプションstrictが有効になっているときに暗黙のキャストエラーが発生することです。
これは、クエリ...
Dim _changes As List(Of BaseChange)
_changes = (From _row As DataGridViewRow In dgvChanges.Rows() _
Where Convert.ToBoolean(_row.Cells(NAME_COLUMN_IS_SELECTED).Value) = True _
Select DirectCast(_row.DataBoundItem, BaseChange)).ToList()
です...そしてそれはオプション厳しいオフで正しい結果が得られます。暗黙のキャストスケグルは "_row As DataGridViewRow"コードにあり、完全なメッセージは ""から "System.Windows.Forms.DataGridViewRow '"への暗黙的な変換です。
"As DataGridViewRow"をクエリから除外すると、_row.Cellsおよび_row.DataBoundItemで遅延バインディングエラーが発生し、これもオプションstrictに失敗します。
これは、Option Strictを有効にしてVBで使用する場合に必要です。私はここに何かを逃していますか誰でも提案がありますか?
これで問題は解決しましたが、Rows()コレクションがDataGridViewRowのコレクションとして実際には見られない理由で、まだ混乱しています。私はこれについてもっと知ることができるか知っていますか? これは小規模なアプリケーション向けですが、より大きなアプリケーションで必要となる可能性のあるキャスト量が心配です。私は他の(ジェネリック)コレクション型に対してこれを行う必要はありませんでしたが、これは非ジェネリックコレクションに対してLINQを使用するときに期待するものですか?それはそうであるようにパフォーマンスヒットの大きさですか? – StingyJack
基本的に、下にテキストを追加しました。Option Infer –
「説明」段落は、表示されるほとんどのコードサンプルに含まれていないキャストが必要な理由を説明する下部に追加されました。 –