Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Zdravím, začal jsem s MSSQL a zasekl jsem se asi úplně na triviálním příkladu. Zatím si jen tak hraju a chtěl jsem následující. Uživatel z DataGridView vymaže celý řádek, tudíž chci aby se to promítlo do databáze. Idea byla taková, že vím jaký řádek maže (přes event UserRowDelete) a přes vlastnost DataBoundItem vytáhnu item (resp. entitu třídy). V kolekci entit vymažu a potvrdím SubmitChanges() přes DataKontext.

Bohužel DataBoundItem je vždy null. Takže hádám, že to funguje trochu jinak než si představuju. Poté jsem tedy na to chtěl jít následovně. Z řádku si vytáhnu ID, proiteruju pomocí LINQ kolekci entit, najdu shodu, vymažu a potvrdím změnu.

Myslel jsem si že vytáhnout hodnotu ze sloupce ID lze následovně

int id = int.Parse(e.Row.Cells["id"].Value.ToString());

což nelze. Po trošce hledání jsem zjistil, že každá Cell má OwningColumn, ze kterého to už jde vyčíst. Takže bych musel proiteorvat každou buňku, zjistit jestli OwningColumn není náhodou ID a poté už získat hodnotu.

jasně že můžu dát napevno index 0, jelikož vím že sloupec ID je na indexu 0. Jenže co když si to přeházím ? Jak tedy na to ? :) Díky

Odpovědět 23.11.2013 18:50
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:

Funguje to přesně jak říkáš. Asi máš jen nastavené označování na sloupce místo na řádky, proto v tom máš null. Psal jsem o DataGridView článek, koukni na něj - http://www.itnetwork.cz/…indows-forms.

Nahoru Odpovědět 23.11.2013 20:12
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

Teď jsme zjistil ještě jednu věc. Ono se nemusí ani ta událost odchytávat a maže se to samo i v DB.

Ale následně je zde problém, resp. "vychytávka"(?) že závislé řádky nejdou smazat.

Tabulka Client
ID
Name

Tabulka Contracts
ID
ID_Client
...

A pokud chci smaazt Clienta, který má některé Contracty, aplikace spadne. Jak moc vysoká tedy je "abstrakce" DataContext, tedy LINQ to SQL ?

Nahoru Odpovědět 23.11.2013 20:15
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:

To bude spíše tím, že fyzicky existují cizí klíče, které tomu brání. To musíš nastavit při zakládání DB, jde tam nastavit něco jako cascade, aby to smazalo, asi tam máš restrict. Zkus to schválně smazat dotazem, IMHO to nepůjde stejně :P

Editováno 23.11.2013 20:19
Nahoru Odpovědět 23.11.2013 20:19
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

No to bude asi tím, mám vytvořené relace mezi tabulkami. Grrr bude to asi na dýl se s tím naučit :D

Nahoru Odpovědět 23.11.2013 20:20
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na David Čápka
Petr Nymsa:

Ještě jedna technická. DataGridView a její sloupce nemám nastavené v Design ale přiřazuju až za běhu DataSource. Měl jsem za to že když mám v DB sloupec id, název Cell bude také id. Což je správně. Ale když se to snažím zjistit v metodě, která je callbackem event UserRowDelete tak to spadne. Přitom při procházení přes Debug ty Cells jsou správně, tj je tam Cell s názvem id.
nevíš kde by mohla být chybka ?

Nahoru Odpovědět 23.11.2013 20:56
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Petr Nymsa
Petr Nymsa:

Tak jsem na to přišel. Je to trochu divný. Při eventu UserRowDeleted je ten řádek smazaný, má index -1 ale přitom v Row (tedy objektu), veškeré Cells jsou vyplněné včetně jmen. Nechápu tedy že to spadne. Každopádně při eventu UserRowDeleting se to chová tak jak se očekává.

Nahoru Odpovědět 23.11.2013 21:02
Pokrok nezastavíš, neusni a jdi s ním vpřed
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.