2009-07-06 6 views
1

"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で使用する場合に必要です。私はここに何かを逃していますか誰でも提案がありますか?

答えて

3

あなたのタイプの_rowオブジェクトは、コレクションタイプの単一バージョンと一致する必要があります。

のように:

'Assumes Option Strict On and Option Implicit On 
    Dim _changes = (From _row In dgvChanges.Rows() _    
      Where Convert.ToBoolean(ctype(_row,DataGridViewRow).Cells(NAME_COLUMN_IS_SELECTED).Value) = True _   
Select DirectCast(ctype(_row,DataGridViewRow).DataBoundItem, BaseChange)).ToList() 

LINQのは、あなたの行のIEnumerableとして()コレクションを、見ているので、あなたの行が対象です。一番下の説明がさらに詳しく説明されています。

を追加しました:

追加オプション推論はこれを簡素化する必要があります。

は詳細を参照してください:

What is the best way to mix VB.NET's Option Strict and the new Option Infer directives?

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/e3ec737a-42f8-4767-a190-78390202a991/

説明

: は、私はいくつかのより多くのそれは単純ではない理由を掘りました。 DataGridViewのRowCollectionは、オブジェクトを返す古いIEnumberableインターフェイスを実装し、新しいコレクションタイプを実装します。汎用のIEnumerable(Of T)インターフェイスを実装します。このインターフェイスは、型を直接返し、キャストする必要がなくなります。

実装されたインターフェイスについては、msdnを参照してください。

+0

これで問題は解決しましたが、Rows()コレクションがDataGridViewRowのコレクションとして実際には見られない理由で、まだ混乱しています。私はこれについてもっと知ることができるか知っていますか? これは小規模なアプリケーション向けですが、より大きなアプリケーションで必要となる可能性のあるキャスト量が心配です。私は他の(ジェネリック)コレクション型に対してこれを行う必要はありませんでしたが、これは非ジェネリックコレクションに対してLINQを使用するときに期待するものですか?それはそうであるようにパフォーマンスヒットの大きさですか? – StingyJack

+0

基本的に、下にテキストを追加しました。Option Infer –

+2

「説明」段落は、表示されるほとんどのコードサンプルに含まれていないキャストが必要な理由を説明する下部に追加されました。 –

関連する問題