2010-01-18 15 views
33

Ich muss das aktuell ausgewählte Objekt von da Databound DataGridView abrufen.DataGridView erhält das aktuell ausgewählte Objekt

Ich brauche nicht das Objekt der aktuell ausgewählten Zelle, sondern das Objekt, auf dem die ganze Zeile basiert, in diesem Fall ein BusinessObject, dessen Eigenschaften die Spalten des Rasters bilden.

Ich könnte über die DataSource gehen, aber das ist nur ein Objekt und kann eine BindingSource oder eine IBindingList oder so ähnlich sein - also nicht einfach standardisierte Weise, um das gewünschte Objekt zu bekommen.

Dahinter muss nur das BusinessObject für eine Eigenschaft namens IsChanged überprüft werden und der Benutzer aufgefordert werden, die Änderungen zu speichern oder zu verwerfen, bevor die Bindungsquelle das nächste Element auswählt. Daher muss ich das aktuelle Objekt innerhalb von RowValidating-Event der DataGridView herausfinden, da die BindingSource kein Ereignis anbietet, um die Änderung vor dem Wechsel zu stoppen. See here for the well known problem

Danke fürs Lesen ;-)

Antwort

69

DataGridViewRow.DataBoundItem enthält das 'Geschäft' Objekt, um es gebunden ist.

+4

Danke, dass du mich richtig angedeutet hast, manchmal sollte man sich einfach zurücklehnen und entspannen, statt intensiver zu suchen ... –

+1

Das ist viel besser als die Daten zwischenzuspeichern und dann zu versuchen, th zu verwenden Der ausgewählte Index. Vielen Dank! – styfle

+0

Ich möchte nur erwähnen, dass dies auch funktioniert, wenn Ihr dataGrid nicht an die Daten "gebunden" ist, sondern wenn Sie es nur mit 'DataSource' angewendet haben – copa017

6

Hier ist mein Code dieses in Ihrer Person-Klasse setzt

public static explicit operator Person(DataRow dr) 
    { 
     Person p = new Person(); 
     p.adi = dr.ItemArray[0].ToString(); 
     p.id = Int32.Parse(dr.ItemArray[1].ToString()); 
     p.soyadi = dr.ItemArray[2].ToString(); 
     p.kartNo = dr.ItemArray[3].ToString(); 
     p.dogumTarihi = DateTime.Parse(dr.ItemArray[4].ToString()); 
     p.adres = dr.ItemArray[5].ToString(); 
     p.meslek = dr.ItemArray[6].ToString(); 
     p.telefon = dr.ItemArray[7].ToString(); 
     p.gsm = dr.ItemArray[8].ToString(); 
     p.eposta = dr.ItemArray[9].ToString(); 

     return p; 
    } 

und dies eine Schaltfläche klicken Update

DataRow row = (dataGridView1.SelectedRows[0].DataBoundItem as DataRowView).Row; 
Person selected = (Person)row; 
0

Was diese Weise?

foreach (DataGridViewRow item in this.dataGridView1.SelectedRows) 
{ 
    MessageBox.Show(item.Cells[0].Value.ToString()); 
} 

Wir können mehrere ausgewählte Zeilen Daten erhalten.

0

Da Sie die IBindingList angegeben haben - ja, wie andere gesagt haben, dass die DataBoundItem -Eigenschaft Ihnen geben wird, was Sie brauchen - gibt es ein Problem, das ich zuvor erlebt hatte und endete mit einer Nullreferenz, aber jetzt kann ich nicht denke an das Szenario, in dem es passiert ist.

Wenn Sie datengebunden sind und eine BindingSource verwenden - Sie können die Ereignisse CurrentChanged, CurrentItemChanged Ihrer BindingSource erfassen, dann brauchen Sie keine zusätzliche IsChanged-Eigenschaft auf Ihrem B.O. .., könnte auch die zugrunde liegende Datenquelle auch geändert anzeigen - zum Beispiel, wenn Sie BindingSource an eine Datentabelle gebunden haben, würde die Zeile Ihnen ein modifiziertes Flag geben.

1

Sie können den ausgewählten Zellenwert wie dieser

yourDGV.CurrentCell.Value; 

erhalten, wenn Sie den Wert in Form eines String nur toString wie diese

yourDGV.CurrentCell.Value.toString(); 

sollte es verwenden wollen

Verwandte Themen