2008-10-07 9 views
5

Ich verwende VS 2008/C# und binde eine lokale Liste von Hilfsklassen als DataSource für ein DataGridView-Steuerelement. Der Aufruf der Remove() -Methode auf meiner Liste von Hilfsklassen löst das CellFormatting-Ereignis der DataGridView aus, das Sinn macht (ein bisschen).Entfernen der letzten Zeile Databound DataGridView C#

Wenn Sie das DataBoundItem der letzten Zeile im Raster entfernen (solange das Raster mehr als eine Zeile enthält), wird die Zeilenauflistung der DataGridView nicht aktualisiert, bevor dieses Ereignis ausgelöst wird. Daher erhalte ich im CellFormatting-Ereignishandler eine IndexOutOfRangeException, da die Zeilenauflistung zu groß ist.

Ich habe versucht, die Zeile mithilfe der DataGridView.Rows.Remove() -Methode zu entfernen und die Bindung mithilfe einer BindingSource zu verwenden, anstatt die Liste direkt als Datenquelle zu binden.

Ich fand ein paar Verweise auf dieses Vorkommen über Google, aber die Antworten waren entweder nicht verfügbar oder es wurde eine Delete() - Methode für die DataGridView- oder die DataGridView.Rows-Sammlung angegeben, von denen es derzeit keine gibt.

Die Sortierung scheint auch nicht das Problem zu sein, da die Ausführung/Sortierung nicht zum selben Ergebnis führt.

Die einzige Ausnahme zu der "letzten Zeile", die ein Problem für das Entfernen ist, ist, wenn das DataGridView nur eine Zeile enthält - in diesem Fall funktioniert alles gut.

Antwort

10

Ich hatte dieses Problem in der Vergangenheit, und wenn ich mich richtig erinnere, gibt es eines von zwei Dingen, die Sie tun können. Wenn Sie den Datensatz aus der Auflistung entfernen, legen Sie die Datenquelleneigenschaft für Ihre Datagridview auf null fest, und binden Sie sie anschließend erneut an Ihre Liste. Das sollte den Trick machen.

Alternativ können Sie das DataError-Ereignis in Ihrer dataGridview behandeln, und in der Methode können Sie e.Cancel = true angeben, um die Ausnahme zu unterdrücken, oder Sie können sie dort weiter behandeln.

+0

Einstellung auf Null und zurück zur Sammlung gearbeitet. – Pat

+0

Markieren Sie dies als die freigestellte Antwort auf eine verrückte alte Frage. :-) Ich glaube, ich habe den Vorschlag damals erfolglos ausprobiert. Aber es scheint für andere zu funktionieren. –

0

Es ist ein sehr altes Problem, aber ich löste es, indem ich das row-remove-Ereignis wie folgt behandelte.

private void dgViewItems_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) 
{ 
    dataAdapter.Update((DataTable)bindingSource1.DataSource); 
} 

und es hat funktioniert.

0

Ich weiß, das ist eine alte Frage, aber ich fand eine andere Lösung, die für mich funktionierte. Bevor Sie das Element aus der Datenquelle/Bindungsquelle löschen, müssen Sie die Ereignisbehandlungsroutine für das CellFormatting-Ereignis trennen und anschließend erneut verkabeln. Zum Beispiel:

RemoveHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
Me.BindingSource1.Remove(item) 
AddHandler DataGridView1.CellFormatting, AddressOf DataGridView1_CellFormatting 
0

Ich habe das gleiche Problem. Ich habe eine Lösung gefunden. Versuchen Sie, alle Zeilen in die nächste Zeile zu kopieren. Entfernen Sie dann die erste Zeile von dgv. Ein Beispielcode für diese:

If Dgv.CurrentCell.RowIndex + 1 = Dgv.Rows.Count Then 
     For m = Dgv.Rows.Count - 2 To 0 Step -1 
      Dgv.Rows(m + 1).Cells(0).Value = Dgv.Rows(m).Cells(0).Value 
      Dgv.Rows(m + 1).Cells(1).Value = Dgv.Rows(m).Cells(1).Value 
      Dgv.Rows(m + 1).Cells(2).Value = Dgv.Rows(m).Cells(2).Value 
      Dgv.Rows(m + 1).Cells(3).Value = Dgv.Rows(m).Cells(3).Value 

     Next 
     Dgv.Rows.RemoveAt(0) 
     Exit Sub 
    End If 
    Dgv.Rows.Remove(Dgv.CurrentRow) 

versuchen Sie es :)

2

die letzte Zeile auszublenden, ändern Sie die AllowUserToAddRows Eigenschaft des Datagridview wie folgt:

myDataGridView1.AllowUserToAddRows = false 
1

Zuerst deaktivieren nur die Eigenschaft, Datagridview als

dataGridView1.AllowUserToAddRows = false; 

und entfernen Sie dann nur die letzten Zeilen, wie viele Zeilen, wie Sie E wollen ither mit for-Schleife, indem -1 beibehalten wird.

dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1); 
dataGridView1.Rows.RemoveAt(dataGridView1.Rows.Count - 1);