korzystam z dgv i chce usunac z bazy sql severa rekord. najpierw usuwam go z lokalnej bazy korzytajac z binding source oraz RemoveAt(index). tylko ze po edycji bazy(dodanie i usuniecie rekordów z sql servera) indeksy z kolumny w bazie nie pokrywaja sie z tym w datagrid i usuwane bede wczesniejsze rekordy. jak rozwiazac ten problem
Indeksy w sensie numeru wiersza w datagrid? A co z kluczem glownym?
ok, wiec pobrałem juz indeks z datagrida tak by usunac wedlug niego odpowiedni rekord z bazy danych, ale pojawiaja sie niestety problemy. niby wiersze sa dobrze indeksowane ale wyskakuje błąd przy usuwaniu dowolnego rekordu:
Naruszenie współbieżności: element DeleteCommand dotyczy następującej liczby rekordów: 0 (oczekiwana liczba rekordów: 1). -> nie wiem czemu nie widzi rekordu
przy usuwaniu ostatniego rekordu(również gdy usuwam go tylko lokalnie):
Indeks jest spoza zakresu. Musi mieć wartość nieujemną i mniejszą niż rozmiar kolekcji.
Nazwa parametru: index
kod:
private void bt_usun_Click(object sender, EventArgs e)
{
adapter.DeleteCommand = polaczenie.CreateCommand();
bs.RemoveCurrent();
DbParameter id = adapter.DeleteCommand.CreateParameter();
id.Direction = ParameterDirection.Input;
id.ParameterName = "id";
id.Value = (int)dataGridView1.SelectedCells[0].Value;
adapter.DeleteCommand.Parameters.Add(id);
adapter.DeleteCommand.CommandText = "delete from employees where employeeid = @id";
adapter.Update(lokalnaBD, "produkty");
}
na rekordach nie ma oczywiście żadnych constrainów.
Ale zes sie nakombinowal ;)
SqlCommand command = new SqlCommand("delete from employees where employeeid = @id", polaczenie);
command.Parameters["@id"].Value = (int)dataGridView1.SelectedCells[0].Value; //wypadaloby sprawdzic czy istnieja wybrane wiersze i czy wartosc jest intem.
command.ExecuteNonQuery();
//odswiez widok
Pisane z palca, ale to powinno wystarczyc do szczescia ;)
okazuje się że jedynym problemem był wiersz: bs.RemoveCurrent(), a konkretnie wystarczyło go przenieść za deklarację parametru i wtedy wszystko działa.
Żeby nie zaczynac nowego tematu: chcę teraz pod button podpiąć możliwość anulowania usunięcia wiersza z lokalnej tabeli - tak żeby po naciśnięciu znów był on widoczny w datagridview. jak to najprościej zrobić. prubowałem juz róznych właściwości dla dgv ale żadna nic nie daje.
Możesz to zrobić poprzez wyświetlenie odpowiedniego komunikatu przy naciśnięciu przycisku Usuń.
Do zdarzenia dodajesz coś w stylu:
if(MessageBox.Show("Czy na pewno chcesz usunąć wiersz?", "UWAGA", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No)
return
Nie wiem czy o to chodziło...
no teoretycznie też tak mozna zabezpieczyc program,
mnie chodzi o zdarzenie które już po usunięciu danych z lokalnej i żródłowej bazy przywróci je do lokalnej bazy - by z powrotem były widoczne w dgv.
Jak usuniesz z bazy no to musisz z powrotem dodac, zeby tam bylo :P
W zwiazku z czym albo zapamietuj i przywracaj albo nie usuwaj w ogole i tylko zapamietuj te, ktore maja sie nie pokazywac (a na zakonczenie usuwasz wszystkie zaznaczone do usuniecia).
Zreszta jak usuniesz z DataSource to niekoniecznie zmiany leca od razu do bazy danych. Mozesz sobie usuwac i dodawac w DataTable podpietym jak DataSource i na koniec wyslac zmiany jakims adapterem.