2016-05-13 13 views
1

Ich habe ein DataGridView und eine Reihe von Steuerelementen (zum Bearbeiten), die alle an eine BindingSource gebunden sind. Alles funktioniert wie erwartet - wenn Sie auf einen Eintrag in der DataGridView klicken, wird das ausgewählte Element angezeigt und bearbeitet. Ich möchte, dass neu erstellte Objekte automatisch in DataGridView ausgewählt werden, wobei die Bearbeitungssteuerelemente auch an die neu erstellten Daten gebunden sind. Dazu habe ich einen Handler für DataGridView.RowsAdded umgesetzt, etwa so:DataGridView programmatische Auswahl eines neuen Elements aktualisiert andere datengebundene Steuerelemente nicht

private void dataGridViewBeasts_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) 
{ 
    // Force newly created items to be selected 
    dataGridViewBeasts.Rows[e.RowIndex].Selected = true; 
} 

Diese oberflächlich arbeitet, mit den neu erstellten Elemente in der Datagridview ausgewählt werden. Die Bearbeitungssteuerelemente verweisen jedoch weiterhin auf das Element, das vor dem Erstellen eines neuen Elements ausgewählt wurde. Wie kann ich sie ermutigen, auf den neu gewählten Gegenstand zu zeigen?

+0

Wie Sie das andere Ereignis-Code haben? Haben Sie das angeklickte Ereignis oder das selectionchanged-Ereignis ausgewählt? Letzteres wird auch im zweiten Fall funktionieren. – TaW

+0

Ich bin mir nicht sicher, welches andere Ereignis du meinst. Die neuen Elemente werden erstellt, indem dem gebundenen Entity Framework DbContext ein Element hinzugefügt wird, wenn das überhaupt hilft? Vielen Dank für Ihre Antwort auf jeden Fall :) –

+0

Sie haben geschrieben: _clicking auf einen Eintrag in der DataGridView verursacht .._ Das klingt, als ob Sie das Click oder MouseClick-Ereignis codiert haben. Hast du? – TaW

Antwort

1

Annahme:

Sie fügen eine neue Zeile in die darunter liegenden DataSource, nicht direkt auf die DataGridView.

Ergebnis:

Das Problem, das Sie hier begegnen, ist, dass auf alle Ihre Bearbeitung steuert die Bindung an die DataGridView.CurrentRow gebundenen Element gebunden sind - das ist eine get einzige Eigenschaft ist und ist durch einen Pfeil in der angegebenen Zeilenkopfzeile.

Das Ändern der CurrentRow wird in Selecting a row in a DataGridView and having the arrow on the row header follow diskutiert.

So sollte es so einfach sein, wie die CurrentCell zu Cell[0] der neu hinzugefügten Zeile zu setzen. Außer ...

Die Einstellung CurrentCell im Ereignis DataGridView.RowsAdded schlägt fehl. Konzeptionell funktioniert es - die neue Zeile wird CurrentRow. Aber nachdem das Ereignis beendet ist, zeigt das Debugging an, dass der CurrentRow sofort auf seinen vorherigen Wert zurückgesetzt wird. Setzen Sie stattdessen den Code CurrentCell nach Ihrem Code, um die neue Zeile hinzuzufügen. Zum Beispiel, wenn BindingSource.DataSource:

Ist ein DataTable:

DataTable dt = theBindingSource.DataSource as DataTable; 
dt.Rows.Add("New Row", "9000"); 

dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0]; 

Oder ein List<Example>:

List<Example> list = theBindingSource.DataSource as List<Example>; 
list.Add(new Example() { Foo = "New Row", Bar = "9000" }); 

// Reset the bindings. 
dataGridView1.DataSource = null; 
dataGridView1.DataSource = theBindingSource; 

dataGridView1.CurrentCell = dataGridView1.Rows[dataGridView1.Rows.Count - 1].Cells[0]; 
+0

Funktioniert wie ein Charme. Vielen Dank! –