DataGridView - ukládání dat do DB   zodpovězená otázka

VB.NET

Zdravím.

Mám desktopovou aplikaci v VBNET 2005 EE s .NET Frameworkem 2.0.

Na formuláři mám komponentu DataGridView, která je přes objekt BindingSource napojena na tabulku v DataSetu. DataSet plním z DB v MSSQL2005 EE. Chtěl jsem dosáhnout takové funkčnosti, aby se při každé změně řádkové pozice v mřížce ověřilo, zda nebyla nějaká hodnota změněna a pakliže ano, aby se provedené změny promítly do DataSetu i podkladové DB. Obdobně jako se chová např. SQL Management Studio. Použil jsem proto následující kód:

  Private Sub UlozZmeny(ByRef da As SqlDataAdapter, ByVal sTable As String)
    'Procedura, která promítne změny provedené v mřížkách do databáze, volá se při změně aktuálního řádku v mřížce
    BindingContext(ds.Tables(sTable)).EndCurrentEdit() 'Ukončení editace
    Dim dt As DataTable = ds.Tables(sTable).GetChanges 'Změněné řádky
    If dt IsNot Nothing Then
      da.Update(dt) 'Update databáze
      ds.Tables(sTable).AcceptChanges() 'Potvrzení změn v datasetu
    End If
  End Sub

který se volá v události BindingSource.PositionChanged.

Vše chodí jak má, akorát po zadání hodnoty do buňky v mřížce a potvrzení klávesou Enter nebo šipkou dolu a provedení uvedené procedury se mi označí jako aktivní buňka v prvním sloupci následujícího řádku mřížky, místo očekávané následující buňky ve sloupci, kde jsem hodnotu zadal. Zvláštní je, že když za této situace zadám další hodnotu a potvrdím Enterem, tak se uloží do správného sloupce i buňky, akorát označení aktivní buňky je zase v prvním sloupci, což je velmi matoucí pro obsluhu. Pokusně jsme odstranil volání metody AcceptChanges a problém ustal. (Samozřemě, že pak jsem měl nekonsistentní data) Napadá Vás někoho jak tuto chybu obejít? Všechny pokusy o zapamatování si původní pozice aktivní buňky a její obnovení po uložení změn metodou dgvDet.Rows(cR).Cells(cC).Selected = True končí na chybu "Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function".

Díky za jakýkoli nápad, strávil jsem s tím zase jeden příjemný večer...:-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Opravdu nikdo?

Možná se pletu, ale připadá mi to jako školní příklad na triviální databázovou úlohu - editace jedbé DB tabulky v mřížce s uložením dat do podkladové DB. Funguje prosím někomu metoda DataTable.AcceptChanges aniž by navázaná komponenta DataGridView prováděla podobné skopičiny?

Dík za odpověď, už jsem z toho skoro šedivý...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkus se inspirovat z tohoto příkladu:

http://www.codeproject.com/KB/database/V...

...

Snad to pomůže i proti šedivění... :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdar, díky za tip. Bohužel popsaný příklad sice funguje, ale používá designerem generované komponenty Dataset a TableAdapter, kterým se vyhýbám, takže to použít nemůžu. Čili šedivím dál...:-(

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak po několika dnech bádání jsem dospěl k tomuto:

Když místo prostého

ds.Tables(sTable).AcceptChanges()

napíšu

For Each dr As DataRow In ds.Tables(sTable).Select("", "",(DataViewRowState.CurrentRows And Not DataViewRowState.Unchanged) Or DataViewRowState.Deleted)
  dr.AcceptChanges()
Next

a vlastní proceduru UlozZmeny volám z události BindingSource.ListChanged namísto BindingSource.PositionChanged

tak běhá vše jak má.

Zatím.

Praxe ukáže, zda je to funkční za všech možných okolností

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback