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...:-)
|