0

DataGrid を使用した WPF アプリケーション。ユーザーがセルをダブルクリックすると、その行の別のセルの値を取得する必要があります。

Dim dep As DependencyObject = DirectCast(e.OriginalSource, DependencyObject)
Dim dgRow As DataGridRow = Nothing
While dep IsNot Nothing
    If TypeOf dep Is DataGridRow Then
        dgRow = DirectCast(dep, DataGridRow)
    End If
    dep = VisualTreeHelper.GetParent(dep)
End While

これで行ができたので、特定の列から値を取得したいと思います。

Dim xx As String = dgRow.Item("xx")

これにより、修正オプションなしで「Option Strict Onが遅延バインディングを許可しない」ようになります。Option Strict Off で問題なく動作します。私はそれを修正するために次のすべてを試しました:

dgRow.Item("xx").ToString
DirectCast(dgRow.Item("xx"), String)
CType(dgRow.Item("xx"), String)

ただし、これらすべてのシナリオで、赤い波線は dgRow.Item("xx") の下に残ります。

これについての別の方法を含め、ご意見をお待ちしております。

アップデート

これが最終的に機能したコードです。Item プロパティのタイプを調べたところ、DataRowView でした。以下のマークの回答に感謝します。

dgRow = DirectCast(DirectCast(dep, DataGridRow).Item, DataRowView)

これにより、遅延バインディングエラーなしでこれを行うことができました:

dgRow.Item("xx").ToString
4

1 に答える 1

1

dgRow.ItemタイプのプロパティですObject。を使用すると、存在しないdgRow.Item("xx")デフォルトのプロパティを呼び出そうとしているため、表示されているエラーが発生します。Object

その("xx")部分から、行が何らかの辞書にバインドされている可能性があるように見えます。その場合、dgRow.Item値にアクセスする前に適切な型にキャストする必要があります。

Dim xx As String = DirectCast(dgRow.Item, Dictionary(Of String, String))("xx")

アップデート

もう一度読んでみると、 a にバインドしている可能性があるように見えますDataTable。その場合、各行は a にバインドされるDataRowため、おそらく次のようなものが必要です。

Dim xx As String = DirectCast(dgRow.Item, DataRow).Field(Of String)("xx")

メソッドを使用可能にするSystem.Data.DataSetExtensions.dllには、への参照を追加する必要がある場合があることに注意してください。Field

于 2015-08-03T19:33:55.167 に答える