2009-11-04 26 views
5

DataGridView'den "seçili hücreleri olan satırların dizinlerini" döndürmesini istemenizin en temiz yolu nedir? Bu DataGridView.SelectedRows ile aynı değil. Satır veya Sütun seçimine izin vermem. Böylece kullanıcılar hücre bloklarını seçmelidir. Sadece hangi satırların hücreyi seçtiğini bulmalıyım.C# - DataGridView ve SelectedCells - Seçili Hücrelerin Satır Dizinlerini Bulma

Kullanmam gereken zeki bir lambda ifadesi var mı? Ne yapardınız?

bu yardımcı olursa: Ben zaten DataGridView miras ve Kendi özel sınıf DataGridViewExt olduğum yazıyorum kodunda.

+0

hissediyorum. – BuddyJoe

+0

Yapıyor mu, yapıyor olabilir mi? –

+0

Olmalıdır - bir başkasının bu kod tabanını bir yıldan beri destekleyeceği düşüncesiyle ... Ve bu projede daha iyi olacak şekilde 3 ile 5 arasında 1 satırda niyetini tanımlayabilirsem. – BuddyJoe

cevap

9

LINQ çözüm:

var rowIndexes = dgv.SelectedCells.Cast<DataGridViewCell>() 
            .Select(cell => cell.RowIndex) 
            .Distinct(); 

Düzenleme:

sadece Cast kayıptı. DataGridViewSelectedCellCollection, IEnumerable<DataGridViewCell>, yalnızca IEnumerable, uygulamıyor çünkü bu değerlerini numaralandırdığınızda, bunlar Object türündendir. döküm varken, bu verecekti: Ben yapması gereken LINQ sözdizimi SELECT DISTINCT çeşit olması gerektiği gibi

int[] rowIndexes = (from sc in this.SelectedCells.Cast<DataGridViewCell>() 
        select sc.RowIndex).Distinct().ToArray(); 
+0

harika! +1 ve cevap. sadece meraklı ama alternatif sözdizimi ne olurdu? Bir yere takıldım: int [] rowIndexes = (bu, sc.RowIndex dosyasındaki sc dosyasından) .Distinct(). ToArray(); Bunu cevaba ekleyebilir misin? – BuddyJoe

+0

Cevabımı düzenledim. –

+0

Ah ok. LINQ ve .Cast <>() öğesinde bir veya iki makale okumanız gerekiyor. Teşekkürler. – BuddyJoe

1
IEnumerable<int> indexes = 
(from c in dataGridView1.SelectedCells.Cast<DataGridViewCell>() 
    select c.RowIndex).Distinct();