2009-07-06 8 views
1

J'ai un DataGridView qui est lié à une liste d'objets appelée "BaseChange". Les objets BaseChange sont composés de 4 propriétés ...La requête Linq a une erreur de distribution implicite pour DataGridViewRow lorsque l'option strict est activée

  • ChangeType
  • ChangeStatus
  • ChangeDescription
  • LastChangeDate

Le datagridview comporte des colonnes pour les 4 valeurs ainsi qu'un 5 (une colonne de case à cocher appelée "colIsSelected"). Il n'y a aucun problème à lier la liste à la grille et à afficher les éléments.

Le problème est que la requête qui obtient les éléments sélectionnés dans la grille me donne une erreur de distribution implicite lorsque l'option strict est activée.

C'est la requête ...

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() 

... et il produit des résultats corrects avec option stricte off. Le squiggle de distribution implicite est sur le code "_row As DataGridViewRow", et le message complet est "Conversion implicite de 'Object' à 'System.Windows.Forms.DataGridViewRow'".

Si j'exclut le "As DataGridViewRow" de la requête, j'obtiens une erreur de liaison tardive sur les _row.Cells et _row.DataBoundItem et cela échoue également l'option strict.

J'ai besoin que cela fonctionne avec Option Strict activé, et en VB. Est-ce que j'ai râté quelque chose? Quelqu'un a des suggestions?

Répondre

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

votre type de l'objet _row doit correspondre à la version unique du type de collection.

comme dans:

'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 voit vos lignes() collection comme IEnumerable, de sorte que votre ligne est un objet. L'explication au bas va plus en détail.

Ajouté:

Ajout d'option Déduire devrait simplifier.

Voir pour plus de détails:

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

et

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

Explication: Je ne peu plus creuser pour expliquer pourquoi il est plus simple. RowCollection pour un DataGridView implémente l'ancienne interface IEnumberable qui renvoie des objets, tandis que les types de collection plus récents implémentent l'interface générique IEnumerable (Of T), qui renvoie le type directement, supprimant le besoin de conversion.

Voir msdn pour les interfaces implémentées.

+0

Cela résout le problème, mais je suis encore un peu confus par la raison pour laquelle la collection Rows() n'est pas réellement considérée comme une collection de DataGridViewRow. Savez-vous où je peux obtenir plus d'informations à ce sujet? Ceci est pour une petite application mais je suis préoccupé par la quantité de coulée qui pourrait être nécessaire dans une application plus grande. Je n'ai pas eu à le faire pour d'autres types de collection (génériques), est-ce quelque chose à attendre lors de l'utilisation de LINQ par rapport à des collections non génériques? Est-ce que c'est aussi gros d'un coup de performance qu'il semble être? – StingyJack

+0

J'ai ajouté du texte en bas, fondamentalement, ajouter l'option Infer –

+2

J'ai ajouté le paragraphe "Explication" en bas qui explique pourquoi la distribution est requise, quand elle n'est pas dans la plupart des exemples de code que vous voyez. –

Questions connexes