2017-08-03 3 views
0

Ich interessiere mich für den Grund, warum das Schlüsselwort var nicht ordnungsgemäß in einer foreach-Schleife in der DataGridViewSelectedRowCollection funktioniert.Warum funktioniert var nicht bei DataGridViewSelectedRowCollectoin

ex1:

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

ex1 der Art der 'Reihe' ist Gegenstand. Warum ist es nicht vom Typ ‚DataGridViewRow‘

ex2 funktioniert perfekt:

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

auch wenn ich das Element der Sammlung zugreifen direkt funktioniert es:

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

Ich interessiere mich für die Grund, warum das passiert.

Vielen Dank im Voraus

+0

Haben Sie 'excludeRows [0] .DataBoundItem;' in ex2 versucht? Weil es kein 'fairer' Vergleich atm ist. – EpicKip

Antwort

2

Die DataGridView.SelectedRows Property gibt ein DataGridViewSelectedRowCollection. Die Typdeklaration für DataGridViewSelectedRowCollection Klasse:

public class DataGridViewSelectedRowCollection : BaseCollection, 
    IList, ICollection, IEnumerable 

Beachten Sie, dass die Klasse implementiert IEnumerable, aber nicht IEnumerable<DataGridViewRow>. Die IEnumerator.Current Property, die als Element einer foreach Schleife zurückgegeben wird, ist vom Typ System.Object. Daher ordnet der IDE/Compiler var row einen Objekttyp zu und technisch arbeitet die Typinferenz wie angegeben.

Der Grund var foo = selectedRows[0];arbeitet ist, dass die DataGridViewSelectedRowCollection.Item Property durch die C# Indexer zurückgegeben wird als DataGridViewRow eingegeben, so dass die Typinferenz dass abholt.

+1

Und als Workaround, wenn Sie Schleife ausgewählten Zeilen möchten, können Sie Sammlung in Sammlung von 'DataGridViewRow' -' foreach (var Zeile in dataGridView.SelectedRows.Cast ()). ..' – Fabio

Verwandte Themen