Binding source a jeho použití

V minulém příspěvku jsem se věnoval propojení objektu BindingSource s LINQ to SQL. Jelikož z několika příspěvků, týkajících se bindování dat na zobrazovací prvky vyplívá, že ne všichni jsou s objektem BindingSource plně srozuměni, rád bych napsal krátký návod, jak jej použít.

Co je BindingSource

Z pohledu 10000 stop si můžeme představit BindingSource jako komponentu, která poskytuje rozhraní mezi daty a vázanými prvky uživatelského rozhraní. Požití je tedy takové, že komponenta přebírá jako svůj datový zdroj data ze servisní, nebo datové vrtstvy a na tuto komponentu jsou poté navázány zobrazovací prvky. Tím, že vložíme mezi data a zobrazovací prvky komponentu BindingSource, umožní nám to vložit zároveň s tím i služby (události, metody a vlastnosti), které nemusí poskytovat data samotná.

Pokud se sneseme o něco níže a podíváme se na komponentu zblízka, zjistíme, že BindingSource obaluje třídu CurrencyManager a přidává několik dalších "vychytávek", které nám umožňují snažší práci s uživatelským rozhraním. Ti, kdož si pamatují práci s CurrencyManager případně třídou BindingManagerBase ve verzích .net frameworku 1.x, uvidí poměrně velký krok kupředu a ulehčení práce.

Co vývojáři přinese použití BindingSource

Určitě si každý nyní řekne, proč vlastně takovou komponentu používat, vždyť bindovat uživatelské prvky na data mohu i tak, proč tedy používat nějaký další prvek, který mi vše může znepřehlednit. Opak je spíše pravdou, právě díky tomu, že mezi data a UI vložíme tuto abstraktní vrstvu, získáme několik výhod, které nemusí být na první pohled patrné.

IBindingList

Prvním přínosem je zpřístupnění interface IBindingList i pro seznamy, které toto rozhraní nepodporují. Pokud se podíváte na toto rozhraní, zjistíte, že poskytuje hned několik metod a vlastností, které můžete využít při bindování třeba na DataGridView, jak bylo zmíněno v předchozím příspěvku.

Jenže zpřístupněním samotného rozhraní vše nekončí, naopak, máme k dispozici ještě něco více a to ve spojistosti právě s rozhraním IBindingList. Je to metoda AddingNew, která se vyvolá v okamžiku, kdy je zažádáno o přidání nového objektu do seznamu. Přihlášení k odběru k této události využijeme třeba v případě, kdy objekty tvoříme přes nějakou factory třídu a chceme mít tak vytváření nových instancí plně pod kontrolou.

Zabalený CurrencyManager

Jak jsem se již zmínil výše, BindingSource nám obaluje dříve používanou třídu CurrencyManager a tím také vyvolávání událostí CurrentChanged a PositionChanged. Nyní se tak k těmto událostem dostaneme přehledněji a z jednoho místa, ale nejedná se jen o zmíněné události ale též metody a vlastnosti CurrencyManagera.

Mezi ty, které bylo nutné používat patřily metody ResumeBinding a SuspendBinding, jenže ty měly efekt pouze na tzv. Simple binding, tedy bindování na jednoduché prvky (např. TextBox). Použitím komponenty BindingSource se vše zjednodušilo a nastavením vlastnosti RaiseListChangedEvents na hodnotu false se zruší bindování jak na jednoduché prvky, tak i na prvky komplexní, jako je třeba DataGridView.

Pro ty, kteří rádi vidí pod pokličku uvedu, že k přerušení bindování dojde z toho důvodu, že přestane být vyvolávána metoda ListChanged.

Tváří se typově

Lépe to vystihnout nedokáži, ale lepší, než kdyby se tvářil kysele, že? Co si pod tím pojmem představit? Pokud chcete v design time navrhnout vzhled a rozmístění ovládacích prvků, potřebujete vědět, na co mají být prvky navázány - jakého typu bude daný objekt. Obdobně pak třeba u DataGridView, když chcete bindovat sloupečky. A právě proto je tu BindingSource, aby vám ulehčil vaši činnost. Stačí jako datový zdroj uvést

bindingSource.DataSource = typeof(MujObjekt);

a rázem vám jsou zpřístupněny vlastnosti objektu MujObjekt. Tudíž BindingSource se tváří, jako by byl instancí tohoto objektu.

Zjednodušuje binding

neříkejte mi, že jsem to neříkal celou dobu. Dostávám se k poslednímu bodu, že se vám to zdá podivné, když vše předchozí uvedené zjednodušilo binding už dostatečně?  Jenže, kdo by nechtěl ještě víc.

Určitě znáte ten klasický scénář, kdy si vrátíte objekty s daty z nějaké služby a ty přímo nabindujete na zobrazovací prvky. Poté však zjistíte, že musíte napsat spoustu obslušného kódu okolo, protože tyto objekty a bindování na ně není stálé. A tak vám samotné použití designeru nestačí, musíte se vrhnout do kódu a přepisovat již jednou vytvořené.

Jenže nyní již nemusíte, víte, že existuje komponenta BindingSource, která je vám nápomocná při zobrazování a editaci dat a tak použijete ji jako datový zdroj k bindování.

V jednoduchosti je síla

Právě v jednoduchosti a snadnosti použití komponenty BindingSource je síla, kterou můžete využít ve svůj prospěch. Není snad nic lepšího pro vývojáře, než mít snadno čitelný a udržovatelný kód a k tomu právě BindingSource přispívá. Snad vám k tomu pomohl i tento článek.

27.05.2008 11:33 - Jarda Jirava
Počet komentářů: 0

LINQ to SQL a BindingSource

Je to jen pár měsíců, co je na světě .net framework verze 3.5 a s ním spoustu cukrátek, které potěší nejednoho vývojáře na .netím frameworku. Někteří z nás sice vzhlížejí ještě kousek dál - třeba k ADO.NET Entity Frameworku, ale pro ty, kteřím stačí současný stav a pohrávají si s LINQ to SQL, tu mám jeden tip.

21.04.2008 17:37 - Jarda Jirava
Počet komentářů: 0

IClientApp.AddAward(JardaJirava MVP)

Interface pro tvorbu klientských aplikací byl vytvořen, předpis metody definován. Stačí tedy jen vytvořit správnou instanci a předat parametry, to se 1.dubna 2008 stalo a po prvotním špatném volání a vyhození Exception jsem dostal tento výsledek:

08.04.2008 13:00 - Jarda Jirava
Počet komentářů: 1

III. neformální setkání .net builder.cz

Včera v podvečer se uskutečnilo již třetí setkání přispěvatelů konference o .net technologii provozované na serveru builder.cz. Tentokrát jsme se všichni sešli v příjemném prostředí restaurace Bílá vrána, kterou doporučil jeden z účastníků Martin Vobr, díky.

29.02.2008 09:43 - Jarda Jirava
Počet komentářů: 0

MaximumWidth pro DataGridViewColumn

Otázky a odpovědi. Při hledání vhodného řešení si občas člověk užije a prověří svoje schopnosti. Ne vždy je odpovědí optimální řešení, ale jak nás učili na škole, lepší vybírat mezi suboptimálním řešením, než žádným. A právě jedna taková otázka se objevila na builderu, týkala se maximální šířky sloupečku v DataGridView. Jelikož jsem se při odpovědi maličko více rozepsal, rozhodl jsem se odpověď uveřejnit jako příspěvek.

22.01.2008 08:05 - Jarda Jirava
Počet komentářů: 0

Jak na DesignMode a designer

Ač to může být pro zkušené vývojáře obehraná písnička, ještě stále se najde spousta nováčků, nebo i pokročilejších vývojářů, kteří mají problém s určením, kdy se jejich komponenta, nebo formulář nachází ve vývojovém prostředí designeru.

04.01.2008 20:14 - Jarda Jirava
Počet komentářů: 0

Přidání obsahu do buňky v DataGridView

Uběhlo již mnoho času od chvíle, kdy jsem se naposledy věnoval některému z příspěvků na fóru o .net na serveru builder.cz. Nyní se však na tomto fóru objevilo několik začátečníků, kteří se nespokojí jen s ukázáním cesty, ale rádi by viděli i kus kódu, který jim vydláždí cestu k vytouženému cíly.

01.01.2008 22:59 - Jarda Jirava
Počet komentářů: 5

II. neformální setkání .net builder.cz

Ve čtvrtek se konalo již druhé neformální setkání přispěvatelů konference .net na serveru builder.cz, které se mi podařilo uspořádat. Oproti prvotnímu setkání jsme se tentokrát setkali v celkovém počtu 9 vývojářů a to na známém místě v prostředí restaurace Studna.

04.11.2007 12:36 - Jarda Jirava
Počet komentářů: 0

Ocenění / Zkoušky

Microsoft Certified Professional Developer - Windows Developer Složil jsem zkoušku pro získání certifikátu MCPD pro .net 2.0
Microsoft Certified Application Developer Také jsem složil zkoušky pro získání certifikátu MCAD pro .net 1.x