Jarda Jirava

Vývojář a architekt řešení postavených na technologii .net framework. Zabývám se jak vývojem webových aplikací za pomoci asp.net, tak také desktopových aplikací winform. Při návrhu řešení a samotném vývoji pak využívám dlouholetých zkušeností se zpracováním obchodní logiky a pravidel aplikací získaných z vývoje komerčních aplikací pro finanční a bankovní instituce.

Microsoft MVP

Microsoft MVP - Client App dev

Silverlight minesweeper

Get Microsoft Silverlight

Navrhi COOL design a vyhraj zkušební let po Evropě!

Poslední příspěvky

16
VII

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

Ozývají se opět hlasy, které touží po dalším, v pořadí již čtvrtém neformálním setkání přispěvatelů diskuzního fóra o .netu na serveru builder.cz.

Těmto hlasům velice rád vyhovím, i já se již těším, až uvidím známé a snad i neznámé tváře, které se zúčastní.

Jak jsem se minule dozvěděl, lepší je anoncovat toto setkání přímo na blogu, tudíž tak činím. Vaši účast tak prosím potvrďte v komentářích (nezapomeňte na email), případně přímo mě na email jarda @ tato doména.

A kdy se setkání může uskutečnit? Říkám si, že by bylo pěkné, každému nadělit malý dárek, a tak vyhovím přání a vyhlašuji následující termíny.

  • 4.8.2008 - pondělí
  • 6.8.2008 - středa

Setkání se uskuteční nejspíše na stejném místě jako minule, kde byla velice příjemná obsluha, dobré jídlo a v neposlední řadě i společnost. Předpokládaný začátek 18:30.

Potvrzení termínu a organizační záležitosti pak sdělím v úterý 29.7. do kdy také máte možnost se přihlásit.

Budu rád, pokud uvidím i tváře ještě neznámé, určitě se nemusíte bát přijít, budete vítáni. Těším se na viděnou.

Publikováno pod: builder.cz
10
VII

IQueryable do DataView

Prý nikde není k dispozici popis nebo dokonce kód pro vytvoření DataView z dotazu provedeného pomocí Linq to SQL. Tak jsem se jeden takový pokusil sestavit, byť by si určitě zasloužil ještě nějaké ty úpravy a vylepšení.

DataView ToDataView<T>(this IQueryable<T> query) where T: class

Tak toto je předpis dané extension metody, kterou je možné použít pro vytvoření DataView z dotazu. Celá metoda je velice jednoduchá a jistě ji pochopí každý, alespoń maličko zkušený vývojář. Pro ty ostatní jen malé připomenutí, jak celá metoda pracuje a provádí se převod. Nejdříve však samožná metoda.

using System.Data;
using System.Reflection;
using System.Collections;

public static class DataExtensions {
    public static DataView ToDataView<T>(this IQueryable<T> query) where T: class {
        DataTable dt = new DataTable();
        Type type = typeof(T);
        PropertyInfo[] pis = type.GetProperties();
        foreach (var item in pis) {
            if (!(typeof(ICollection).IsAssignableFrom(item.PropertyType))) {
                DataColumn dc = new DataColumn(item.Name, item.PropertyType);
                dt.Columns.Add(dc);
            }            
        }
        foreach (var item in query) {
            DataRow row = dt.NewRow();
            foreach (var pi in pis) {
                if (!(typeof(ICollection).IsAssignableFrom(pi.PropertyType))) {
                    row[pi.Name] = pi.GetValue(item, null);
                }
            }
            dt.Rows.Add(row);
        }
        return new DataView(dt);
    }
}

Nejdříve je třeba zajistit vytvoření odpovídajících sloupečků. To se provede iterováním přes všechny viditelné vlastnosti třídy s tím, že vynechávám ze seznamu kolekce (EntitySety). Pro jistotu jsem však použil jen rozhraní ICollection, tak aby byly vynechány případné dodatečně definované kolekce.

Následně se již vytvářejí řádky a pomoci Reflection se plní jednotlivé řádky hodnotamy z dotazu.

Posledním krokem je poté již jen samotné vrácení DataView na výstupu z metody.

Publikováno pod: .net technology , code snippet , Linq
27
V

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.

Publikováno pod: .net technology
21
IV

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.

Přestože jsme na builderu nedokázali odhalit přesnou příčinu nefunkčnosti nad položenou otázkou LINQ + SQL + datagridview - uložení změn do db, snažil jsem se přijít na důvody, proč u tazatele daná kombinace nebyla funkční. Přiznám se hned na začátku, že jsem na rozumné vysvětlení nepřišel.

Jak propojit data na DataGridView

Vhodnou cestou jak napojit data z datového zdroje, v tomto případě tedy entit vytvořených pomocí LINQ to SQL, na DataGridView je použít objektu BindingSource. Při nastavení vlastnosti DataSource dojde k provázání dat se zobrazovacím prvkem a v případě, že máme povoleno na DataGridView přidávání, případně mazání řádků máme vše hotovo.

Skutečně nám tedy stačí, ve vhodnou chvíli volat událost SubmitChanges nad stejnou instancí DataContextu, jakou jsme naplnily BindingSource a o vše se postará interní logika. Není tak třeba registrovat se k žádným událostem - snad až na jedinou a tou je událost pro přidání nového záznamu AddingNew, a to jen v případě, že požadujeme mít nově přidaný objekt uživatelsky nainicializovaný.

Stejně tak není třeba notifikovat DataContext, lépe řečeno Table<TEntity> kolekci o nově přidaných objektech pomocí metody InsertOnSubmit, stejně tak jako psát kód navíc, abychom zjistili odstraňovanou položku z kolekce a tu mohli předat do metody DeleteOnSubmit.

Ukázka

Jak tedy může taková jednoduchá práce s DataGridView a jeho napojením na data vypadat? Následující část kódu je skutečné minimum:

// metoda pro získání dat z datového zdroje LINQ to SQL
private IEnumerable provideData() {
 var result = from data in _db.TestRows
  select data;
 return result;
}
// metoda pro uložení editovaných dat
private void saveClick(object sender, EventArgs e) {
  _db.SubmitChanges();
}

... // tam kde potrebujeme nahrát data a napojit je na zobrazovací prvek
bindingSource.DataSource = provideData();
...
Publikováno pod: .net technology , builder.cz , Linq
8
IV

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:

Congratulations! We are pleased to present you with the 2008 Microsoft® MVP Award! The MVP Award is our way to say thank you for promoting the spirit of community and improving people’s lives and the industry’s success every day. We appreciate your extraordinary efforts in Client App Dev technical communities during the past year.

Já k tomu mohu dodat jedno, díky patří také vám, že se ptáte a inspirujete mě tak k aktivitě a předávání těch něco málo znalostí a zkušeností, které mám s .net frameworkem.

Malé lákadlo

Vím. slibovat se příliš nevyplatí, ale rád bych zde prezentoval více právě v oblasti smart i rich client aplikací a něco málo již mám nachystáno ... takže buďte naladěni. Díky

Publikováno pod: .net technology
29
II

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.

Pokud bych se měl poohlédnout po průběhu setkání, tak se všichni bavili, dozvídali se nové věci a sdělovali si historky ze své každodenní práce, a nejen o práci se povídalo. Myslím, že ten, kdo přišel, udělal dobře a strávil příjemný večer se známými nicky a neokoukanými tvářemi. Počet vývojářů, kteří se přišli takto bavit se opět zvýšil a tentokrát nás bylo již deset, ano 10.

A jen tak na okraj, nebo spíše pod čáru. Ani Alt+Enter v Blendu bohužel Properties dialog nevyvolá, ach jo, a já se v tu chvíli tak zaradoval. Přinesl jsem si však i jiné rady, a také několik málo připomínek k setkání. Takže příště o něm budu informovat i tady na stránkách krátkým příspěvkem, aby se k vám dostala tato informace pomocí RSS čtečky. Jen přípomínka pro mě, nezapomenout pozvat i Jirku B.

Závěrem

Jak už jste se nejspíše dovtípili, setkání budou pokračovat, takže se s vámi budu těšit opět za nějaké čtyři měsíce.

Díky všem, kteří se zúčastnili, a příště třeba i s dalšími.

Publikováno pod: .net technology , builder.cz