2008-10-07 21 views
5

Używam VS 2008/C# i wiążę lokalną listę klas pomocniczych jako DataSource dla formantu DataGridView. Wywołanie metody Remove() na mojej liście klas pomocników powoduje wywołanie zdarzenia CellFormatting w DataGridView, co ma sens (nieco).Usuń ostatni wiersz Databound DataGridView C#

Podczas usuwania elementu DataBoundItem z ostatniego wiersza siatki (o ile kratka ma więcej niż jeden wiersz) kolekcja wierszy DataGridView nie jest aktualizowana przed wywołaniem tego zdarzenia. Tak więc w module obsługi zdarzeń CellFormatting otrzymuję IndexOutOfRangeException, ponieważ kolekcja Rows jest o jeden za duża.

Próbowałem już usunąć wiersz przy użyciu metody DataGridView.Rows.Remove() i powiązanie przy użyciu źródła BindingSource zamiast wiązania listy bezpośrednio jako źródło danych.

Znalazłem kilka odniesień do tego zdarzenia za pośrednictwem Google, ale odpowiedzi nie pojawiały się ani nie mówiły, że używają metody Delete() w kolekcji DataGridView lub DataGridView.Rows - żadna z nich nie istnieje.

Sortowanie również nie jest problemem, ponieważ wykonywanie/niewykonywanie sortowania prowadzi do tego samego wyniku.

Jedynym wyjątkiem od "ostatniego wiersza" będącego problemem do usunięcia jest sytuacja, w której DataGridView zawiera tylko jeden wiersz - w takim przypadku wszystko działa poprawnie.

Odpowiedz

10

Miałem ten problem w przeszłości i jeśli dobrze pamiętam, jest jedna z dwóch rzeczy, które możesz zrobić. Po usunięciu rekordu z kolekcji należy ustawić właściwość źródła danych w swoim widoku datagridview na wartość null, a następnie ponownie powiązać ją z listą. To powinno wystarczyć.

Alternatywnie można obsłużyć zdarzenie DataError w danych griviewview oraz w metodzie, którą można powiedzieć, e. Anuluj = prawda, aby pominąć wyjątek lub można się z nim dalej uporać.

+0

Ustawienie na zero i powrót do pobranej pracy. – Pat

+0

Zgłaszanie tego jako wyjątkowej odpowiedzi na szalone stare pytanie. :-) Wierzę, że próbowałem sugestii bez powodzenia w tym czasie. Wygląda jednak na to, że zadziałało dla innych. –

0

Jest to bardzo stary problem, ale rozwiązałem go, wykonując zdarzenie usuwania wiersza, jak następuje.

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

i zadziałało.

0

Wiem, że to stare pytanie, ale znalazłem inne rozwiązanie, które zadziałało dla mnie. Przed usunięciem elementu ze źródła danych/źródła powiązania należy odłączyć procedurę obsługi zdarzeń CellFormatting, a następnie ponownie podłączyć ją ponownie. Na przykład:

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

Mam ten sam problem. Znalazłem rozwiązanie. Spróbuj skopiować wszystkie wiersze do następnego rzędu. następnie usuń pierwszy wiersz dgv. Próbkę kodu do tego:

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) 

spróbować :)

2

Aby ukryć ostatni wiersz, zmienić właściwość AllowUserToAddRows DataGridView jak pokazano:

myDataGridView1.AllowUserToAddRows = false 
1

Pierwszy prostu wyłączyć właściwość Datagridview jak

dataGridView1.AllowUserToAddRows = false; 

a potem po prostu usunąć ostatni rzędów jak wiele wierszy, ile chcesz e ither z pętlą for przez utrzymywanie -1.

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