Sdílení dat mezi dvěma formuláři   zodpovězená otázka

SQL, WinForms, Databáze

Zdravím,

potřeboval bych poradit, jak byste vyřešili (řešili) následující situaci. Mám dva formuláře, přičemž v prvním načtu data z databáze (pomocí SqlCeDataAdapteru) a uložím je do DataTable. Tu mám ve statické třídě jako statickou globální proměnnou, abych mohl data mezi formuláři sdílet (můj návrh, pokud byste to udělali jinak, napište). Jde mi o to, jak udělat, aby když do databáze něco přidám v druhém formuláři, ten zavřu, aby se mi data znovu načetla v tom prvním (resp. refreshovala tak, aby byla aktuální).

Je možné využít nějakou událost?

Předem děkuji za odpovědi.

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

Tu mám ve statické třídě jako statickou globální proměnnou

Nejhorší možné řešení, které je v konfliktu s těmi nejzákladnějšími myšlenkami OOP.

Předávejte to do formulářů např. v konstruktoru a pokud potřebujete okamžitě reagovat na změny (aktualizace dat v UI), použijte k tomu určené události příslušného objektu, na které se napojíte.

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

Pan Linhart má samozřejmě pravdu. Obecně doporučuju se podívat na Observer pattern, který tohle řeší. Data z databáze by v nějaké třídě implementovaly rozhraní IObservable (nebo nějaké Vaše vlastní rozhraní) a ostatní přihlášení "posluchači" pak budou při zavolání metody po updatu dat automaticky uvědoměni o změně.

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

Zbytečně komplikované. Před vytvořením nějakého vlastního bastlu je třeba se podívat, jestli požadovanou funkčnost není možné realizovat s již existujícími objekty, v tomto případě SqlCeDataAdapter. Ten již má použitelnou událost RowUpdated, ta ale upozorňuje pouze na UPDATE, nikoliv INSERT nebo DELETE. DataTable má všechny potřebné události.

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

Hmmm, napadá mě, že události bych mohl použít k aktualizaci těch dat atp., ale pořád nechápu, jakým způsobem můžu tedy pracovat dejme tomu s objektem DataTable ve Form1 a se stejným ve Form2, kde ho nějak upravím (uložím do něj nová data třeba) a ty změny se mi projeví pak po uzavření formuláře Form2 i v tom původním...

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

No tak, že předáte do obou formulářů stejnou instanci DataTable. Pokud ani ted nevíte, která bije, nesnažte se udělat něco dalšího, dokud nebude znát základy a práci s daty v ADO.NET.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Oukej, takže bych mohl například v konstruktoru Form2 udělat referenční proměnnou a pomocí té ta data přenášet?

public Form2(ref DataSet dataset)
{
   
}

// Někde ve Form1
DataSet dataset = new DataSet();

Form2 form2 = new Form2(ref dataset);
form2.ShowDialog();
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano. A to ref tam není potřeba.

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

Dobře, děkuji ;)

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