1

「BaseChange」というオブジェクトのリストにバインドされた DataGridView があります。BaseChange オブジェクトは 4 つのプロパティで構成されています...

  • 変更タイプ
  • ステータスを変更する
  • 変更の説明
  • 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()

...そして、オプションstrict offを使用すると正しい結果が得られます。暗黙的なキャストの波線は "_row As DataGridViewRow" コードにあり、完全なメッセージは " Implicit conversion from 'Object' to 'System.Windows.Forms.DataGridViewRow' " です。

「As DataGridViewRow」をクエリから除外すると、_row.Cells と _row.DataBoundItem で遅延バインディング エラーが発生し、これもオプション strict に失敗します。

Option Strict を有効にして VB で動作させるには、これが必要です。ここで何か不足していますか?誰にも提案がありますか?

4

1 に答える 1

3
(From _row As DataGridViewRow In dgvChanges.Rows() 

_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 は Rows() コレクションを IEnumerable と見なすため、行はオブジェクトです。下部の説明はより詳細になります。

追加した:

Option Infer を追加すると、これが簡素化されます。

詳細については、次を参照してください。

VB.NET の Option Strict と新しい Option Infer ディレクティブを組み合わせる最良の方法は何ですか?

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

説明: なぜ単純ではないのかについて、さらに掘り下げました。DataGridView の RowCollection は、オブジェクトを返す古い IEnumberable インターフェイスを実装しますが、新しいコレクション型は、型を直接返すジェネリック IEnumerable(Of T) インターフェイスを実装し、キャストの必要性を取り除きます。

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

于 2009-07-06T20:51:12.617 に答える