2015-08-03 1 views
0

Application WPF utilisant DataGrid. L'utilisateur double-clique sur une cellule et j'ai besoin d'obtenir la valeur d'une autre cellule de cette ligne.WPF DataGridRow.Item ("xx") - Option Strict On interdit la liaison tardive

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 

Alors maintenant, j'ai la ligne, je veux obtenir la valeur d'une colonne spécifique:

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

Cela me obtient "Option Strict On n'autorise la liaison tardive" sans options de correction. Cela fonctionne très bien avec Option Strict Off. J'ai essayé tout ce qui suit pour corriger:

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

Cependant, la ligne rouge squiggly reste sous dgRow.Item (« xx ») dans tous ces scénarios.

Appréciez toute contribution, y compris d'autres façons d'y parvenir.

MISE À JOUR

Voici le code qui a finalement travaillé. J'ai regardé le type de la propriété Item et c'était DataRowView. Merci à la réponse de Mark ci-dessous.

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

Cela m'a permis de le faire sans l'erreur liaison tardive:

dgRow.Item("xx").ToString 

Répondre

1

dgRow.Item est une propriété de type Object. En utilisant dgRow.Item("xx") vous essayez d'appeler la propriété par défaut, qui pour Object n'existe pas, et vous donne donc l'erreur que vous voyez.

De la partie ("xx"), il semble que la ligne puisse être liée à une sorte de dictionnaire. Si tel est le cas, vous devez lancer dgRow.Item au type approprié avant d'y accéder, par exemple.

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

MISE À JOUR

En lisant à nouveau, il semble que vous pouvez lier à un DataTable, auquel cas chaque ligne serait lié à un DataRow, donc peut-être quelque chose comme ceci est ce que vous avez besoin :

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

Remarque, vous devrez peut-être ajouter une référence à System.Data.DataSetExtensions.dll pour l'être disponible méthode Field.

+0

Merci! Cela m'a aidé à le réparer. J'ai modifié ma question pour inclure mon code final. – tolsen64