Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: LINQ to SQL - vymázání řádku z DataGridView

Aktivity
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:23.11.2013 18:50

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 Hartinger
Vlastník
Avatar
Odpovídá na Petr Nymsa
David Hartinger:23.11.2013 20:12

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
You are the greatest project you will ever work on.
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:23.11.2013 20:15

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 Hartinger
Vlastník
Avatar
Odpovídá na Petr Nymsa
David Hartinger:23.11.2013 20:19

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
You are the greatest project you will ever work on.
Avatar
Petr Nymsa
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:23.11.2013 20:20

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
Tvůrce
Avatar
Odpovídá na David Hartinger
Petr Nymsa:23.11.2013 20:56

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
Tvůrce
Avatar
Odpovídá na Petr Nymsa
Petr Nymsa:23.11.2013 21:02

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.