2017-08-03 1 views
0

Je suis intéressé par la raison pour laquelle le mot-clé var ne fonctionne pas correctement dans une foreach-loop sur DataGridViewSelectedRowCollection.Pourquoi var ne fonctionne pas sur DataGridViewSelectedRowCollectoin

ex1:

var selectedRows = MyDataGridView.SelectedRows; 
foreach (var row in selectedRows) 
     { 
      var foo = row.DataBoundItem; 
      _bindingSource.Remove(foo); 
     } 

ex1 le type de 'ligne' est l'objet. Pourquoi est-il pas de type 'DataGridViewRow'

EX2 fonctionne parfaitement:

var selectedRows = MyDataGridView.SelectedRows; 
foreach (DataGridViewRow row in selectedRows) 
     { 
      var foo = row.DataBoundItem; 
      _bindingSource.Remove(foo); 
     } 

aussi si j'accéder à l'élément de la collection directement cela fonctionne:

var selectedRows = MyDataGridView.SelectedRows; 
var foo = selectedRows[0]; 
var bar = foo.GetType().Name; // bar == DataGridViewRow 

Je suis intéressé par le raison pour laquelle cela arrive.

Merci à l'avance

+0

Avez-vous essayé de faire 'selectedRows [0] .DataBoundItem;' dans ex2? Parce que ce n'est pas une comparaison 'juste' atm :) – EpicKip

Répondre

2

Le DataGridView.SelectedRows Property retourne un DataGridViewSelectedRowCollection. La déclaration de type pour la classe DataGridViewSelectedRowCollection est:

public class DataGridViewSelectedRowCollection : BaseCollection, 
    IList, ICollection, IEnumerable 

Notez que la classe implémente IEnumerable, mais pas IEnumerable<DataGridViewRow>. Le IEnumerator.Current Property renvoyé en tant qu'élément d'une boucle foreach est de type System.Object. Par conséquent, l'IDE/compilateur attribue var row un type d'objet et techniquement l'inférence de type fonctionne comme spécifié.

La raison var foo = selectedRows[0];fonctionne, est que le DataGridViewSelectedRowCollection.Item Property retourné par le C# indexeur est entré comme DataGridViewRow, de sorte que l'inférence de type prend cela.

+1

Et comme solution de contournement si vous voulez boucler les lignes sélectionnées, vous pouvez transformer la collection en collection de 'DataGridViewRow' -' foreach (var row dans dataGridView.SelectedRows.Cast ()). .. » – Fabio