<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blog.vyvojar.cz/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Martin's world</title><link>http://blog.vyvojar.cz/mstr/default.aspx</link><description>zápisky z života (nejen) programátora</description><dc:language /><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>A opět do oblak …</title><link>http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx</link><pubDate>Sun, 08 Jan 2012 17:09:58 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:240904</guid><dc:creator>mstr</dc:creator><slash:comments>10</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/240904.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=240904</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=240904</wfw:comment><description>&lt;p&gt;Minulý rok v září uspořádal Microsoft konferenci &lt;a href="http://www.buildwindows.com/"&gt;BuildWindows&lt;/a&gt;. Zde mimo jiné zazněla i myšlenka, že budoucí vývoj pro Windows bude probíhat v HTML a javascriptu. Následovaly úvahy o budoucnosti .NETu, C#, jak budou aplikace vypadat apod. V tomto příspěvku nehodlám tyto úvahy rozvíjet – spíše ukážu, jak napsat aplikaci v HTML. I ta bude ale závislá na C# – web stránky jsou realizováný pomocí MVC technologie a celý backend generování kartiček je napsán v C#. Klientská část naproti tomu spoléhá zcela na javascript a vzhled stránkua je řešen pomocí CSS – samotná stránka tak obsahuje téměř čisté HTML.&lt;/p&gt;  &lt;p&gt;Před pár týdny jsem zde popsal řešení pro tisk kartiček – nejprve jsem se věnoval tomu, jak generovat vlastní PDF dokumentu, v druhém pokračování pak přesunu tohoto generování do cloudu. Oba díly naleznete zde:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;Víkendová rychlovka–tisk kartiček&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;Vzhůru do oblak!…..a stejně skončíme v přístavu&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;V tomto příspěvku popíši, jak vytvářet vlastní kartičky. Pomocí formuláře v prohlížeči se zadají jednotlivé hodnoty a ty se posléze odešlou na server a zpět dostanete PDF dokument. Podobných stránek jsou ale na webu mraky, takže zkusím odlišit se trochu funkčností – vytváření kartiček bude fungovat tak, že jen zadáte slovíčko a vyhledají se jak jeho překlad do češtiny, tak i přepis jeho výslovnosti a příklad použití. Tyto vyhledané údaje si budete moci upravit. Navíc se kartičky budou lokálně ukládat ve vašem prohlížeči, práci tedy budete moci kdykoliv přerušit&amp;#160; a opět v ní začít bez výslovného ukládání.&lt;/p&gt;  &lt;h1&gt;Jak získat údaje o slovíčku&lt;/h1&gt;  &lt;p&gt;Na webu je plno on line slovníků – já si vybral dva, &lt;a href="http://www.wordreference.com/encz/"&gt;WordReference EnCz Slovník&lt;/a&gt; a &lt;a href="http://oald8.oxfordlearnersdictionaries.com/"&gt;Oxford Advanced Learner’s Dictionary&lt;/a&gt;.&amp;#160; Pro jejich využíti je ale potřeba vyřešit tyto problémy:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;jak je volat a předat jím slovo, které hledáme &lt;/li&gt;    &lt;li&gt;jak je volat v rámci naší stránky – tedy cross-domain problém &lt;/li&gt;    &lt;li&gt;jak vyhledat potřebné údaje v tom, co nám stránky vratí &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb.png" width="269" height="210" /&gt;&lt;/a&gt;&amp;#160;&amp;#160;&amp;#160; &lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_3.png" width="299" height="212" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Volání&lt;/h3&gt;  &lt;p&gt;To je ta nejjednodušší část, v případě stránek Oxford slovníku stačí volat adresu&amp;#160; &lt;a href="http://oald8.oxfordlearnersdictionaries.com/dictionary/"&gt;http://oald8.oxfordlearnersdictionaries.com/dictionary/&lt;/a&gt; + dané slovo, v případě WordReference pak &lt;a href="http://www.wordreference.com/encz/"&gt;http://www.wordreference.com/encz/&lt;/a&gt;&amp;#160; + dané slovo;&lt;/p&gt;  &lt;h3&gt;Řešení Cross-domain omezení&lt;/h3&gt;  &lt;p&gt;Z jedné stránky není možné volat a získat obsah z jiné domény. Částečně je to řešeno tím, že lze volat a použít skript z jiné domény a pokud tedy dotyčný web umí vracet JSON data, není potřeba nic vymýšlet a lze použít přímo metod knihovny jQuery a Ajax volání. Nicméně&amp;#160; v našem případě žádná z vybraných stránek toto nepodporuje. Naštěstí i zde existuje řešení a to služba &lt;a href="http://developer.yahoo.com/yql/"&gt;YQL&lt;/a&gt; společnosti Yahoo a knihovna &lt;strong&gt;jquery.xdomainajax.js&lt;/strong&gt;. &lt;/p&gt;  &lt;p&gt;YQL je vlastně web služba, která získá obsah stránky, upraví jej tak, aby jej bylo možné zaslat jako skript (rozuměj ve formátu Json) a tak jej pošle volajícímu:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_4.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_4.png" width="735" height="84" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Knihovna &lt;strong&gt;xdomainajax&lt;/strong&gt; pak jen volání YQL obaluje tak, aby s ním bylo možné pracovat tak, jako s ajax voláním, takže skript, který slovník volá, vypadá stejně, jako pro normální ajax volání:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_5.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_5.png" width="566" height="213" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Vyhledání údajů&lt;/h3&gt;  &lt;p&gt;To je opět snadná část, využívám možností jQuery selektorů a vyhledám příslušné informace – vyhledávání pro oba zvolené slovníky lze najít v souboru &lt;strong&gt;search.js&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Ukládání v prohlížeči&lt;/h1&gt;  &lt;p&gt;Zde si opět usnadním práci pomocí existující knihovny &lt;strong&gt;jStorage&lt;/strong&gt;. Každou vytvořenou kartičku ukládám lokálně v prohlížeči.&amp;#160; Pro zobrazení je pak využíván formulář, který se případně, v případě že má uživatel zájem o PDF kartičky, odesílá na server. Využívá se zde tzv. nesouvislých indexů, které jsem popsal v příspěvku&amp;#160; &lt;a href="http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;ASP.NET MVC3–Binding příklad&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Možnosti exportu&lt;/h1&gt;  &lt;p&gt;Uživateli jsou nabízeny dvě možnosti, jak data dostat z prohlížeče “ven”. Buď si může data vyexportovat jako csv soubor a nebo je odeslat na server a získat PDF dokument. Řešení popsané v příspěvku &lt;a href="http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;Vzhůru do oblak&lt;/a&gt; bylo ještě rozšířeno o možnost přijímat data z formuláře.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h1&gt;Postup práce s aplikací&lt;/h1&gt;  &lt;p&gt;Prosím mějte na paměti, že aplikace je jen příklad, není to žádné mistrovské dílo a má spíše jen demonstrovat, že lze vyvinout v HTML aplikaci s komfortem desktopové aplikace. Základní rozložení je velmi jednoduché, aplikace má tři hlavní části – v horní se zadává hledané slovíčko, prostřední slouží pro náhled a editaci kartičky a dole je seznam kartiček:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_6.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_6.png" width="644" height="428" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Do horního políčka napíšete slovo, pro které chcete vytvořit kartičku a stisknete Enter – ikonky slovníků se změní na dobu, kdy se slovo vyhledává a signalizují tak probíhající činnost:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_7.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_7.png" width="637" height="96" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Jakmile jsou údaje nalezeny, vyplní se kartičky nalezenými údaji:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_8.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_8.png" width="521" height="169" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Je možné na kterýkoliv údaj kliknout a změnit jej:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_9.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_9.png" width="513" height="160" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Jakmile jste s kartičkou spokojeni, klikněte na tlačítko&lt;strong&gt; Ulož&lt;/strong&gt; a slovíčko se objeví v seznamu:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_10.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_10.png" width="672" height="118" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Kliknutím na kterékoliv slovíčko v seznamu se kartička vyplní jeho údaji a je možné kartičku aktualizovat či odstranit. &lt;/li&gt;    &lt;li&gt;Práci můžete kdykoliv přerušit a prohlížeč zavřít – všechna data jsou uložena automaticky a při opětovném zavolání stránky se tato obnoví i se seznamem. &lt;/li&gt;    &lt;li&gt;Výsledky své práce můžete uložit jak ve formátu CSV, tak si i nechat zaslat slovíčka v PDF dokumentu jako kartičky. &lt;/li&gt; &lt;/ul&gt;  &lt;h1&gt;Další zajímavosti a popis řešení&lt;/h1&gt;  &lt;p&gt;Pro správu skriptů a css soubory je použita knihovna &lt;strong&gt;Cassette&lt;/strong&gt;, kterou jsem ve stručnosti popsal v příspěvku &lt;a href="http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;ASP.NET– kazeta stále žije…...&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Každá část obrazovky má svůj vlastní css styl:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;inputBox.css&lt;/strong&gt; – styly pro vrchní vyhledávací box &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;card.css&lt;/strong&gt; – styly pro kartičky &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;cards.css&lt;/strong&gt; – styly pro seznam kartiček &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;basicLayout.css&lt;/em&gt;&lt;/strong&gt; – styly pro obecný vzhled stránky, tj. umístnění hlavičky, patičky apod. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;&lt;em&gt;site.css&lt;/em&gt;&lt;/strong&gt; – styl dodaný MS &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Všimněte si, že dva poslední styly nejsou přímo odkazovány ani ve view, ano v layoutu – je na ne odkaz v prvních třech souborech:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_11.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://mstr.xtreemhost.com/7181ce7da481_DFD/image_thumb_11.png" width="236" height="103" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Funkčnost na straně klienta je také rozdělena do několika javascriptů:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;buttonEvents.js&lt;/strong&gt; – co se provede po kliku na tlačítka a také co se má provést po načtení stránky a vytvoření nové kartičky v seznamu (createEntry) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;flashcard.js&lt;/strong&gt; – je zde metoda pro export do csv (exportData),&amp;#160; testování, zda podobná kartička již neexistuje (isCardAlreadyStored) , vypsání seznamu uložených kartiček (listCard), vyplnění kartičky (fillCard) a také seznam operací, které se provedou, pokud vyhledáváte nové slovíčko (submitEdit) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;search.js&lt;/strong&gt; – dvě metody pro vyhledávání ve zvolených slovnících, pro každý slovník jedna &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Jak pro skripty, tak i pro styly je použit &lt;strong&gt;bundle.txt&lt;/strong&gt; soubor, který upřesňuje řazení skriptu a stylů.&lt;/p&gt;  &lt;p&gt;Mimo tito skripty jsou použity tyto knihovny:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; – netřeba představovat &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.appelsiini.net/projects/jeditable"&gt;jQuery.editable.js&lt;/a&gt; – umožňuje editaci na stránce po kliknutí, použití je velmi jednoduché, &lt;/li&gt;    &lt;li&gt;&lt;a href="http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/"&gt;jQuery.xdomainajax.js&lt;/a&gt; – umožňuje snadné použíti YQL, volá se jako bežné Ajax volání &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.jstorage.info"&gt;jStorage.js&lt;/a&gt; – sjednocuje práci s lokálním uložištěm (HTML 5) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Aplikace funguje správně jen v posledních verzích prohlížečů Chrome, Opera, Firefox a asi i v IE (zde nefunguje export do csv). Cílem nebylo ani tak nabídnout naprostou funkčnost, spíše ukázat, jak udělat funkční aplikaci čistě v prohlížeči – i serverová podpora je omezena na generování PDF dokumentů, které nelze z asi pochopitelných důvodů generovat v prohlížeči (a nebo o tom zatím nevím).&lt;/p&gt;  &lt;h1&gt;Zdrojový kód&lt;/h1&gt;  &lt;p&gt;Aplikace běží na adrese &lt;a title="http://flashcard.apphb.com/" href="http://flashcard.apphb.com/"&gt;http://flashcard.apphb.com/ a&lt;/a&gt; zdrojové kódy jsou k prohlédnutí na &lt;a href="http://flashcardcreator.codeplex.com/SourceControl/list/changesets"&gt;CodePlex&lt;/a&gt;. Komentáře v kódu moc nejsou, snažil jsem se vše popsat v tomto článku.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx&amp;amp;;title=A+op%c4%9bt+do+oblak+%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx&amp;amp;;title=A+op%c4%9bt+do+oblak+%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx&amp;amp;;title=A+op%c4%9bt+do+oblak+%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx&amp;amp;title=A+op%c4%9bt+do+oblak+%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx&amp;amp;;title=A+op%c4%9bt+do+oblak+%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx&amp;amp;;title=A+op%c4%9bt+do+oblak+%e2%80%a6&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx&amp;amp;;subject=A+op%c4%9bt+do+oblak+%e2%80%a6" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/08/a-op-t-do-oblak.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=240904" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/Css+Html/default.aspx">Css Html</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>ASP.NET– kazeta stále žije…..</title><link>http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx</link><pubDate>Sat, 07 Jan 2012 15:35:05 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:240900</guid><dc:creator>mstr</dc:creator><slash:comments>10</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/240900.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=240900</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=240900</wfw:comment><description>&lt;p&gt;&lt;img style="margin:5px 5px 5px 0px;display:inline;float:left;" align="left" src="http://getcassette.net/_cassette/file/assets/styles/images/cassette-logo-new_7a5ba25ec913ae3415a02853131953813a1c04e3_png" /&gt;Nadpis je asi trochu matoucí&amp;#160; a&amp;#160; snad na vysvětlenou pro ty mladší&amp;#160; by bylo dobré zmínit, že kdysi dávno se hudba nekopírovala pomocí mp3, ale existovaly analogové kazety. Kopírování bylo zdlouhavé a s každou kopií klesala kvalita. Názvem tohoto média se inspiroval autor zajímavé knihovny(nepátral jsem proč a doufám, že to neznamená, že kvalita knihovny bude s každou verzí klesat).&lt;/p&gt;  &lt;p&gt;Knihovnu&amp;#160; nalezenete na stránkách &lt;a href="http://getcassette.net/"&gt;http://getcassette.net/&lt;/a&gt;.&amp;#160; Může vám pomoci při vývoji WebForms a nebo MVC webů (já ji použil pro zatím jeden malý projekt v MVC). &lt;/p&gt;  &lt;p&gt;Řeší problém se správou skriptů a stylů –pro snazší údržbu a vývoj je vhodné mít styly uložené ve více css souborech, podobně i skripty. Jenže čím více toho musí prohlížeč pro zobrazení stránek stáhnout, tím je celková odezva stránek pomalejší a zátěž serveru a využití internetového spojení vyšší. A přesně tento problém &lt;strong&gt;Cassette&lt;/strong&gt; řeší – při vývoji a ladění webu&amp;#160; zachovává malé soubory – můžete tedy snadno využívat klientských ladících nástrojů například ve Firefoxu, ostrá verze pak obsahuje soubory jak sloučené, tak minimalizované. &lt;/p&gt;  &lt;p&gt;V případě MVC pak navíc nemusí stránky(views) obsahovat spousty tagů se skript soubory či linky na css. Stačí jen deklarovat, které soubory jsou pro dané &lt;strong&gt;View&lt;/strong&gt; potřeba: &lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:adfead80-aa44-4762-a221-4f6800a0f684" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@{&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    ViewBag.Title = &lt;span style="color:#a31515;"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#2b91af;"&gt;Bundles&lt;/span&gt;.Reference(&lt;span style="color:#a31515;"&gt;&amp;quot;Scripts/Cards/export.js&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#2b91af;"&gt;Bundles&lt;/span&gt;.Reference(&lt;span style="color:#a31515;"&gt;&amp;quot;Scripts/Cards/flashcard.js&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#2b91af;"&gt;Bundles&lt;/span&gt;.Reference(&lt;span style="color:#a31515;"&gt;&amp;quot;Scripts/Cards/search.js&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#2b91af;"&gt;Bundles&lt;/span&gt;.Reference(&lt;span style="color:#a31515;"&gt;&amp;quot;Content/inputBox.css&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#2b91af;"&gt;Bundles&lt;/span&gt;.Reference(&lt;span style="color:#a31515;"&gt;&amp;quot;Content/card.css&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#2b91af;"&gt;Bundles&lt;/span&gt;.Reference(&lt;span style="color:#a31515;"&gt;&amp;quot;Content/cards.css&amp;quot;&lt;/span&gt;);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;inputBox&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;V MasterView souboru pak stačí na příslušných místech, kde mají byt tagy, zavolat:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0d7cbde6-1e70-471d-90c6-f8077d631259" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color:#800000;"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;html&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;html&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;head&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;ViewBag.Title&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Bundles&lt;/span&gt;.RenderScripts()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Bundles&lt;/span&gt;.RenderStylesheets()&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;head&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;body&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;wrapper&amp;quot;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Všimněte si tak=, že nemusíte přímo odkazovat na jQuery knihovnu – ve skriptech, které si vytvoříte se stačí na tuto knihovnu odkázat a bude tak zahrnuta do vašich skriptů:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_6F6B0822.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_117363E9.png" width="447" height="145" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;(ten odkaz by jste tam dávali asi tak jako tak, díky tomu vám začne fungovat intelliSense nápověda pro JQuery metody).&lt;/p&gt;  &lt;p&gt;Totéž platí i o stylech, i&amp;#160; v nich můžete napsat odkaz na “nadřízený” styl:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_4B8230C8.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_36247B60.png" width="185" height="174" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nyní můžeme v případě, že svůj web ladíme, získat všechny soubory:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_14C4D5C4.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_1F358417.png" width="764" height="284" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Celková velikost jen skriptů je přes 600kB:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_22E3031A.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_00AAF794.png" width="768" height="220" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Naopak jakmile vývoj dokončíme a web nasadíme, začne nám &lt;strong&gt;Cassette&lt;/strong&gt; soubory slučovat a minimalizovat:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_4396A034.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_5AE1A4A5.png" width="769" height="131" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Například JavaScripty jsou nyní jen v jednom souboru, který má velikost téměř sedmkrát menší:&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_3EF06FAD.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_5E9F4975.png" width="773" height="47" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Na webu autora knihovny&amp;#160; a nebo fórech pak lze nalézt další tipy, třeba jak vypnout minimalizaci:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:79a17ccb-e5ea-47a2-aed2-ff9980f191bb" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;bundles.Add&amp;lt;&lt;span style="color:#2b91af;"&gt;ScriptBundle&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Scripts&amp;quot;&lt;/span&gt;, b =&amp;gt; b.Processor = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ScriptPipeline&lt;/span&gt;().Remove&amp;lt;&lt;span style="color:#2b91af;"&gt;MinifyAssets&lt;/span&gt;&amp;gt;());&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Další informace o této knihovně jsou k dispozici na webu knihovny, popřípadě na tomto &lt;a href="http://kamranicus.com/Blog/Posts/27/using-cassette-for-semi-complicated-scenarios"&gt;blogu&lt;/a&gt;. Instalace je jednoduchá, základní použití je popsáno na webu autora.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx&amp;amp;;title=ASP.NET%e2%80%93+kazeta+st%26%23225%3ble+%c5%beije%e2%80%a6.." target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx&amp;amp;;title=ASP.NET%e2%80%93+kazeta+st%26%23225%3ble+%c5%beije%e2%80%a6.." target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx&amp;amp;;title=ASP.NET%e2%80%93+kazeta+st%26%23225%3ble+%c5%beije%e2%80%a6.." target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx&amp;amp;title=ASP.NET%e2%80%93+kazeta+st%26%23225%3ble+%c5%beije%e2%80%a6.." target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx&amp;amp;;title=ASP.NET%e2%80%93+kazeta+st%26%23225%3ble+%c5%beije%e2%80%a6.." target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx&amp;amp;;title=ASP.NET%e2%80%93+kazeta+st%26%23225%3ble+%c5%beije%e2%80%a6..&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx&amp;amp;;subject=ASP.NET%e2%80%93+kazeta+st%26%23225%3ble+%c5%beije%e2%80%a6.." target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2012/01/07/asp-net-kazeta-st-le-ije.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=240900" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/Css+Html/default.aspx">Css Html</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>ASP.NET MVC3–Binding příklad</title><link>http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx</link><pubDate>Mon, 26 Dec 2011 10:12:40 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:240750</guid><dc:creator>mstr</dc:creator><slash:comments>11</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/240750.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=240750</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=240750</wfw:comment><description>&lt;p&gt;V tomto příspěvku popíši, jak namapovat data pomocí “nesouvislých indexů” – ony se ty anglické výrazy špatně překládají, respektive nejsem jazykový odborník.&lt;/p&gt;  &lt;h1&gt;Problém&lt;/h1&gt;  &lt;p&gt;Představte si, že máte k dispozici seznam telefonních čísle a jmen a chcete je zobrazit uživateli, který pomocí zaškrtávátka určí, které z nich chce vložit do svého seznamu kontaktů. Běžně se tento problém řeší tak, že se uvažuje, že každý záznam má své ID (identifkátor). &lt;/p&gt;  &lt;p&gt;Ale zkusme vyřešit situaci, kdy prostě žádné ID není k dipozici a nebo ho použít nechceme, tedy třída vypadá takto:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fc16faeb-aa46-42d5-8868-12676844eb3c" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Contact&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Name { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Phone { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Zdroj dat nám nahradí tento kód:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:32e475ff-c7da-4b48-81ef-99315cef7166" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Contact&amp;gt; Get()&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Contact[] {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Contact() {Name= &lt;span style="color:#a31515;"&gt;&amp;quot;Pepa&amp;quot;&lt;/span&gt;, Phone= &lt;span style="color:#a31515;"&gt;&amp;quot;123456789&amp;quot;}&lt;/span&gt;,&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Contact() {Name= &lt;span style="color:#a31515;"&gt;&amp;quot;Petr&amp;quot;&lt;/span&gt;, Phone=  &lt;span style="color:#a31515;"&gt;&amp;quot;987654321&amp;quot;}&lt;/span&gt;,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Contact() {Name= &lt;span style="color:#a31515;"&gt;&amp;quot;Lopuch&amp;quot;&lt;/span&gt;, Phone= &lt;span style="color:#a31515;"&gt;&amp;quot;456789123&amp;quot;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    }.AsEnumerable();&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Kontroler není složitý:    &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:dc102341-4513-45d6-bdb6-11d47e762e16" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;HomeController&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;Controller&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af;"&gt;HttpGet&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ActionResult&lt;/span&gt; Index()&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color:#2b91af;"&gt;Contact&lt;/span&gt;.Get());&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;A View &lt;strong&gt;Index&lt;/strong&gt; pak vypadá takto:&lt;/p&gt;    &lt;p&gt;   &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4f95685c-83b1-4fe5-8adc-a5e87de2b4f2" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@model &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;Contact&amp;gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;@{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    ViewBag.Title = &lt;span style="color:#a31515;"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;h2&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Import - contacts&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;h2&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (Html.BeginForm())&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; contact &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Model)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;checkbox&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;index&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;contact.GetHashCode()&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;{0}-{1}&amp;quot;&lt;/span&gt;, contact.Name, contact.Phone) &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string.Format(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;[{0}].Name&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;, contact.GetHashCode())&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;contact.Name&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;hidden&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string.Format(&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;[{0}].Phone&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;, contact.GetHashCode())&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;contact.Phone&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;send&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Metoda kontrolleru, který bude zpracovávat přijímaná data, pak vypadá takto:&lt;/p&gt;    &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:bd6f87c8-4828-4359-bda0-53ae28e9afeb" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af;"&gt;HttpPost&lt;/span&gt;]&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ActionResult&lt;/span&gt; Index(&lt;span style="color:#2b91af;"&gt;Contact&lt;/span&gt;[] contacts)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color:#a31515;"&gt;&amp;quot;IndexPosted&amp;quot;&lt;/span&gt;, contacts);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;a ve View &lt;strong&gt;IndexPosted&lt;/strong&gt; vypisujeme přijaté kontakty pomocí jednoduchého kódu:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e99b9e00-7e18-4dc9-9189-6c9c6e8d8ab1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;h2&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Posted contects&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;h2&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; contact &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; Model)&lt;/li&gt; &lt;li&gt;{ &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;     &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;{0}-{1}&amp;quot;&lt;/span&gt;, contact.Name, contact.Phone) &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt; &lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;A takto se to chová:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_7B8A6A73.png"&gt;&lt;img style="margin:5px 5px 5px 0px;display:inline;" title="image" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_2CA9A514.png" width="208" height="132" /&gt;&lt;/a&gt;a po odeslání stlačením tlačítka &lt;strong&gt;Send&lt;/strong&gt;: &lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_251E35A7.png"&gt;&lt;img style="margin:5px 5px 5px 0px;display:inline;" title="image" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_0BB6326D.png" width="197" height="91" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Závěr&lt;/h1&gt;  &lt;p&gt;Veškeré kouzlo spočívá v checkboxu pojmenovaném &lt;strong&gt;index&lt;/strong&gt;. Hodnota checkboxu je na server odeslána pouze v případě, že je zaškrtnut. MVC3 framework na serveru se pak snaží vytvořit kolekci objektů třídy&amp;#160; &lt;strong&gt;Contact &lt;/strong&gt;(viz cílová akce formuláře&lt;strong&gt; Index(Contact[]&amp;#160; contacts)&lt;/strong&gt;) – a hodnutu &lt;strong&gt;index&lt;/strong&gt; použivá pro nalezení hodnot jednotlivých objektů.&lt;/p&gt;  &lt;p&gt;Samozřejmě by se dal tento jednoduchý příklad řešit i jinak, ale všimněte si některých výhod tohoto řešení:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;uživateli neposíláme žádné ID a Hashcode, který ho do jisté míry nahrazuje, je naprosto umělá hodnota. &lt;/li&gt;    &lt;li&gt;Metodu pro zpracování dat do formuláře můžeme použít i pro zpracování normálního formuláře &lt;/li&gt;    &lt;li&gt;díky tomu, ze využíváme model zpracování MVC frameworku, došlo by i k oveření všech podmínek, které bychom pro model případně definovali. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Celý zdrojový kód projektu &lt;strong&gt;BindingExample&lt;/strong&gt; je dostupný na &lt;a href="http://flashcardcreator.codeplex.com"&gt;CodePlex&lt;/a&gt; – ale prakticky vše je uvedeno v tomto článku.     &lt;br /&gt;    &lt;br /&gt;Poznámka na konec – index se nemusí jmenovat jen index, ale můžeme používat i prefixů při řešení složitějších případů:     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3d0bd40f-7824-48db-a96a-021bea3a921d" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.CheckBox(&lt;span style="color:#a31515;"&gt;&amp;quot;phones.index&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { value = contact.GetHashCode() })&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.Hidden(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;phones[{0}].Name&amp;quot;&lt;/span&gt;, contact.GetHashCode()), contact.Name)&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx&amp;amp;;title=ASP.NET+MVC3%e2%80%93Binding+p%c5%99%26%23237%3bklad" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx&amp;amp;;title=ASP.NET+MVC3%e2%80%93Binding+p%c5%99%26%23237%3bklad" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx&amp;amp;;title=ASP.NET+MVC3%e2%80%93Binding+p%c5%99%26%23237%3bklad" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx&amp;amp;title=ASP.NET+MVC3%e2%80%93Binding+p%c5%99%26%23237%3bklad" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx&amp;amp;;title=ASP.NET+MVC3%e2%80%93Binding+p%c5%99%26%23237%3bklad" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx&amp;amp;;title=ASP.NET+MVC3%e2%80%93Binding+p%c5%99%26%23237%3bklad&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx&amp;amp;;subject=ASP.NET+MVC3%e2%80%93Binding+p%c5%99%26%23237%3bklad" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/26/asp-net-mvc3-binding-p-klad.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=240750" width="1" height="1"&gt;</description></item><item><title>Vzhůru do oblak!…..a stejně skončíme v přístavu</title><link>http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx</link><pubDate>Sun, 18 Dec 2011 11:33:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:240592</guid><dc:creator>mstr</dc:creator><slash:comments>6</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/240592.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=240592</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=240592</wfw:comment><description>&lt;p&gt;Minulý příspěvek popisoval jednoduchou konzolovou aplikaci, která z údajů ze sešitu programu Excel udělá PDF dokument s kartičkami. Takový dokument pak stačilo jen vytisknout, rozstříhat či rozřezat a papírové kartičky byly hotové.&lt;/p&gt;  &lt;p&gt;Tento příspěvek popíše, jak tuto aplikaci upravit tak, že:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;umožní načítat z libovolného zdroje dat (například místo Excel z CSV souboru) &lt;/li&gt;    &lt;li&gt;zdrojový kód bude přístupný v aktuální podobě každému a nemusí se přidávat jako příloha ke stažení &lt;/li&gt;    &lt;li&gt;aplikace bude dostupná přes webové stránky – tedy pošleme soubor a obdržíme zpět PDF dokument &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;img style="margin:5px 15px 5px 0px;display:inline;float:left;" align="left" src="http://t3.gstatic.com/images?q=tbn:ANd9GcRUgu2IofvC-sLCGiBaq7uuU5ulQieCZ2jsnbWEWZ1oKN1a1FyquQ" width="189" height="284" /&gt;A proč nadpis “Vzhůru do oblak!”? – výsledný web bude v cloudu. To je dnes takové moderní slovo – v prostředí .NET nejčastěji spojované s Azure. Ale Azure nepoužijeme – Microsoft sice nabízí trial verze, jenže ani u nich není zaručeno, že na konci za to nebude platit (zde si neodpustím poznámku, že MS na Azure a WP7 předvádí jak velká firma není schopna správných rozhodnutí a nechápe, co je pro masivnější používání daných produktů klíčové – ale to je jen můj povzdech a soukromý názor). Takže místo Azure použijeme služeb &lt;a href="https://appharbor.com/"&gt;AppHarbor&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Aktualizace 18.12 17:00&lt;/strong&gt;&lt;/font&gt; – jak jsem se dočetl &lt;a href="http://blogs.msdn.com/b/vyvojari/archive/2011/12/16/ucet-na-windows-azure-nyni-zcela-bez-finanancniho-rizika-a-zdarma.aspx"&gt;zde&lt;/a&gt;, MS konečně umožnil bezplatné zkoušení. I tak je krok za AppHarbor.&lt;/p&gt;  &lt;h1&gt;Úprava stávající aplikace&lt;/h1&gt;  &lt;p&gt;Nejprve změníme typ z konzolové aplikace na knihovnu. To je jednoduchá změna, klikneme pravým tlačítkem na název projektu a ve vlastnostech změním typ:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_700D5EB8.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_1FE8007A.png" width="639" height="124" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Nyní se musí upravit samotná aplikace. Nejprve upravíme načítání dat – nyní je v kódu napevno zakodóváno načítání přes ADO.NET z Excel souboru: &lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:dd136e01-9223-4967-9cc5-aa9125e58a43" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;St&amp;#225;vaj&amp;#237;c&amp;#237; k&amp;#243;d&lt;/div&gt; &lt;div style="background:#fff;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ReadAndPrintExcelSheet(...)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt; &lt;li&gt;            ...&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;            Action&amp;lt;DbCommand&amp;gt; read = (command) =&amp;gt;&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                command.CommandText = &lt;span style="color:#a31515;"&gt;&amp;quot;SELECT * FROM [Sheet1$]&amp;quot;&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (DbDataReader reader = command.ExecuteReader())&lt;/li&gt; &lt;li&gt;                {&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    ...&lt;/li&gt; &lt;li&gt;                    &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (reader.Read())&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    {&lt;/li&gt; &lt;li&gt;                        ....&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                    }&lt;/li&gt; &lt;li&gt;                }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;                ...&lt;/li&gt; &lt;li&gt;            };&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            Db.Work(&lt;span style="color:#a31515;"&gt;&amp;quot;Excel&amp;quot;&lt;/span&gt;, read);&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;        }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Tohoto provázání se zbavíme poměrně snadno – zavedeme tento interface&lt;b&gt; ICardData&lt;/b&gt;:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7b3ed743-e95c-4264-868d-f3bc51591dd7" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:500px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ICardData&lt;/span&gt;&lt;br&gt; {&lt;br&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Word { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;br&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Pronunciation { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;br&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Example { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;;  }&lt;br&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Meaning { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;;  }&lt;br&gt;     &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ExampleTranslation { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; }&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Do definice třídy pro generování PDF pak přidáme delegáta&amp;#160; &lt;b&gt;Func&amp;lt;IEnumerable&amp;lt;ICardData&amp;gt;&amp;gt;,&lt;/b&gt; který bude ukazovat na metodu, která bude schopna poskytnout údaje o kartičkách – přičemž nyní naší třídy pro generování PDF už nebude zajímat, jak to tato metoda dělá (tedy jestli čte databázi, CSV soubor, google dokument atd.):&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c80fbc2d-f62b-4a3f-9b9a-73d25ee70587" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;Upraven&amp;#253; k&amp;#243;d&lt;/div&gt; &lt;div style="background:#fff;max-height:400px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;Func&amp;lt;IEnumerable&amp;lt;ICardData&amp;gt;&amp;gt; getCardData;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;...&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ReadAndPrintExcelSheet(...)&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    ...&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var cardData &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; getCardData())&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt; &lt;li&gt;        ....&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    ...&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Pokud porovnáte nový a předešlý kód navzájem, došlo ke zjednodušení. Dle mého názoru je kód i přehlednější. Zbývá ještě udělat metodu pro delegáta &lt;b&gt;getCardData&lt;/b&gt; :-).&lt;/p&gt;  &lt;h3&gt;Poznámka pro ICardData&amp;quot;&lt;/h3&gt;  &lt;p&gt;Interface&lt;b&gt; ICardData&lt;/b&gt; je implementován abstraktní třídou &lt;b&gt;CardData&lt;/b&gt; – tato abstraktní třída pak slouží jako předek pro třídy navázané na konkrétní zdroje dat (bude ukázáno dále):&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:de4186e1-41a8-4d31-88b2-b19d12308cf8" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;abstract&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CardData&lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;ICardData&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Word { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Pronunciation { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Example { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt;  &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Meaning { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ExampleTranslation { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;V zdrojovém kódu je implementována i původní&amp;#160; podpora pro čtení Excel souborů – ale tento kód není využit (budou se zpracovávat jen CSV soubory). Slouží tedy spíše jako ukázka, jak implementovat podporu dalších zdrojů údajů o kartičkách. Jedná se o třídy &lt;b&gt;DbCardDataProvider.cs&lt;/b&gt;, &lt;b&gt;DbDataReaderCardData.cs&lt;/b&gt; a &lt;b&gt;Database.cs&lt;/b&gt;.&lt;/p&gt;  &lt;h2&gt;Čteme CSV soubor&lt;/h2&gt;  &lt;p&gt;Pro čtení CSV souboru jsem si “vypůjčil” kód od &lt;a href="http://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-c"&gt;Janathana Wooda&lt;/a&gt;.&amp;#160; Provedl jsem jen pár úprav – zajímá mne jen čtení ze streamu, místo čárky jsem jako oddělovač definoval středník. Výsledek je v souboru &lt;b&gt;CsvStreamReader.cs&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;Kód této třídy je jednoduchý – umí vzít vstupní stream a postupně jej číst “po řádcích”, přičemž každý řádek načte do objektu třídy &lt;b&gt;CsvRow&lt;/b&gt;. To dělá metoda &lt;b&gt;ReadRow(CsvRow)&lt;/b&gt;, která vrací &lt;b&gt;&lt;i&gt;true&lt;/i&gt;&lt;/b&gt;, dokud nedosáhneme konce dat a aktualizuje vlastnosti objektu &lt;b&gt;CsvRow&lt;/b&gt; tak, aby obsahoval data právě načteného řádku.&lt;/p&gt;  &lt;pre&gt;&lt;font face="Verdana"&gt;Nyní ještě zbývá udělat pomocnou třídu &lt;b&gt;CsvStreamReaderCardDataProvider&lt;/b&gt;, která nám poskytne metodu pro delegáta &lt;/font&gt;&lt;font face="Verdana"&gt;&lt;b&gt;Func&amp;lt;IEnumerable&amp;lt;ICardData&amp;gt;&amp;gt; &lt;/b&gt;pro třídu generující PDF dokument.&lt;/font&gt;&lt;b&gt;&amp;#160;&lt;/b&gt;&lt;/pre&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1c43e0fb-7ced-40f2-bc53-a606e3bbac7b" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt;
&lt;div style="background:#fff;overflow:auto;"&gt;
&lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CsvStreamReaderCardDataProvider&lt;/span&gt; : IDisposable&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt;
&lt;li&gt;    CsvStreamReader reader = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; CsvStreamReaderCardDataProvider(MemoryStream stream)&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt;
&lt;li&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.reader = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CsvStreamReader(stream);&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;ICardData&amp;gt; GetCardData()&lt;/li&gt;
&lt;li&gt;    {&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        CsvRow row = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CsvRow();&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;        &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (reader.ReadRow(row))&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;        {&lt;/li&gt;
&lt;li&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (row.Count &amp;lt; 4)&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;                &lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;            CsvStreamReaderCardData card = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; CsvStreamReaderCardData(row);&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;yield&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; card;&lt;/li&gt;
&lt;li&gt;        }&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    }&lt;/li&gt;
&lt;li&gt;}&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Funkčnost třídy je jednoduchá, vytvoří si instanci &lt;b&gt;CsvStreamReader&lt;/b&gt;u a poté v metodě &lt;b&gt;GetCarData&lt;/b&gt; čte řádky, převede &lt;b&gt;CsvRow&lt;/b&gt; na objekt třídy implementující &lt;b&gt;ICardData&lt;/b&gt; – v tomto případě na objekt třídy &lt;b&gt;CsvStreamReaderCardData&lt;/b&gt;, která je potomkem abstraktní třídy &lt;b&gt;CardData&lt;/b&gt;:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:cbb6974f-552a-4e05-9ef9-5a2015920f20" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt;
&lt;div style="background:#fff;overflow:auto;"&gt;
&lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CsvStreamReaderCardData&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;CardData&lt;/span&gt;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt;
&lt;li&gt;    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; CsvStreamReaderCardData(&lt;span style="color:#2b91af;"&gt;CsvRow&lt;/span&gt; row)&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    {&lt;/li&gt;
&lt;li&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Word = row[0];&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Pronunciation = row[1];&lt;/li&gt;
&lt;li&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Example = row[2];&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;        &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Meaning = row[3];&lt;/li&gt;
&lt;li&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (row.Count &amp;gt; 4)&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.ExampleTranslation = row[4];&lt;/li&gt;
&lt;li&gt;        &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;            &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.ExampleTranslation = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;&lt;/li&gt;
&lt;li&gt;    }&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;h2&gt;&amp;#160;&lt;/h2&gt;

&lt;h2&gt;Proč vlastně stream a ne soubor (aneb iTextSharp v paměti)?&lt;/h2&gt;

&lt;p&gt;Jak jsem nastínil již v úvodu, má celá aplikace bežet v cloudu. Tam ukládání a čtení souborů může představovat problém – a protože nepředpokládám velké soubory, tak se veškeré zpracování (upload od uživatele a čtení) odehraje jen v paměti. &lt;/p&gt;

&lt;p&gt;Výše uvedené má ještě jeden dopad – při generování PDF souboru se tento vytvářel na disku. Nyní i tento dokument musíme vytvořit v paměti a poté poslat uživateli zpět, tedy místo tohoto kódu:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1f3b7d36-40b7-4e7f-add1-8bf31c8461f1" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt;
&lt;div style="background:#fff;overflow:auto;"&gt;
&lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#2b91af;"&gt;PdfWriter&lt;/span&gt; writer = &lt;span style="color:#2b91af;"&gt;PdfWriter&lt;/span&gt;.GetInstance(pdfDocument,&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;                        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FileStream&lt;/span&gt;(&lt;/li&gt;
&lt;li&gt;                        &lt;span style="color:#2b91af;"&gt;Path&lt;/span&gt;.Combine(&lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.GetFolderPath(&lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.&lt;span style="color:#2b91af;"&gt;SpecialFolder&lt;/span&gt;.MyDocuments), &lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;                        &lt;span style="color:#a31515;"&gt;&amp;quot;Flashcards.pdf&amp;quot;&lt;/span&gt;),&lt;/li&gt;
&lt;li&gt;                        &lt;span style="color:#2b91af;"&gt;FileMode&lt;/span&gt;.Create));&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;použijeme tento kód:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0379ff09-2a10-4345-9d86-a9b89d1fd280" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt;
&lt;div style="background:#fff;overflow:auto;"&gt;
&lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; stream = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;();&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#2b91af;"&gt;PdfWriter&lt;/span&gt; writer = iTextSharp.text.pdf.&lt;span style="color:#2b91af;"&gt;PdfWriter&lt;/span&gt;.GetInstance(pdfDocument, stream);&lt;/li&gt;
&lt;li&gt;writer.CloseStream = &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h2&gt;Souhrn změn původní aplikace&lt;/h2&gt;

&lt;p&gt;Mimo změny v typu aplikace (z konzolové na knihovnu) a způsobu načítání dat došlo i k dalším změnám:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Hlavní kód se přesunul ze souboru &lt;b&gt;Program.cs&lt;/b&gt; do souboru &lt;b&gt;Creator.cs&lt;/b&gt;, stejně se změnili i názvy tříd (program na Creator). &lt;/li&gt;

  &lt;li&gt;Třída &lt;b&gt;Creator&lt;/b&gt; má jednu hlavní metodu &lt;b&gt;CreatePd&lt;/b&gt;f, která vyžaduje dva vstupní paramatry – metodu pro získání údajů kartiček a třídu fontů, které se mají použít &lt;/li&gt;

  &lt;li&gt;správné umístnění kartičky na A4 je řešeno pomocí dvou statických funkcí &lt;b&gt;BackNextPositionProvider&lt;/b&gt; a &lt;b&gt;FrontNExtPositionProvider&lt;/b&gt; – zpřehlednil se tak tisk stránky, který se odehrává v metodě &lt;b&gt;PrintFlashCardPage &lt;/b&gt;&lt;/li&gt;

  &lt;li&gt;kartičky se ze zdoje načítají do jediného pole, to se navíc při zpracování stránky neinicilizuje znovu, ale pouze se vyprázdní příkazem &lt;b&gt;Array.Clear(pageCardData, 0, pageCardData.Length);&lt;/b&gt; 

    &lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zpracování je nyní toto:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;zavolá se metoda &lt;b&gt;CreatePdf&lt;/b&gt; – inicilizuje se pdf dokument &lt;/li&gt;

  &lt;li&gt;Načtou se kartičky pro stránku pomocí odkazu&amp;#160; na metodu &lt;b&gt;getCardData&lt;/b&gt; &lt;/li&gt;

  &lt;li&gt;Zavolá se metoda pro vložení stránky, které se mimo pole kartiček&amp;#160; předají&amp;#160; i odkazy na metodu vyrábějící kartičky pro rubovou stránku a odpovídají metoda pro výpočet polohy kartiček na stránce (tedy odkazy na metody &lt;b&gt;CreateForeignFlashcard&lt;/b&gt; a &lt;b&gt;FrontNextPositionProvider&lt;/b&gt;) &lt;/li&gt;

  &lt;li&gt;Totéž se provede i pro lícovou stránku, jen se předávají metody &lt;b&gt;CreateNativeFlashcard&lt;/b&gt; a &lt;b&gt;BackNextPositionProvider &lt;/b&gt;&lt;/li&gt;

  &lt;li&gt;Metoda &lt;b&gt;CreatePdf&lt;/b&gt; vrátí vytvořený Pfd dokument jako stream &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mimo výše uvedené jsou v projektu třídy pro získání dat z CSV souborů a ze sešitů Excel.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h2&gt;Třída FlashcardFonts&lt;/h2&gt;

&lt;p&gt;Tato třída obsahuje fonty používané pro vypsání textů na kartičky. Protože má aplikace fungovat na webu, je nutné šetřit systémové prostředky a tedy stačí vytvořit tyto fonty jen jednou a poté je sdílet pro všechna volání objektů třídy &lt;b&gt;Creator&lt;/b&gt; a jejich metody &lt;b&gt;CreatePdf&lt;/b&gt; – pro všechna tato volání se použije stejná instance.&lt;/p&gt;

&lt;p&gt;Protože jsou kartičky vykreslovány pomocí fontu Arial, je tento font přidán do AppData webovské aplikace a ve tříde FlashcardFonts pak slouží pro inicializaci základního fontu, ze kterého pak výchází ostatní.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Web aplikace&lt;/h1&gt;

&lt;p&gt;Web aplikace využívá knihovnu pro tvorbu Pdf dokumentů. Je to MVC3 aplikace vytvořená ze šablony visual studia, obsahuje jen jeden controller nazvaný &lt;b&gt;Home&lt;/b&gt;, který zobrazí jednoduchý formulář umožňující upload souboru:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:68dc8a0d-8fce-47c9-b5f6-e6e0c42c3fe2" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt;
&lt;div style="background:#fff;max-height:100px;overflow:auto;"&gt;
&lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (Html.BeginForm(&lt;span style="color:#a31515;"&gt;&amp;quot;UploadCsv&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;Home&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;FormMethod&lt;/span&gt;.Post, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; { enctype = &lt;span style="color:#a31515;"&gt;&amp;quot;multipart/form-data&amp;quot;&lt;/span&gt; }))&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;{&lt;/li&gt;
&lt;li&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;file&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;file&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;id&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;file&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;value&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;submit&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;}&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Data odeslaná tímto formulářem na server jsou zpracována v metodě &lt;b&gt;UploadCsv&lt;/b&gt;:&lt;/p&gt;

&lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d54173ad-d4ce-44bb-ae11-82f98f30cb10" class="wlWriterEditableSmartContent"&gt;
&lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt;
&lt;div style="background:#fff;overflow:auto;"&gt;
&lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt;
&lt;li&gt;&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt; downloadStream;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; fileName;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt; uploadedStream = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemoryStream&lt;/span&gt;())&lt;/li&gt;
&lt;li&gt;{&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    Request.Files[0].InputStream.CopyTo(uploadedStream);&lt;/li&gt;
&lt;li&gt;    fileName = &lt;span style="color:#2b91af;"&gt;Path&lt;/span&gt;.GetFileNameWithoutExtension(Request.Files[0].FileName);&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    uploadedStream.Position = 0;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;CsvStreamReaderCardDataProvider&lt;/span&gt; provider = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CsvStreamReaderCardDataProvider&lt;/span&gt;(uploadedStream))&lt;/li&gt;
&lt;li&gt;    {&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;        &lt;/li&gt;
&lt;li&gt;        &lt;span style="color:#2b91af;"&gt;Creator&lt;/span&gt; creator = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Creator&lt;/span&gt;();&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;        downloadStream = creator.CreatePdf(provider.GetCardData, fonts);&lt;/li&gt;
&lt;li&gt;    }&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;}&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;downloadStream.Position = 0;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FileStreamResult&lt;/span&gt;(downloadStream, &lt;span style="color:#a31515;"&gt;&amp;quot;application/pdf&amp;quot;&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;{&lt;/li&gt;
&lt;li style="background:#f3f3f3;"&gt;    FileDownloadName = fileName + &lt;span style="color:#a31515;"&gt;&amp;quot;_flashcard.pdf&amp;quot;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;};&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Obsah odeslaného souboru je vložen do streamu (&lt;b&gt;Request.Files[0].InputStream.CopyTo(uploadedStream);&lt;/b&gt;) , následně je tento stream čten pomocí &lt;b&gt;CsvReader&lt;/b&gt;u (ten je skryt v objektu &lt;b&gt;provider&lt;/b&gt;)&amp;#160; pomocí objektu &lt;b&gt;provider&lt;/b&gt; . Následně je zavolán &lt;b&gt;Creator&lt;/b&gt;, jako zdroj údajů o kartičkách mu slouží metoda &lt;b&gt;GetCardData&lt;/b&gt; objektu &lt;b&gt;provider&lt;/b&gt; – objekt &lt;b&gt;creator&lt;/b&gt; pak&amp;#160; vytvoří stream obsahující Pdf dokument. Ten je následně odeslán zpět uživateli jako application/pdf s názvem odpovídajíc šabloně &lt;b&gt;&lt;i&gt;&amp;lt;jméno souboru&amp;gt;_flashcard.pdf&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Sdílíme zdrojový kód –CodePlex&lt;/h1&gt;

&lt;p&gt;V příloze k tomuto článku už nenaleznete zdrojový kód popisovaného řešení – ten je nyní umístněn na &lt;a href="http://www.codeplex.com/"&gt;CodePlex&lt;/a&gt; serveru a to na adrese &lt;a href="http://flashcardcreator.codeplex.com"&gt;http://flashcardcreator.codeplex.com&lt;/a&gt;. Zdrojový kód si můžete volně procházet přímo v prohlížeči, popřípadě stáhnout a upravit jak chcete:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_2B9D47AC.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_28A7E2F9.png" width="1004" height="359" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Poznámka – co je to CodePlex?&lt;/h2&gt;

&lt;p&gt;&lt;b&gt;Dle &lt;a href="http://cs.wikipedia.org/wiki/CodePlex"&gt;wikipedie&lt;/a&gt;: CodePlex&lt;/b&gt; je &lt;a href="http://cs.wikipedia.org/wiki/Website"&gt;internetový projekt&lt;/a&gt; společnosti &lt;a href="http://cs.wikipedia.org/wiki/Microsoft"&gt;Microsoft&lt;/a&gt; určený k hostování &lt;a href="http://cs.wikipedia.org/wiki/Open_source_software"&gt;otevřeného softwaru&lt;/a&gt;. CodePlex byl založen v &lt;a href="http://cs.wikipedia.org/wiki/Kv%C4%9Bten"&gt;květnu&lt;/a&gt; &lt;a href="http://cs.wikipedia.org/wiki/2009"&gt;2009&lt;/a&gt;. K repozitářům lze přistupovat pomocí &lt;a href="http://cs.wikipedia.org/wiki/Verzov%C3%A1n%C3%AD"&gt;verzovacích systémů&lt;/a&gt; &lt;a href="http://cs.wikipedia.org/w/index.php?title=Team_Foundation_Server&amp;amp;action=edit&amp;amp;redlink=1"&gt;Team Foundation Server&lt;/a&gt; nebo &lt;a href="http://cs.wikipedia.org/wiki/Subversion"&gt;Subversion&lt;/a&gt;. Uživatelé mají dále k dispozici nástroje pro sledování požadavků, chyb, podporu &lt;a href="http://cs.wikipedia.org/wiki/RSS"&gt;RSS&lt;/a&gt;, statistiky, diskuzní fóra,, vlastní Wiki atd. Ač se většina zdejších projektů týká &lt;a href="http://cs.wikipedia.org/wiki/.NET_Framework"&gt;.NET Frameworku&lt;/a&gt;, včetně &lt;a href="http://cs.wikipedia.org/wiki/ASP.NET"&gt;ASP.NET&lt;/a&gt; a &lt;a href="http://cs.wikipedia.org/w/index.php?title=Microsoft_SharePoint&amp;amp;action=edit&amp;amp;redlink=1"&gt;Microsoft SharePointu&lt;/a&gt;, jsou zde projekty zabývající se &lt;a href="http://cs.wikipedia.org/wiki/SQL"&gt;SQL&lt;/a&gt;, &lt;a href="http://cs.wikipedia.org/wiki/Windows_Presentation_Foundation"&gt;WPF&lt;/a&gt; a &lt;a href="http://cs.wikipedia.org/w/index.php?title=Windows_Forms&amp;amp;action=edit&amp;amp;redlink=1"&gt;Windows Forms&lt;/a&gt; a další.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h1&gt;Jdeme do oblak &lt;/h1&gt;

&lt;p&gt;Náš projekt z &lt;b&gt;CodePlex&lt;/b&gt; můžeme vystavit přímo na web díky službě &lt;b&gt;AppHarbor&lt;/b&gt;. Základní verze služby je zdarma a zprovoznění je za normálních podmínek otázkou několika minut. V nápovědě &lt;b&gt;AppHarbor&lt;/b&gt; naleznete i &lt;a href="http://support.appharbor.com/kb/api/integrating-with-codeplex"&gt;postup&lt;/a&gt;, jak spojit CodePlex s vaší aplikací – a při každém commitu/check-inu zdrojového kódu dojde i k aktualizace aplikace na &lt;b&gt;AppHarbor&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Zatím jsem se ale setkal s těmito problémy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ne každý commit zdrojového kódu na&lt;b&gt; CodePlex&lt;/b&gt; se promítne do &lt;b&gt;AppHarbor&lt;/b&gt; – &lt;b&gt;AppHarbor &lt;/b&gt;dělá build jednou za cca 14-15 minut – i tak je mezi aktualizací zdrojových kódů na CodePlex a aktualizací AppHarbor občas několikaminutová prodleva: 

    &lt;br /&gt;

    &lt;br /&gt;CodePlex: 

    &lt;br /&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_5EC95B48.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_43B08C3A.png" width="500" height="50" /&gt;&lt;/a&gt; 

    &lt;br /&gt;AppHarbor: 

    &lt;br /&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_6D44576D.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_2582CE86.png" width="498" height="36" /&gt;&lt;/a&gt; 

    &lt;br /&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_0018DB18.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" align="right" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_56C19319.png" width="177" height="244" /&gt;&lt;/a&gt; &lt;/li&gt;

  &lt;li&gt;Vložil jsem souboru &lt;b&gt;arial.ttf&lt;/b&gt; do složky &lt;b&gt;App_Data&lt;/b&gt;, ale zapomněl jsem nastavit (přenastavit) ve vlastnostech &lt;b&gt;Build Action &lt;/b&gt;na &lt;b&gt;Content&lt;/b&gt;.&amp;#160; Což vedlo k tomu, že při lokálním spuštění vše fungovalo, ale na AppHarbor soubor fyzicky nebyl – trvalo mi dost dlouho, než jsem přišel na to, kde je chyba – uznávám, je to školácká chyba. Kdybych použil svůj osvědčený postup spočívající v samostatném webu na lokálním IIS a deploymentu z VS, tak bych na to přišel dříve. 

    &lt;ul&gt;
      &lt;li&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Nepopisuji podrobně, jak s oběma bezplatnými službami pracovat – obě požadují vytvoření účtu, což by nikomu nemělo činit problém a založení projektu na obou z nich je velmi jednoduché a přímočaré – v případě problémů existují diskuzní fóra i nápovědy u obou služeb. &lt;/p&gt;

&lt;p&gt;Služba běží na adrese &lt;a href="http://flashcard.apphb.com"&gt;http://flashcard.apphb.com&lt;/a&gt; a základní rozhraní je velmi jednoduché:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_0B323F95.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_3D19BA52.png" width="446" height="376" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stačí vybrat soubor (ukázka souboru ve formátu UTF-8 CSV je přiložena jako &lt;b&gt;slovicka.txt&lt;/b&gt;) a odeslat na server. Zpět vám přijde PDF dokument.&lt;/p&gt;

&lt;h1&gt;Závěr&lt;/h1&gt;

&lt;p&gt;Prosím mějte na paměti, že kód je pouze demonstrační.&amp;#160; Řetez událostí vypadá při použití CodePlex a AppHarbor takto: vývojář udělá změny a provede check-in změn do CodePlex. CodePlex upozorní AppHarbor na změnu, AppHarbor získá z CodePlex zdrojové kódy, zbuilduje je a nasadí. &lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx&amp;amp;;title=Vzh%c5%afru+do+oblak!%e2%80%a6..a+stejn%c4%9b+skon%c4%8d%26%23237%3bme+v+p%c5%99%26%23237%3bstavu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx&amp;amp;;title=Vzh%c5%afru+do+oblak!%e2%80%a6..a+stejn%c4%9b+skon%c4%8d%26%23237%3bme+v+p%c5%99%26%23237%3bstavu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx&amp;amp;;title=Vzh%c5%afru+do+oblak!%e2%80%a6..a+stejn%c4%9b+skon%c4%8d%26%23237%3bme+v+p%c5%99%26%23237%3bstavu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx&amp;amp;title=Vzh%c5%afru+do+oblak!%e2%80%a6..a+stejn%c4%9b+skon%c4%8d%26%23237%3bme+v+p%c5%99%26%23237%3bstavu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx&amp;amp;;title=Vzh%c5%afru+do+oblak!%e2%80%a6..a+stejn%c4%9b+skon%c4%8d%26%23237%3bme+v+p%c5%99%26%23237%3bstavu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx&amp;amp;;title=Vzh%c5%afru+do+oblak!%e2%80%a6..a+stejn%c4%9b+skon%c4%8d%26%23237%3bme+v+p%c5%99%26%23237%3bstavu&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx&amp;amp;;subject=Vzh%c5%afru+do+oblak!%e2%80%a6..a+stejn%c4%9b+skon%c4%8d%26%23237%3bme+v+p%c5%99%26%23237%3bstavu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/18/vzh-ru-do-oblak-a-stejn-skon-me-v-p-stavu.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=240592" width="1" height="1"&gt;</description><enclosure url="http://blog.vyvojar.cz/mstr/attachment/240592.ashx" length="11864" type="text/plain" /></item><item><title>Víkendová rychlovka–tisk kartiček</title><link>http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx</link><pubDate>Sun, 11 Dec 2011 15:39:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:240561</guid><dc:creator>mstr</dc:creator><slash:comments>6</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/240561.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=240561</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=240561</wfw:comment><description>&lt;p align="justify"&gt;Mé školou povinné děti se učí angličtinu. Což znamená učit se slovíčka. Mají slovníčky, jenže ty mají některé nevýhody – například se často naučíte slovíčka v nechtěném kontextu ostatních slov, tedy nakonec je umíte pěkně vyjmenovat v řadě, ale otázka na nahodilé slovíčko zůstane bez odpovědi. A nebo se špatně zvýrazňují obtížná slovíčka, aby jste si je mohli častěji opakovat.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="justify"&gt;Jistou naději jsem vkládal do elektronických pomůcek&amp;nbsp; - jenže chytrý mobil sloužil všemu možnému, jen ne na opakovaní slovíček a tak putoval pryč. Jedinou možností se tak jeví klasické papírové kartičky – jenže jejich příprava bere čas, obzvláště pokud by jste si je měli sami psát. Nutné je také zmínit, že na rozdíl od aplikaci jako &lt;a href="http://anymemo.org/"&gt;AnyMemo&lt;/a&gt; jsou kartičky zcela tiché a slovíčko vám tedy nepřečtou.&lt;/p&gt;  &lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="justify"&gt;Dal jsem tedy dohromady slovíčka na listu v sešitě Excel, stáhnul knihovnu &lt;b&gt;iTextSharp &lt;/b&gt;a udělal aplikaci, která si údaje z Excelu načte a vytvoří PDF s kartičkami – ty stačí pak již jen vytisknout, rozstříhat a učit se, učit se, učit se (© Lenin).&lt;/p&gt;  &lt;p align="justify"&gt;&amp;nbsp;&lt;/p&gt;  &lt;h1&gt;Excel Sheet jako vstup&lt;/h1&gt;  &lt;p&gt;Formát informací je jednoduchý – slovíčko, přepis výslovnosti, příklad použití, český význam a překlad příkladu – vše na listě s názvem Sheet1 (pokud se list jmenuje jinak, musí se upravit příkaz pro načtení v programu) . Excel sheet pak vypadá&amp;nbsp; takto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_63704276.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" width="838" height="144" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_5C30BA64.png"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Poznámka – lze samozřejmě použít i jiný formát, ale musí se pak upravit aplikace – není to těžké. Použit je Excel 2010.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h1&gt;iTextSharp&lt;/h1&gt;  &lt;p align="justify"&gt;Tuhle levnou, protože zadarmo, knihovnu na tvorbu PDF naleznete na této &lt;a href="http://itextpdf.com/"&gt;adrese&lt;/a&gt;. Trochu času zabralo přijít na nejlepší a nejjednodušší způsob vykreslení kartiček – nakonec každou kartičku vykresluji jako tabulku na určité pozici. Výhodou tabulek je možnost určit jak font použitý na obsah buňky, tak i pozadí buňky, její velikost a ohraničení. Obsah lze i otočit a lze tak dosáhnout možnosti přetáčet kartičky po delší straně s obráceným textem.&lt;/p&gt;  &lt;p&gt;Vzhledem k tomu, že jsme v Evropě, tiskne se na papír A4, s okrajem 10mm (výsledné pédéefko by tedy mělo jít vytisknout na jakékoliv tiskárně):&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_3DF2D6E3.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" width="468" height="506" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_7F3D17D5.png"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Vlastní aplikace je velmi jednoduchá – otevře se Excel soubor a z něj se načítají data – to se odehrává v metodě &lt;b&gt;ReadAndPrintExcelSheet&lt;/b&gt;. Ta načítá údaje ze sešitu a vytváří jednoduché objekty pro obě strany kartiček (objekty tříd ForeignFlashcardContent a NativeFlashcardContent). Ty pak vloží do pole na správné místo (aby při tisku na obě strany se obě strany kartiček správně “slicovaly”). Jakmile je načten dostatečný počet kartiček pro tisk stránky (v mém případě se tiskne 8 řádků po 4 sloupcích, tedy dohromady 32 kartiček), zavolá se vlastní “tisk” do PDF. Pro každý načtený údaj zhotovena kartička (metody&amp;nbsp; &lt;b&gt;CreateForeignFlashcard&lt;/b&gt; a &lt;b&gt;CreateNativeFlashcard&lt;/b&gt;) a ta je umístněna na stránku (metoda &lt;b&gt;PrintFlashCardPage&lt;/b&gt;).&amp;nbsp; A to je vše.&lt;/p&gt;  &lt;p&gt;Abych nemusel počítat body při generování PDF, je zde metoda &lt;b&gt;mmToDots&lt;/b&gt;, která zadanou míru v milimetrech převede na počet bodů, se kterým metody &lt;b&gt;&lt;i&gt;iTextSharp&lt;/i&gt;&lt;/b&gt; knihovny pracují. &lt;/p&gt;  &lt;p&gt;Abych mohl vykreslovat speciální znaky (hlavně u výslovnosti), používám jaké základ všech písem v dokumentu font Arial:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:575c637f-a955-4b1d-9e57-94727d3bc504" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#2b91af;"&gt;BaseFont&lt;/span&gt; baseFont = iTextSharp.text.pdf.&lt;span style="color:#2b91af;"&gt;BaseFont&lt;/span&gt;.CreateFont(&lt;span style="color:#a31515;"&gt;@"C:/Windows/Fonts/ARIAL.TTF"&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;BaseFont&lt;/span&gt;.IDENTITY_H, iTextSharp.text.pdf.&lt;span style="color:#2b91af;"&gt;BaseFont&lt;/span&gt;.EMBEDDED);&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;br&gt;  &lt;p align="justify"&gt;Celý kód je napsán prakticky jen ve statických metodách – nehledejte tam žádné architektonické kouzla a čáry, je to prostě jednoduchá a jednoúčelová aplikace, která ovšem udělá co má: kartičky. &lt;/p&gt;  &lt;p&gt;Umístnění vstupního Excel souboru je v &lt;b&gt;app.config&lt;/b&gt; – celý program lze samozřejmě upravit na čtení jména souboru z příkazové řádky apod. – každopádně nezapomeňte :&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5a551568-1722-402f-aaf2-18c026b9f82e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;app.config&lt;/div&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;version&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;1.0&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;encoding&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;utf-8&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; ?&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;add&lt;/span&gt;&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Excel&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;connectionString&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;Dsn=Excel Files;dbq=D:\Slovicka.xlsx;driverid=790;maxbuffersize=2048;pagetimeout=5&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; &lt;/span&gt;&lt;span style="color:#ff0000;"&gt;providerName&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt;System.Data.Odbc&lt;/span&gt;"&lt;span style="color:#0000ff;"&gt; /&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;connectionStrings&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;configuration&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;a výstupní Flashcards.pdf pak naleznete ve svých dokumentech díky tomuto příkazu:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:29009a55-47b0-4a44-864e-e28c32e8c47c" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#fff;max-height:300px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0;padding:0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#2b91af;"&gt;PdfWriter&lt;/span&gt; writer = &lt;span style="color:#2b91af;"&gt;PdfWriter&lt;/span&gt;.GetInstance(pdfDocument,&lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;FileStream&lt;/span&gt;(&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Path&lt;/span&gt;.Combine(&lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.GetFolderPath(&lt;span style="color:#2b91af;"&gt;Environment&lt;/span&gt;.&lt;span style="color:#2b91af;"&gt;SpecialFolder&lt;/span&gt;.MyDocuments), &lt;/li&gt; &lt;li style="background:#f3f3f3;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#a31515;"&gt;"Flashcards.pdf"&lt;/span&gt;),&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;FileMode&lt;/span&gt;.Create));&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;   &lt;br&gt;A toto je “hardwarový” výstup celého programu:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/IMG_7305_3B290DF1.jpg"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="IMG_7305" border="0" alt="IMG_7305" width="484" height="275" src="http://blog.vyvojar.cz/blogs/mstr/IMG_7305_thumb_75E090FA.jpg"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Zdrojový kód je&amp;nbsp; přiložen včetně použitého xlsx souboru v balíčku zip.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx&amp;amp;;title=V%26%23237%3bkendov%26%23225%3b+rychlovka%e2%80%93tisk+karti%c4%8dek" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx&amp;amp;;title=V%26%23237%3bkendov%26%23225%3b+rychlovka%e2%80%93tisk+karti%c4%8dek" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx&amp;amp;;title=V%26%23237%3bkendov%26%23225%3b+rychlovka%e2%80%93tisk+karti%c4%8dek" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx&amp;amp;title=V%26%23237%3bkendov%26%23225%3b+rychlovka%e2%80%93tisk+karti%c4%8dek" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx&amp;amp;;title=V%26%23237%3bkendov%26%23225%3b+rychlovka%e2%80%93tisk+karti%c4%8dek" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx&amp;amp;;title=V%26%23237%3bkendov%26%23225%3b+rychlovka%e2%80%93tisk+karti%c4%8dek&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx&amp;amp;;subject=V%26%23237%3bkendov%26%23225%3b+rychlovka%e2%80%93tisk+karti%c4%8dek" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/11/v-kendov-rychlovka-tisk-karti-ek.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=240561" width="1" height="1"&gt;</description><enclosure url="http://blog.vyvojar.cz/mstr/attachment/240561.ashx" length="1292976" type="application/octet-stream" /><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/.NET/default.aspx">.NET</category></item><item><title>“Vyber vše” aneb kombinace ASP.NET MVC a jQuery</title><link>http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx</link><pubDate>Wed, 07 Dec 2011 18:55:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:240532</guid><dc:creator>mstr</dc:creator><slash:comments>5</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/240532.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=240532</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=240532</wfw:comment><description>&lt;p&gt;V tomto článku popíši možné řešení zadání, podle kterého se má uživateli zobrazit seznam možností ve formě zaškrtávacího políčka, přičemž jedno ze zaškrtávacích políček má sloužit jako “Vyber vše” – pokud jej uživatel zaškrtne, zaškrtnou se všechny možnosti, pokud zaškrtnutí zruší, zruší se i všechny možnosti:&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_5CCA0ADA.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" width="100" height="110" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_2D2BEC4E.png"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_245BE402.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" width="99" height="105" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_47C8629A.png"&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_669ED678.png"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" width="94" height="102" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_182A440E.png"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Řešení podobného zadání jsou na netu mraky – takže k tomuto mraku přispěji dalším obláčkem.&amp;nbsp; Aby řešení bylo co nejvíce univerzální, stanovil jsem si tyto podmínky:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Všechny ovládané zaškrtávátka musí být uzavřeny do elementu &lt;b&gt;&amp;lt;fieldset&amp;gt;&lt;/b&gt; &lt;/li&gt;    &lt;li&gt;První zaškrtávátko slouží pro výběr všeho. &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Obecné Html a javacript&lt;/h2&gt;  &lt;p&gt;Html kód splňující výše uvedené podmínky&amp;nbsp; pak vypadá takto:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:28d0ce0e-9ac5-447f-b382-9eb79bbae721" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;fieldset&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="checkbox"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="all"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;for&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="all"&amp;gt;&lt;/span&gt;Vyber ve&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="checkbox"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="praha"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;for&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="praha"&amp;gt;&lt;/span&gt;Praha&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="checkbox"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="brno"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;for&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="brno"&amp;gt;&lt;/span&gt;Brno&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="checkbox"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ostrava"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;for&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="ostrava"&amp;gt;&lt;/span&gt;Ostrava&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;fieldset&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;a odpovídající j&lt;b&gt;Query&lt;/b&gt; javascript pak takto:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5ddf6334-b422-43ce-b600-9128678b1851" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;"&gt;selectAllCheckbox.js&lt;/div&gt; &lt;div style="background:#ddd;max-height:500px;overflow:auto;"&gt; &lt;ol style="background:#ffffff;margin:0 0 0 2.5em;padding:0 0 0 5px;white-space:nowrap;"&gt; &lt;li&gt;jQuery(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; () {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jQuery(&lt;span style="color:#800000;"&gt;'fieldset :checkbox'&lt;/span&gt;).click(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; () {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; $checkboxes = jQuery(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;).closest(&lt;span style="color:#800000;"&gt;'fieldset'&lt;/span&gt;).find(&lt;span style="color:#800000;"&gt;':checkbox'&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ($checkboxes.index(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;) == 0) {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$checkboxes.not(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;).attr(&lt;span style="color:#800000;"&gt;'checked'&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.checked);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt; {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$checkboxes.setSelectAllCheckbox();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jQuery(&lt;span style="color:#800000;"&gt;'fieldset'&lt;/span&gt;).each(&lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; () {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jQuery(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;).find(&lt;span style="color:#800000;"&gt;':checkbox'&lt;/span&gt;).setSelectAllCheckbox();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;/li&gt; &lt;li&gt;})&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;jQuery.fn.setSelectAllCheckbox = &lt;span style="color:#0000ff;"&gt;function&lt;/span&gt; SetSelectAll() {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; first = &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.first();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jQuery(first).attr(&lt;span style="color:#800000;"&gt;'checked'&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.not(first).filter(&lt;span style="color:#800000;"&gt;':checked'&lt;/span&gt;).length == (&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.length - 1));&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Metoda na řádcích 17.-20. nastaví předané ovládací zaškrtávátko buď do stavu zaškrtnuto a nebo nezaškrtnuto podle stavu ostatní zaškrtávátka (ovládací zaškrtávátko bude zaškrtnuto, pokud všechna ostatní jsou zaškrtnuta.&lt;/p&gt;  &lt;p&gt;Kód na řádcích 2-10 zajišťuje, že při každém kliknutí na zaškrtávátko umístněné v elementu &lt;b&gt;&amp;lt;fieldset&amp;gt;&lt;/b&gt; je zjištěno, zda se jedná o první zaškrtávátko v daném elementu. Pokud ano, nastaví se všechna ostatní zaškrtávátka podle stavu právě kliknutého (řádek 5.). Pokud ne, provede se funkce na řádcích 17. – 20.&lt;/p&gt;  &lt;p&gt;Kód na řádcích 12. 15. slouží pro správná nastavení po načtení stránky do prohlížeče.&lt;/p&gt;  &lt;p&gt;Upozorňuji, že kód není dokonalý, například neřeší &lt;u&gt;důsledně&lt;/u&gt; situace, kdy je do sebe zanořeno více elementů &lt;b&gt;fieldset&lt;/b&gt;.&lt;/p&gt;  &lt;h2&gt;Html helper method&lt;/h2&gt;  &lt;p&gt;Element &lt;b&gt;&amp;lt;fieldset&amp;gt;&lt;/b&gt; nemusím generovat ručně. Můžeme použít rozšíření &lt;b&gt;HtmlHelper&lt;/b&gt;u a použít tuto konstrukci v našem view. Tvorbu jednoduchých rozšíření nemá asi cenu popisovat, proto rovnou popíši něco o stupeň složitější, tedy konstrukci podobnou @using(Html.BeginForm….):&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ee7b5286-246f-42cb-857f-2e48a3812c23" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;"&gt;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (Html.BeginSelectAllCheckbox())&lt;br&gt; { &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;input&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;type&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="checkbox"&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="all"&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;for&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="all"&amp;gt;&lt;/span&gt;Vyber ve&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.CheckBox(&lt;span style="color:#a31515;"&gt;"Praha"&lt;/span&gt;)&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Praha&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.CheckBox(&lt;span style="color:#a31515;"&gt;"Brno"&lt;/span&gt;)&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Brno&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="background:#ffff00;"&gt;@&lt;/span&gt;Html.CheckBox(&lt;span style="color:#a31515;"&gt;"Ostrava"&lt;/span&gt;)&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Ostrava&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;font style="background-color:#ffff00;" color="#ff0000"&gt;&lt;b&gt;Upozornění &lt;/b&gt;- je mi jasné, že v tomto případě se může hloubavému čtenáři zdát, že jde o přístup “s kanónem na vrabce”, ale chci na tomto jednoduchém příkladu demonstrovat tvorbu vlastních rozšíření – v některém z dalších příspěvků chci popsat složitější řešení a není tedy na škodu&amp;nbsp; začít jednoduchým příkladem.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Metoda &lt;b&gt;BeginSelectAllCheckbox&lt;/b&gt; je pak statické metoda statické třídy, která vypadá takto:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:35f67994-853f-40e3-b99b-2eee46bddf76" class="wlWriterEditableSmartContent"&gt; &lt;div style="border:#000080 1px solid;color:#000;font-family:'Courier New', Courier, Monospace;font-size:10pt;"&gt; &lt;div style="background-color:#ffffff;max-height:500px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;HelperExtension&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt; BeginSelectAllCheckbox(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;HtmlHelper&lt;/span&gt; helper )&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt; begin = () =&amp;gt; {helper.ViewContext.Writer.Write(&lt;span style="color:#a31515;"&gt;"&amp;lt;fieldset&amp;gt;"&lt;/span&gt;);};&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt; end = () =&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{helper.ViewContext.Writer.Write(&lt;span style="color:#a31515;"&gt;"&amp;lt;/fieldset&amp;gt;"&lt;/span&gt;);};&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DisposableHelper&lt;/span&gt;(begin, end);&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DisposableHelper&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IDisposable&lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt; end;&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DisposableHelper(&lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt; begin, &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt; end)&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.end = end;&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;begin();&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt; &lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Dispose()&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;end();&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Tvorba vlastních rozšíření &lt;b&gt;HtmlHelper&lt;/b&gt;u objektu v MVC tedy není složitá a princip je doufám z kódu patrný – díky &lt;b&gt;using &lt;/b&gt;dojde kzavolání &lt;b&gt;Dispose &lt;/b&gt;metody, která provede závěrečnou akci – zavolá metodu, kterou jsme při vytváření třídy definovali pomocí delegáta &lt;b&gt;&lt;i&gt;Action&lt;/i&gt;&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;Přiložen je i ukázkový MVC projekt s veškerým kódem.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx&amp;amp;;title=%e2%80%9cVyber+v%c5%a1e%e2%80%9d+aneb+kombinace+ASP.NET+MVC+a+jQuery" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx&amp;amp;;title=%e2%80%9cVyber+v%c5%a1e%e2%80%9d+aneb+kombinace+ASP.NET+MVC+a+jQuery" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx&amp;amp;;title=%e2%80%9cVyber+v%c5%a1e%e2%80%9d+aneb+kombinace+ASP.NET+MVC+a+jQuery" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx&amp;amp;title=%e2%80%9cVyber+v%c5%a1e%e2%80%9d+aneb+kombinace+ASP.NET+MVC+a+jQuery" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx&amp;amp;;title=%e2%80%9cVyber+v%c5%a1e%e2%80%9d+aneb+kombinace+ASP.NET+MVC+a+jQuery" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx&amp;amp;;title=%e2%80%9cVyber+v%c5%a1e%e2%80%9d+aneb+kombinace+ASP.NET+MVC+a+jQuery&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx&amp;amp;;subject=%e2%80%9cVyber+v%c5%a1e%e2%80%9d+aneb+kombinace+ASP.NET+MVC+a+jQuery" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/07/vyber-v-e-aneb-kombinace-asp-net-mvc-a-jquery.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=240532" width="1" height="1"&gt;</description><enclosure url="http://blog.vyvojar.cz/mstr/attachment/240532.ashx" length="43025" type="application/octet-stream" /><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/Css+Html/default.aspx">Css Html</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/jQuery/default.aspx">jQuery</category></item><item><title>MVC3: odkaz v textu</title><link>http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx</link><pubDate>Mon, 05 Dec 2011 21:55:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:240518</guid><dc:creator>mstr</dc:creator><slash:comments>5</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/240518.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=240518</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=240518</wfw:comment><description>&lt;p&gt;MVC3 nabízí tuto metodu, pokud chceme na stránce vypsat odkaz:&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;font style="background-color:#ffff00;"&gt;@Html.ActionLink("klikni zde","Index")&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Co ale dělat, pokud chceme vypsat odkaz jako součást delšího text, například: &lt;/p&gt; &lt;p&gt;Nejste registrován v našem systému, prosím klikněte &lt;u&gt;zde&lt;/u&gt; a zaregistrujte se.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Řešením může byt rozdělení textu na části:&lt;/p&gt;&lt;pre&gt;&lt;font style="background-color:#ffff00;"&gt;&amp;lt;p&amp;gt;Nejste registrován v našem systému, prosím klikněte @Html.ActionLink("zde","Index") a zaregistrujte se.&amp;lt;/p&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;To je fungující řešení – problém s ním ale nastane v okamžiku, kdy začneme stránku lokalizovat a texty umístíme do resource souborů – obvykle se pak celý text rozdělí na části:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_1D98F334.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:5px 5px 5px 0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" width="474" height="77" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_6E67079C.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;a z nich se pak generuje stránka:&lt;/p&gt;&lt;pre&gt;&lt;font style="background-color:#ffff00;"&gt;&amp;lt;p&amp;gt;@Resources.FirstPart @Html.ActionLink("zde","Index") @Resources.SecondPart&amp;lt;/p&amp;gt;&lt;/font&gt;
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;To ale není příliš pěkné – vznikají zbytečné klíče. Spíše by bylo lepší mít toto:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_2711B1AA.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" width="579" height="56" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_42B63DA0.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pokud ale zapíšeme tento kód:&lt;/p&gt;&lt;pre&gt;&lt;font style="background-color:#ffff00;"&gt;&amp;lt;p&amp;gt;@string.Format(Resources.Registrace, Html.ActionLink("zde","Index"))&amp;lt;/p&amp;gt;
&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;objeví se nám na stránce:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_4D076200.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" width="599" height="33" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_05B20C0E.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Což není co bychom asi chtěli. Správný zápis totiž je:&lt;/p&gt;&lt;pre&gt;&lt;font style="background-color:#ffff00;"&gt;&amp;lt;p&amp;gt;@Html.Raw(string.Format(Html.Encode(Resources.Registrace), Html.ActionLink("zde","Index")))&amp;lt;/p&amp;gt;&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;font face="Verdana"&gt;A dostaneme:&lt;/font&gt;&lt;/pre&gt;&lt;pre&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_0545D919.png"&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" width="500" height="46" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_5A014211.png"&gt;&lt;/a&gt;&lt;/pre&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;Vysvětlení:&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;font style="background-color:#ffff00;"&gt;Html.Encode&lt;/font&gt; použijeme, abychom správně zakodovali HTML značky v původním textu, tedy aby resource mohl například obsahovat text “Musí být &amp;lt;&amp;gt; od 0”. &lt;/li&gt;
&lt;li&gt;&lt;font style="background-color:#ffff00;"&gt;Html.Raw &lt;/font&gt;pak brání dalšímu kódování a text je vypsán tak jak je – nedojde tak k Html kodování vloženého odkazu.&lt;/li&gt;&lt;/ul&gt;&lt;pre&gt;&lt;/pre&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx&amp;amp;;title=MVC3%3a+odkaz+v+textu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx&amp;amp;;title=MVC3%3a+odkaz+v+textu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx&amp;amp;;title=MVC3%3a+odkaz+v+textu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx&amp;amp;title=MVC3%3a+odkaz+v+textu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx&amp;amp;;title=MVC3%3a+odkaz+v+textu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx&amp;amp;;title=MVC3%3a+odkaz+v+textu&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx&amp;amp;;subject=MVC3%3a+odkaz+v+textu" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/12/05/mvc3-odkaz-v-textu.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=240518" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>CSS sprity a seznamy</title><link>http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx</link><pubDate>Mon, 21 Feb 2011 22:01:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:237394</guid><dc:creator>mstr</dc:creator><slash:comments>0</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/237394.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=237394</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=237394</wfw:comment><description>&lt;p&gt;Ač nerad, přeci jen jsem občas dotlačen k práci na uživatelském rozhraní :-). V rámci jednoho webového projektu vznikl požadavek použít &lt;strong&gt;CSS sprity&lt;/strong&gt;&amp;nbsp; místo odrážek. &lt;/p&gt;  &lt;p&gt;Pokud někdo neví, co jsou to &lt;strong&gt;CSS sprity&lt;/strong&gt;, tak snad pomůže tento &lt;a href="http://css-tricks.com/css-sprites/"&gt;odkaz&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Přímé použití v seznamech je ale, jak jsem posléze zjistil, problematické. Prvek seznamu je obvykle větší než obrázek ve spritu a tak je často zobrazeno ze spritu více, než by bylo vhodné. Ani můj oblíbený &lt;strong&gt;stackoverflow &lt;/strong&gt;mi nenabídl řešení – většina příspěvků, co jsem našel, radila buď předělat sprite tak, aby obsahoval obrázky jen vertikálně&amp;nbsp; a nebo&amp;nbsp; navrhovala použít element &lt;strong&gt;div&lt;/strong&gt; jako kontejneru.&lt;/p&gt;  &lt;p&gt;Pouze vertikální uspořádání spritu nebylo možné – sprite byl dodán a nebylo možné jej měnit. Použítí &lt;strong&gt;div&lt;/strong&gt;u se mi moc nelíbílo, kód pak vypadal &lt;em&gt;tak nějak divně&lt;/em&gt;:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ul&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;li&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="menu"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="saveIcon"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;div&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Save&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;li&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ul&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;

&lt;p&gt;Mým cílem je ale mnohem obyčejnější zápis:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ul&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="menu"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;li&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="save"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;save&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;li&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;li&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;="edit"&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;edit&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;li&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ul&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div&gt;a při použití jednoduchého spritu:&lt;/div&gt;

&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/sprite_example_5848B2F8.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="sprite_example" border="0" alt="sprite_example" src="http://blog.vyvojar.cz/blogs/mstr/sprite_example_thumb_5ECC0CBB.jpg" width="228" height="107"&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;dosáhnout tohoto vzhledu:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_5C42DAFD.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_5BC6823B.png" width="244" height="153"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;o vše se pak postará tento css kód:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;ul&lt;/span&gt;&lt;span style="color:#cc6633;"&gt;.menu&lt;/span&gt;&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;list-style&lt;/span&gt;: &lt;span style="color:#006080;"&gt;none outside none;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;padding&lt;/span&gt;: 0;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;margin&lt;/span&gt;: 0;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;font-weight&lt;/span&gt;:&lt;span style="color:#006080;"&gt;bold;&lt;/span&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;ul&lt;/span&gt;&lt;span style="color:#cc6633;"&gt;.menu&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;li&lt;/span&gt;&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;display&lt;/span&gt;: inline&lt;span style="color:#006080;"&gt;-block;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;margin&lt;/span&gt;-&lt;span style="color:#0000ff;"&gt;left&lt;/span&gt;: &lt;span style="color:#006080;"&gt;20px;&lt;/span&gt;&lt;br&gt;}&lt;br&gt;    &lt;br&gt;&lt;span style="color:#0000ff;"&gt;ul&lt;/span&gt;&lt;span style="color:#cc6633;"&gt;.menu&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;li&lt;/span&gt;:before&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;content&lt;/span&gt;:url(&lt;span style="color:#0000ff;"&gt;content&lt;/span&gt;/empty_space&lt;span style="color:#cc6633;"&gt;.gif&lt;/span&gt;); &lt;br&gt;    &lt;span style="color:#0000ff;"&gt;background-image&lt;/span&gt;: url(Content/sprite_example&lt;span style="color:#cc6633;"&gt;.jpg&lt;/span&gt;);&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;background-repeat&lt;/span&gt;: no&lt;span style="color:#006080;"&gt;-repeat;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;margin&lt;/span&gt;-&lt;span style="color:#0000ff;"&gt;right&lt;/span&gt;:&lt;span style="color:#006080;"&gt;5px;&lt;/span&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;display&lt;/span&gt;: inline&lt;span style="color:#006080;"&gt;-block;&lt;/span&gt;&lt;br&gt;}&lt;br&gt;    &lt;br&gt;&lt;span style="color:#0000ff;"&gt;li&lt;/span&gt;&lt;span style="color:#cc6633;"&gt;.save&lt;/span&gt;:before&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;background-position&lt;/span&gt;: 0px &lt;span style="color:#006080;"&gt;-53px;&lt;/span&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;li&lt;/span&gt;&lt;span style="color:#cc6633;"&gt;.edit&lt;/span&gt;:before&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;background-position&lt;/span&gt;: -45px &lt;span style="color:#006080;"&gt;-53px;&lt;/span&gt;&lt;br&gt;}&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Finta spočívá v použítí průhledného obrázku s rozměry odpovídajícími ikoně ze spritu&lt;/u&gt;&lt;/strong&gt;. Ostatní již odpovídá běžnému postupu při používání Css spritu.&lt;/p&gt;

&lt;p&gt;Následně je i velmi jednoduché změnit obrázek při najetí myší, stačí doplnit tento styl:&lt;/p&gt;

&lt;div&gt;
  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;li&lt;/span&gt;&lt;span style="color:#cc6633;"&gt;.save&lt;/span&gt;:hover:before&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;background-position&lt;/span&gt;: &lt;span style="color:#006080;"&gt;0px 0px;&lt;/span&gt;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;

&lt;div&gt;a výsledkem je:&lt;/div&gt;

&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_1D9D41BD.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_50C95559.png" width="244" height="153"&gt;&lt;/a&gt; Přiložena je i jednoduchá stránka s obrázky a css stylem.&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx&amp;amp;;title=CSS+sprity+a+seznamy" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx&amp;amp;;title=CSS+sprity+a+seznamy" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx&amp;amp;;title=CSS+sprity+a+seznamy" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx&amp;amp;title=CSS+sprity+a+seznamy" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx&amp;amp;;title=CSS+sprity+a+seznamy" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx&amp;amp;;title=CSS+sprity+a+seznamy&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx&amp;amp;;subject=CSS+sprity+a+seznamy" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2011/02/21/css-sprity-a-seznamy.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=237394" width="1" height="1"&gt;</description><enclosure url="http://blog.vyvojar.cz/mstr/attachment/237394.ashx" length="12780" type="application/zip" /><category domain="http://blog.vyvojar.cz/mstr/archive/tags/Css+Html/default.aspx">Css Html</category></item><item><title>Visual Studio – seskupení  souborů</title><link>http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx</link><pubDate>Sun, 05 Dec 2010 17:09:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:237208</guid><dc:creator>mstr</dc:creator><slash:comments>9</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/237208.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=237208</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=237208</wfw:comment><description>&lt;p&gt;Jeden kamarád si prohlížel jeden z mých projektů a zaujalo ho, že v &lt;b&gt;Solution Explorer&lt;/b&gt; vidí některé soubory pěkně sloučené do skupinky. Asi takhle:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_68B67771.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="320" height="124" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_350E0B13.png"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A chtěl vědět, jak jsem toho docilil. Je to pomocí zajímavé knihovničky &lt;b&gt;VSCommands&lt;/b&gt;, kterou naleznete na adrese &lt;a href="http://vscommands.com/"&gt;http://vscommands.com/&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Je k dispozici ve dvou verzích, placené a neplacené. Neplacené verze má některé omezení, ale výše uvedené zvládne.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx&amp;amp;;title=Visual+Studio+%e2%80%93+seskupen%26%23237%3b++soubor%c5%af" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx&amp;amp;;title=Visual+Studio+%e2%80%93+seskupen%26%23237%3b++soubor%c5%af" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx&amp;amp;;title=Visual+Studio+%e2%80%93+seskupen%26%23237%3b++soubor%c5%af" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx&amp;amp;title=Visual+Studio+%e2%80%93+seskupen%26%23237%3b++soubor%c5%af" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx&amp;amp;;title=Visual+Studio+%e2%80%93+seskupen%26%23237%3b++soubor%c5%af" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx&amp;amp;;title=Visual+Studio+%e2%80%93+seskupen%26%23237%3b++soubor%c5%af&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx&amp;amp;;subject=Visual+Studio+%e2%80%93+seskupen%26%23237%3b++soubor%c5%af" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/05/visual-studio-seskupen-soubor.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=237208" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/mstr/archive/tags/Utilitky-postupy/default.aspx">Utilitky-postupy</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>DRY – databáze podruhé</title><link>http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx</link><pubDate>Wed, 01 Dec 2010 07:40:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:237197</guid><dc:creator>mstr</dc:creator><slash:comments>1</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/237197.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=237197</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=237197</wfw:comment><description>&lt;p&gt;V první části jsem ukázal, jak zjednodušit a centralizovat práci s databázi. V tomto díle zajdu ještě dál a kód se stane ještě více obecnějším.&lt;/p&gt;  &lt;h2&gt;Connection string&lt;/h2&gt;  &lt;p&gt;Informaci o tom, jak se připojit k databázi máme nyní přímo v kódu:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;using&lt;/span&gt; (SqlConnection connection = &lt;span&gt;new&lt;/span&gt; SqlConnection(&lt;span&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=Names;Integrated Security=True;Pooling=False"&lt;/span&gt;))&lt;/pre&gt;

  &lt;br&gt;&lt;/div&gt;

&lt;p&gt;&amp;nbsp;To není úplně ideální, neboť případná změna znamená zásah do kódu. Lepším řešením je přesunout tuto informaci do configuračního souboru (&lt;b&gt;App.config&lt;/b&gt;). Změna tak znamená jen přepsání textové informace.&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;&lt;span&gt;="1.0"&lt;/span&gt; &lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;="utf-8"&lt;/span&gt; ?&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;connectionStrings&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;add&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;="NamesDatabase"&lt;/span&gt; &lt;span&gt;connectionString&lt;/span&gt;&lt;span&gt;="Data Source=.\SQLEXPRESS;Initial Catalog=Names;Integrated Security=True;Pooling=False"&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;connectionStrings&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

  &lt;br&gt;&lt;/div&gt;

&lt;p&gt;&amp;nbsp;a kód upravíme takto:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;using&lt;/span&gt; (SqlConnection connection = &lt;span&gt;new&lt;/span&gt; SqlConnection(ConfigurationManager.ConnectionStrings[&lt;span&gt;"NamesDatabase"&lt;/span&gt;].ConnectionString))&lt;/pre&gt;
&lt;/div&gt;

&lt;h2&gt;&amp;nbsp;Změna databáze&lt;/h2&gt;

&lt;div&gt;Kód je teď více univerzální – můžeme změnit databázi, se kterou chceme pracovat. Ale co když nechceme použít MS SQL databázi, ale třeba &lt;a href="http://www.sqlite.org/"&gt;SqLite&lt;/a&gt;?&lt;/div&gt;

&lt;div&gt;Na první pohled se zdá, že budeme muset změnit kód a místo vytváření &lt;b&gt;SqlConnection&lt;/b&gt; vytvořit objekt třídy &lt;b&gt;SQLiteConnection&lt;/b&gt;:&lt;/div&gt;

&lt;div&gt;&amp;nbsp;&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;using&lt;/span&gt; (SQLiteConnection connection = &lt;span&gt;new&lt;/span&gt; SQLiteConnection(ConfigurationManager.ConnectionStrings[&lt;span&gt;"NamesDatabase"&lt;/span&gt;].ConnectionString))&lt;/pre&gt;

  &lt;br&gt;&lt;/div&gt;

&lt;p&gt;a&amp;nbsp; podobné změny provést i pro command atd. &lt;/p&gt;

&lt;p&gt;A pravděpodobně skončíme s několika metodami, jednou pro každý typ databáze:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; WorkWithSQLDatabase(Action&amp;lt;SqlCommand&amp;gt; processCommand)&lt;br&gt;{&lt;br&gt;    &lt;span&gt;using&lt;/span&gt; (SqlConnection connection = &lt;span&gt;new&lt;/span&gt; SqlConnection(ConfigurationManager.ConnectionStrings[&lt;span&gt;"NamesDatabase"&lt;/span&gt;].ConnectionString))&lt;br&gt;    {&lt;br&gt;        connection.Open();&lt;br&gt;&lt;br&gt;        &lt;span&gt;using&lt;/span&gt; (SqlCommand command = connection.CreateCommand())&lt;br&gt;        {&lt;br&gt;            processCommand(command);&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; WorkWithSQLITEDatabase(Action&amp;lt;SQLiteCommand&amp;gt; processCommand)&lt;br&gt;{&lt;br&gt;&lt;br&gt;    &lt;span&gt;using&lt;/span&gt; (SQLiteConnection connection = &lt;span&gt;new&lt;/span&gt; SQLiteConnection(ConfigurationManager.ConnectionStrings[&lt;span&gt;"NamesDatabase"&lt;/span&gt;].ConnectionString))&lt;br&gt;    {&lt;br&gt;        connection.Open();&lt;br&gt;&lt;br&gt;        &lt;span&gt;using&lt;/span&gt; (SQLiteCommand command = connection.CreateCommand())&lt;br&gt;        {&lt;br&gt;            processCommand(command);&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;/pre&gt;

  &lt;br&gt;A jak je asi jasné, zase opakujeme kód, jen s mírnými změnami. Jak to napravit?&lt;/div&gt;

&lt;div&gt;&amp;nbsp;&lt;/div&gt;

&lt;div&gt;Obě třídy, &lt;b&gt;SqlConnection &lt;/b&gt;a &lt;b&gt;SQLiteConnection&lt;/b&gt;, jsou potomky abstraktní třídy &lt;b&gt;&lt;i&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.data.common.dbconnection.aspx"&gt;DbConnection&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;. Stačí tedy celý kód upravit takto:&lt;/div&gt;

&lt;div&gt;&amp;nbsp;&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; WorkWithDatabase(Action&amp;lt;DbCommand&amp;gt; processCommand)&lt;br&gt;{&lt;br&gt;    &lt;span&gt;using&lt;/span&gt; (DbConnection connection = &lt;span&gt;new&lt;/span&gt; SqlConnection(ConfigurationManager.ConnectionStrings[&lt;span&gt;"NamesDatabase"&lt;/span&gt;].ConnectionString))&lt;br&gt;    {&lt;br&gt;        connection.Open();&lt;br&gt;&lt;br&gt;        &lt;span&gt;using&lt;/span&gt; (DbCommand command = connection.CreateCommand())&lt;br&gt;        {&lt;br&gt;            processCommand(command);&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;/pre&gt;

  &lt;br&gt;&lt;/div&gt;

&lt;p&gt;a jediným problémem, který nyní máme je jak vytvořit konkrétní objekt třídy DbConnection – tedy musíme napsat kód, který rozliší s jakou databázi chceme pracovat a následně buď zavolá: &lt;b&gt;new SqlConnection&lt;/b&gt; a nebo &lt;b&gt;new SQLiteConnection.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Tento úkol často vede k řešení, kdy předáváme nějaký textový parameter a na základě jeho hodnoty rozhodujeme, který objekt vytvoříme.&amp;nbsp; Kód pak vypadá nějak takto:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;if&lt;/span&gt; (databasename = &lt;span&gt;"SQLite"&lt;/span&gt;)&lt;br&gt;    connection = &lt;span&gt;new&lt;/span&gt; SQLiteConnection();&lt;br&gt;&lt;br&gt;&lt;span&gt;if&lt;/span&gt; (databasename = &lt;span&gt;"MSSQL"&lt;/span&gt;)&lt;br&gt;    connection = &lt;span&gt;new&lt;/span&gt; SqlConnection();&lt;/pre&gt;

  &lt;br&gt;&lt;/div&gt;

&lt;h2&gt;Vítejte v továrně&lt;/h2&gt;

&lt;p&gt;Předchozí kód není pěkný. Naštěstí MS na toto myslel a používá návrhový vzor &lt;b&gt;&lt;a href="http://en.wikipedia.org/wiki/Factory_method_pattern"&gt;Factory&lt;/a&gt;&lt;/b&gt; přesně pro tuto příležitost – v ADO.NET máme k dispozici &lt;b&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/wda6c36e.aspx"&gt;DbProviderFactory&lt;/a&gt;&lt;/b&gt;. Tato továrna umí vyrobit objekt třídy, kterou určíme – zbývá tady jen vyřešit, kam informaci o tom, který objekt chceme vytvořit, uložíme. A pokud jsme dokázali uložit &lt;b&gt;connectionString&lt;/b&gt; do konfiguračního souboru, bylo by&amp;nbsp; nejlepší tuto informaci uložit tamtéž.&lt;/p&gt;

&lt;p&gt;V uzlu&amp;nbsp; &lt;b&gt;connectionStringu&lt;/b&gt; v &lt;b&gt;App.config&lt;/b&gt; máme možnost definovat i další atributy. Jedním z nich je i &lt;b&gt;providerName&lt;/b&gt;. Tento atribut můžeme použít i v našem kódu a ve spolupráci s&lt;b&gt; DbProviderFactory&lt;/b&gt; ziskat objekt té správné třídy:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;p&gt;&lt;span&gt;public&lt;/span&gt; &lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; WorkWithDatabase(&lt;span&gt;string&lt;/span&gt; connectionName, Action&amp;lt;DbCommand&amp;gt; processCommand)&lt;br&gt;{&lt;br&gt;    &lt;span&gt;string&lt;/span&gt; providerName = ConfigurationManager.ConnectionStrings[connectionName].ProviderName;&lt;br&gt;    &lt;span&gt;string&lt;/span&gt; connectionString = ConfigurationManager.ConnectionStrings[connectionName].ConnectionString;&lt;/p&gt;&lt;p&gt;    DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);&lt;/p&gt;&lt;p&gt;    &lt;span&gt;using&lt;/span&gt; (DbConnection connection = factory.CreateConnection())&lt;br&gt;    {&lt;br&gt;        connection.ConnectionString = connectionString;&lt;br&gt;        connection.Open();&lt;/p&gt;&lt;p&gt;        &lt;span&gt;using&lt;/span&gt; (DbCommand command = connection.CreateCommand())&lt;br&gt;        {&lt;br&gt;                processCommand(command);&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;}&lt;/p&gt;&lt;/pre&gt;Konfigurační soubor &lt;b&gt;App.Config &lt;/b&gt;musí pak obsahovat:&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt; &lt;span&gt;version&lt;/span&gt;&lt;span&gt;="1.0"&lt;/span&gt; &lt;span&gt;encoding&lt;/span&gt;&lt;span&gt;="utf-8"&lt;/span&gt; ?&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;connectionStrings&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;add&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;&lt;span&gt;="NamesDatabase"&lt;/span&gt; &lt;span&gt;connectionString&lt;/span&gt;&lt;span&gt;="Data Source=.\SQLEXPRESS;Initial Catalog=Names;Integrated Security=True;Pooling=False"&lt;/span&gt; &lt;span&gt;providerName&lt;/span&gt;&lt;span&gt;="System.Data.SqlClient"&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;br&gt;    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;connectionStrings&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;&amp;nbsp;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;A naše hlavní metoda se pak změní takto:&lt;/div&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;margin:0em;width:100%;font-family:'Courier New',courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;span&gt;static&lt;/span&gt; &lt;span&gt;void&lt;/span&gt; Main(&lt;span&gt;string&lt;/span&gt;[] args)&lt;br&gt;{&lt;br&gt;    &lt;span&gt;int&lt;/span&gt; id = &lt;span&gt;default&lt;/span&gt;(&lt;span&gt;int&lt;/span&gt;);&lt;br&gt;    &lt;span&gt;string&lt;/span&gt; name = &lt;span&gt;string&lt;/span&gt;.Empty;&lt;br&gt;    &lt;span&gt;string&lt;/span&gt; commandText = &lt;span&gt;string&lt;/span&gt;.Empty;&lt;br&gt;&lt;br&gt;    Action&amp;lt;DbCommand&amp;gt; find = (DbCommand command) =&amp;gt;&lt;br&gt;    {&lt;br&gt;        command.CommandText = commandText;&lt;br&gt;        DbParameter dbParameter;&lt;br&gt;        dbParameter = command.CreateParameter();&lt;br&gt;        dbParameter.ParameterName = &lt;span&gt;"@Name"&lt;/span&gt;;&lt;br&gt;        dbParameter.Value = name;&lt;br&gt;        command.Parameters.Add(dbParameter);&lt;br&gt;&lt;br&gt;        &lt;span&gt;using&lt;/span&gt; (DbDataReader reader = command.ExecuteReader())&lt;br&gt;        {&lt;br&gt;            &lt;span&gt;if&lt;/span&gt; (!reader.HasRows)&lt;br&gt;                Console.WriteLine(&lt;span&gt;"Sorry, nothing found"&lt;/span&gt;);&lt;br&gt;&lt;br&gt;            &lt;span&gt;while&lt;/span&gt; (reader.Read())&lt;br&gt;                Console.WriteLine(reader.GetValue(0));&lt;br&gt;        }&lt;br&gt;    };&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span&gt;"Enter Id to search for:"&lt;/span&gt;); id = &lt;span&gt;int&lt;/span&gt;.Parse(Console.ReadLine());&lt;br&gt;    name = id.ToString();&lt;br&gt;    commandText = &lt;span&gt;"SELECT Name FROM Names WHERE Id=@Name"&lt;/span&gt;;&lt;br&gt;    WorkWithDatabase(&lt;span&gt;"NamesDatabase"&lt;/span&gt;, find);&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span&gt;"Enter name to search for:"&lt;/span&gt;); name = Console.ReadLine();&lt;br&gt;    commandText = &lt;span&gt;"SELECT Id FROM Names WHERE Name=@Name"&lt;/span&gt;;&lt;br&gt;    WorkWithDatabase(&lt;span&gt;"NamesDatabase"&lt;/span&gt;, find);&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span&gt;"Thanks for using."&lt;/span&gt;); Console.ReadLine();&lt;br&gt;}&lt;/pre&gt;

  &lt;br&gt;&lt;/div&gt;

&lt;p&gt;&amp;nbsp;&lt;b&gt;Závěr&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Ukázali jsme si, jak využít konfigurační soubor k uložení informací, které můžeme změnit bez zásahu do kódu a jak napsat obecný kód, který tyto informace bude umět zpracovat. Další vylepšení budou ukázány v pokračování.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx&amp;amp;;title=DRY+%e2%80%93+datab%26%23225%3bze+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx&amp;amp;;title=DRY+%e2%80%93+datab%26%23225%3bze+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx&amp;amp;;title=DRY+%e2%80%93+datab%26%23225%3bze+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx&amp;amp;title=DRY+%e2%80%93+datab%26%23225%3bze+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx&amp;amp;;title=DRY+%e2%80%93+datab%26%23225%3bze+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx&amp;amp;;title=DRY+%e2%80%93+datab%26%23225%3bze+podruh%26%23233%3b&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx&amp;amp;;subject=DRY+%e2%80%93+datab%26%23225%3bze+podruh%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/12/01/dry-datab-ze-podruh.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=237197" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/SqLite/default.aspx">SqLite</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/MS+SQL+Server+20xx/default.aspx">MS SQL Server 20xx</category></item><item><title>Jak na DRY – databáze poprvé</title><link>http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx</link><pubDate>Thu, 25 Nov 2010 19:02:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:237176</guid><dc:creator>mstr</dc:creator><slash:comments>3</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/237176.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=237176</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=237176</wfw:comment><description>&lt;p&gt;Pokud někoho zkratka DRY mate, tak je to zkrácenina anglického&amp;nbsp; &lt;b&gt;&lt;u&gt;D&lt;/u&gt;on’t &lt;u&gt;R&lt;/u&gt;epeat &lt;u&gt;Y&lt;/u&gt;ourself – &lt;/b&gt;neboli “neopakujte se”.&amp;nbsp; Samozřejmě je to ideál a nejde ho vždy a všude dosáhnout, v následujícím článku chci jen ukázat, jak toho docílit v případě práce s databázemi. Dále je ukázáno použít anonymní metody a využití delegátů, konkrétně generického &lt;b&gt;Action&amp;lt;T&amp;gt;&lt;/b&gt;.&lt;/p&gt;  &lt;h2&gt;Velmi jednoduchý úkol&lt;/h2&gt;  &lt;p&gt;Máme jednoduchou databázi s jednou tabulkou, která má všehovšudy jen dva sloupce – &lt;b&gt;Id&lt;/b&gt; a &lt;b&gt;Name&lt;/b&gt; . A potřebujeme napsat aplikaci, která buď na základě zadaného identifikátoru (tj. hodnoty sloupce &lt;b&gt;id&lt;/b&gt;) vyhledá jméno&amp;nbsp; a nebo naopak, na základě zadaného jména vyhledá identifikátor. Nic složitého. &lt;/p&gt;  &lt;p&gt;Naše aplikace bude vypadat takto:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br&gt;&lt;br&gt;{&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Enter Id to search for:"&lt;/span&gt;); &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; id = &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.Parse(Console.ReadLine());&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlConnection connection = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlConnection(&lt;span style="color:#006080;"&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=Names;Integrated Security=True;Pooling=False"&lt;/span&gt;))&lt;br&gt;&lt;br&gt;    {&lt;br&gt;&lt;br&gt;        connection.Open();&lt;br&gt;&lt;br&gt;        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlCommand command = connection.CreateCommand())&lt;br&gt;&lt;br&gt;        {&lt;br&gt;&lt;br&gt;            command.CommandText = &lt;span style="color:#006080;"&gt;"SELECT Name FROM Names WHERE Id="&lt;/span&gt; + id.ToString();&lt;br&gt;&lt;br&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlDataReader reader = command.ExecuteReader())&lt;br&gt;&lt;br&gt;            {&lt;br&gt;&lt;br&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!reader.HasRows)&lt;br&gt;&lt;br&gt;                    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Sorry, no name found"&lt;/span&gt;);&lt;br&gt;&lt;br&gt;                &lt;br&gt;                &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (reader.Read())&lt;br&gt;&lt;br&gt;                    Console.WriteLine(reader.GetString(0));    &lt;br&gt;&lt;br&gt;            }&lt;br&gt;&lt;br&gt;        }&lt;br&gt;&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Enter name to search for:"&lt;/span&gt;); &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name = Console.ReadLine();&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlConnection connection = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlConnection(&lt;span style="color:#006080;"&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=Names;Integrated Security=True;Pooling=False"&lt;/span&gt;))&lt;br&gt;&lt;br&gt;    {&lt;br&gt;&lt;br&gt;        connection.Open();&lt;br&gt;&lt;br&gt;        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlCommand command = connection.CreateCommand())&lt;br&gt;&lt;br&gt;        {&lt;br&gt;&lt;br&gt;            command.CommandText = &lt;span style="color:#006080;"&gt;"SELECT Id FROM Names WHERE Name='"&lt;/span&gt; + name + &lt;span style="color:#006080;"&gt;"'"&lt;/span&gt;;&lt;br&gt;&lt;br&gt;            &lt;br&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlDataReader reader = command.ExecuteReader())&lt;br&gt;&lt;br&gt;            {&lt;br&gt;&lt;br&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!reader.HasRows)&lt;br&gt;&lt;br&gt;                    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Sorry, no id found"&lt;/span&gt;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (reader.Read())&lt;br&gt;&lt;br&gt;                    Console.WriteLine(reader.GetInt32(0));&lt;br&gt;&lt;br&gt;            }&lt;br&gt;&lt;br&gt;        }&lt;br&gt;&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Thanks for using."&lt;/span&gt;);     Console.ReadLine();&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;&lt;font color="#ff0000"&gt;&lt;b&gt;&lt;u&gt;varování: skládání SQL dotazu, tj. použití vstupu od uživatele, nikdy nepoužívejte!&lt;/u&gt;&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;&lt;p&gt;&lt;font color="#000000"&gt;v kódu také&amp;nbsp; není nijak řešeno zachycení chyb, ošetření vstupu od uživatele a podobně.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/b&gt;&lt;/p&gt;&lt;h1&gt;&lt;font color="#000000"&gt;&lt;/font&gt;&lt;/h1&gt;&lt;h2&gt;Zjednodušujeme&lt;/h2&gt;&lt;p&gt;Pokud se na kód pořádně podíváme, zjistíme, že obsahuje na pohled dvakrát stejný kód – vytvoření &lt;b&gt;SqlConnection&lt;/b&gt;, vytvoření&amp;nbsp; &lt;b&gt;SqlCommand &lt;/b&gt;a následně zpracování vrácených záznamů. Přitom kód je praktický stejný až do místa, kde definujeme&lt;b&gt; CommandText&lt;/b&gt;. &lt;/p&gt;&lt;div&gt;Zkusme tedy společný kód vyčlenit do samostatné metody a využít delegáty – delegát je odkaz na metodu. Protože již víme, že se náš kód liší až od místa, kde začínáme pracovat s objektem třídy &lt;b&gt;SqlCommand&lt;/b&gt;, potřebujeme odkaz na metodu, která bude&amp;nbsp; jako parametr akceptovat objekt třídy &lt;b&gt;SqlCommand&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Nejprve tedy vytvoříme metodu pro základní práci s databází:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; WorkWithDatabase(Action&amp;lt;SqlCommand&amp;gt; processCommand) &lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlConnection connection = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlConnection(&lt;span style="color:#006080;"&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=Names;Integrated Security=True;Pooling=False"&lt;/span&gt;))&lt;br&gt;    { &lt;br&gt;        connection.Open(); &lt;br&gt;        &lt;br&gt;        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlCommand command = connection.CreateCommand()) &lt;br&gt;        { &lt;br&gt;            processCommand(command);&lt;br&gt;        } &lt;br&gt;    } &lt;br&gt;}&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;div&gt;V hlavní metodě nyní použijeme anonymní metodu pro práci s objektem třídy &lt;b&gt;SqlCommand&lt;/b&gt;&lt;i&gt; (metodu jsem zjednodušil a upravil tak, aby byla použitelná pro oba typy vyhledávání. Samozřejmě je možné vytvořit více anonymních metod apod)&lt;/i&gt;:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; id = &lt;span style="color:#0000ff;"&gt;default&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;);&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; commandText = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Empty;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;br&gt;    Action&amp;lt;SqlCommand&amp;gt; find = (SqlCommand command) =&amp;gt;&lt;br&gt;        {&lt;br&gt;            command.CommandText = commandText; &lt;br&gt;&lt;br&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlDataReader reader = command.ExecuteReader()) &lt;br&gt;            { &lt;br&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!reader.HasRows)                    &lt;br&gt;                Console.WriteLine(&lt;span style="color:#006080;"&gt;"Sorry, nothing found"&lt;/span&gt;); &lt;br&gt;                &lt;br&gt;                &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (reader.Read())                    &lt;br&gt;                    Console.WriteLine(reader.GetValue(0)); &lt;br&gt;            } &lt;br&gt;&lt;br&gt;        };&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Enter Id to search for:"&lt;/span&gt;); id = &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.Parse(Console.ReadLine());&lt;br&gt;    commandText = &lt;span style="color:#006080;"&gt;"SELECT Name FROM Names WHERE Id="&lt;/span&gt; + id.ToString(); &lt;br&gt;    WorkWithDatabase(find);   &lt;/p&gt;&lt;p&gt;         &lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Enter name to search for:"&lt;/span&gt;); name = Console.ReadLine();&lt;br&gt;    commandText = &lt;span style="color:#006080;"&gt;"SELECT Id FROM Names WHERE Name='"&lt;/span&gt; + name + &lt;span style="color:#006080;"&gt;"'"&lt;/span&gt;;&lt;br&gt;    WorkWithDatabase(find);&lt;br&gt;    &lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Thanks for using."&lt;/span&gt;); Console.ReadLine();&lt;br&gt;}&lt;/p&gt;&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;div&gt;Výhody – základní kód pro práci s databázi teď existuje jen jednou. Při programování se můžeme soustředit jen na to co opravdu chceme dělat (sestavení SQL příkazu) a nemusíme znovu psát (vkládat) opětovně stejný kód.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;h2&gt;Závěr&lt;/h2&gt;&lt;div&gt;Někoho možná napadne, že výše uvedené, za předpokladu, že si vyhledávání a výpis výsledků zjednodušíme, může vypadat i takto:&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br&gt;{&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Enter an Id to search for:"&lt;/span&gt;);&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; id = &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.Parse(Console.ReadLine());&lt;br&gt;    WorkWithDatabase(&lt;span style="color:#006080;"&gt;"SELECT Name FROM Names WHERE Id="&lt;/span&gt; + id.ToString()); &lt;/p&gt;&lt;p&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Enter a name to search for:"&lt;/span&gt;); &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; name = Console.ReadLine();&lt;/p&gt;&lt;p&gt;    WorkWithDatabase(&lt;span style="color:#006080;"&gt;"SELECT Id FROM Names WHERE Name='"&lt;/span&gt; + name + &lt;span style="color:#006080;"&gt;"'"&lt;/span&gt;);&lt;br&gt; &lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Thanks for using."&lt;/span&gt;); Console.ReadLine();&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; WorkWithDatabase(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; commandText) &lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlConnection connection = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlConnection(&lt;span style="color:#006080;"&gt;@"Data Source=.\SQLEXPRESS;Initial Catalog=Names;Integrated Security=True;Pooling=False"&lt;/span&gt;))&lt;br&gt;    { &lt;br&gt;        connection.Open(); &lt;br&gt;        &lt;br&gt;        &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlCommand command = connection.CreateCommand()) &lt;br&gt;        {&lt;br&gt;            command.CommandText = commandText;&lt;br&gt;&lt;br&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlDataReader reader = command.ExecuteReader())&lt;br&gt;            {&lt;br&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!reader.HasRows)&lt;br&gt;                    Console.WriteLine(&lt;span style="color:#006080;"&gt;"Sorry, no name found"&lt;/span&gt;);&lt;br&gt;&lt;br&gt;                &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (reader.Read())&lt;br&gt;                    Console.WriteLine(reader.GetValue(0));&lt;br&gt;            } &lt;br&gt;        } &lt;br&gt;    } &lt;br&gt;}&lt;/p&gt;&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;div&gt;I když by se mohlo zdát, že je to ještě elegantnější a kratší řešení, není tomu tak. Problémy nastanou v okamžiku, kdy budeme chtít s daty z databáze pracovat jinak, budeme muset psát další a další metody podobné metodě &lt;b&gt;WorkWithDatabase&lt;/b&gt; a tak opět spadneme do původního kódu a porušíme princip DRY. &lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;V některém příštím pokračování ukážu, jak udělat řešení ještě univerzálnější.&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx&amp;amp;;title=Jak+na+DRY+%e2%80%93+datab%26%23225%3bze+poprv%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx&amp;amp;;title=Jak+na+DRY+%e2%80%93+datab%26%23225%3bze+poprv%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx&amp;amp;;title=Jak+na+DRY+%e2%80%93+datab%26%23225%3bze+poprv%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx&amp;amp;title=Jak+na+DRY+%e2%80%93+datab%26%23225%3bze+poprv%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx&amp;amp;;title=Jak+na+DRY+%e2%80%93+datab%26%23225%3bze+poprv%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx&amp;amp;;title=Jak+na+DRY+%e2%80%93+datab%26%23225%3bze+poprv%26%23233%3b&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx&amp;amp;;subject=Jak+na+DRY+%e2%80%93+datab%26%23225%3bze+poprv%26%23233%3b" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/25/jak-na-dry-datab-ze-poprv.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=237176" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/MS+SQL+Server+20xx/default.aspx">MS SQL Server 20xx</category></item><item><title>Budíček dle Apple – aneb pracujeme s datem a časem</title><link>http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx</link><pubDate>Sat, 20 Nov 2010 21:19:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:237159</guid><dc:creator>mstr</dc:creator><slash:comments>7</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/237159.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=237159</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=237159</wfw:comment><description>&lt;p&gt;Asi jste zaznamenali, že nové telefony od Apple měli tento rok problém probudit své šťastné majitele po změně letního času. Přesnou příčinu nevím, ale protože práce s datem a časem není úplně triviální pokusím se zde shrnout některé zásady a ukázat, kam jejich porušení může vést.&lt;/p&gt;  &lt;h2&gt;Časová pásma&lt;/h2&gt;  &lt;p&gt;Na různých místech jsou různé časy – to je asi známé. Zatímco v Brně obědváme, v New Yorku se lidé teprve probouzejí a naopak v&amp;nbsp; australském&amp;nbsp; Perthu jsou lidé už pomalu po večeři. Ostatně si můžete i na svém desktopu umístit několik hodin ukazujících časy na různých místech. A nebo si můžete čas přepočítat na těchto &lt;a href="http://www.timeanddate.com/worldclock/converter.html"&gt;stránkách&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Aby v tom byl pořádek, rozdělil se svět na časové zóny. Každá zóna má svůj název a definovanou odchylku&amp;nbsp; od UTC (Universal Time Coordinate) – což je zjednodušeně řečeno čas na nultém poledníku, který prochází &lt;a href="http://en.wikipedia.org/wiki/Greenwich"&gt;Greenwich&lt;/a&gt;&amp;nbsp; (část Londýna). Česká republika tak leží v zóně s názvem &lt;b&gt;Central Europe Standard Time&lt;/b&gt; s ochylkou&amp;nbsp; +1:00 od UTC – což znamená, že pokud je UTC = 9 hodin, je u&amp;nbsp; nás 10, tedy o hodinu více (proto to znaménko &lt;b&gt;plus +&lt;/b&gt;). Naopak v Rio De&amp;nbsp; Janeiro, které se nachází v pásmu –2:00&amp;nbsp; je 7 hodin, tedy o dvě hodiny méně (což je symbolizováno znamením &lt;b&gt;mínus -&lt;/b&gt;).&lt;/p&gt;  &lt;p&gt;Co je ještě důležité vědět: UTC bývá také nazýváno jako Zulu či GMT a&amp;nbsp; odchylka nemusí být nutně v celých hodinách, ale je běžná i odchylka například o 5 hodin a 30 minut.&lt;/p&gt;  &lt;h2&gt;DST – ďáblův dar&lt;/h2&gt;  &lt;p&gt;DST je zkratka &lt;b&gt;Daylight saving time&lt;/b&gt;, u nás známá jako letní čas. Prakticky se projevuje tak, že se na jaře vyspíte o hodinu méně a poté obíháte hodiny v bytě a posunujete ručičku dopředu, aby jste si totéž zopakovali na podzim s tím, že sílu na posunutí ručičky dozadu můžete načerpat během hodiny, o kterou se váš spánek prodlouží. Praktický smysl to nemá a programátorům to jen komplikuje život – protože ve skutečnosti jsme předefinovali chování časové zóny – pokud jsem v předchozí stati uvedl, že je u nás 10 hodin, byl správný zápis tohoto údaje 10:00 UTC+1:00. Ale jakmile přejdeme na DST, letní čas, máme sice i nadále 10 hodin, ale posuv vůči UTC jsou dvě hodiny a správný zápis je 10:00 UTC+2:00. A název zóny zní najednou ….&lt;/p&gt;  &lt;p&gt;To ještě není to nejhorší – protože DST je výmysl politiků, není datum zavedení DST&amp;nbsp; jednotné. Spojené státy tak přechází na DST o dva týdny dříve a časový rozdíl mezi NewYorkem a Prahou není tak šest hodin, ale jen pět. &lt;/p&gt;  &lt;h2&gt;Základní .NET třídy-struktury pro práci s časem&lt;/h2&gt;  &lt;p&gt;V prostředí .NET jsou k dispozici třídy DateTime a TimeZone. DateTime slouží k vyjádření času, který může být jednoho z těchto typů":&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;local&lt;/li&gt;    &lt;li&gt;universal&lt;/li&gt;    &lt;li&gt;unspecified&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Local znamená, že hodnota vyjadřuje čas v zóně, ve které se nachází počítač. Universal je pak čas UTC. Unspecified označuje jakýkoliv čas mimo dva předešlé. Pro práci platí tyto hlavní zásady:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;b&gt;pracujeme (=provádíme operace) vždy s&amp;nbsp; univerzálním časem&lt;/b&gt;&lt;/li&gt;    &lt;li&gt;&lt;b&gt;lokální čas používáme jen při zpracování vstupu od uživatele a při prezentaci výsledku uživateli&lt;/b&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Porušení těchto zásad vede v zásadě k chybnému programu.&amp;nbsp; Pokusím se to ukázat na následujícím příkladu, kdy program počítá vždy čas za hodinu:&lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;DateTime currentTime = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DateTime(2011, 3, 27, 1, 30, 0, 0, DateTimeKind.Local);&lt;br&gt;DateTime futureTime = currentTime.AddHours(1);&lt;br&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"{0:o} - {1:o}"&lt;/span&gt;, currentTime, futureTime);&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;A co dostaneme:&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_58D259E3.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="563" height="19" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_2C4929FD.png"&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;Tento výsledek je špatně – 27.3.2011 přecházíme na letní čas a 2:30 tedy vůbec nebude. Správně by se všechny výpočty měli provádět v UTC:&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;DateTime currentTime = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DateTime(2011, 3, 27, 1, 30, 0, 0, DateTimeKind.Local);&lt;br&gt;DateTime futureTime = currentTime.ToUniversalTime().AddHours(1).ToLocalTime();&lt;br&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"{0:o} - {1:o}"&lt;/span&gt;, currentTime, futureTime);&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;div&gt;a poté již dostaneme správný výsledek:&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_57218E0F.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="561" height="21" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_5DD49792.png"&gt;&lt;/a&gt;&amp;nbsp; &lt;br&gt;Třída TimaZone nám dokáže zejména vracet údaje pro časovou zónu počítače, na kterém běží naše aplikace.&amp;nbsp; Její praktické použití je tak omezené.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;h2&gt;Ukládáme čas&lt;/h2&gt;&lt;p&gt;Ukládání časových údajů se řídí zásadami, které vyplývají z hlavních zásad:&lt;/p&gt;&lt;ul&gt;  &lt;li&gt;ukládáme vždy čas v UTC &lt;/li&gt;  &lt;li&gt;ukládáme údaj identifikující časovou zónu uživatele&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Představme si, že jsme si uložili čas jako řetězec a to pro účely buzení uživatele. Čas jsme ukládali v létě a uložili jsme si tuto hodnotu a uložili jsme si údaj v lokálním čase uživatele a uložili jsme si ho včetně posunu – prostě tak, jako kdybychom plně nepochopili význam výše uvedených pravidel. Poté se pokusíme každý den určit, kdy uživatele probudit.&lt;/p&gt;&lt;div&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;DateTime wakeUpTime = DateTime.Parse(&lt;span style="color:#006080;"&gt;"6:00+2:00"&lt;/span&gt;);&lt;br&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"{0:o}"&lt;/span&gt;, wakeUpTime);&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;a program funguje, pěkne nás vzbudí:  &lt;br&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_4F961EA2.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="272" height="18" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_6B3AAA98.png"&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;Jenže pak se změní čas a doposud bezchybný program nás začne budit o hodiny dříve:&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_1D324B23.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="273" height="20" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_5CFC31A8.png"&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;Takže takto bychom čas ukládat určitě neměli – vždy ho ukládáme nejlépe v UTC a s informací o zóně, kde má původ. Časový posun vůči UTC tímto údajem rozhodně není, neboť&amp;nbsp; se může díky DST změnit.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;h2&gt;Globalizujeme&lt;/h2&gt;&lt;p&gt;s výše uvedenými věcmi nešlo vystačit. Programátoři&amp;nbsp; se mohli setkat například s požadavkem, aby na počítači v Praze zobrazili mimo místního pražského času i čas v Los Angeles. Tento úkol není tak triviální jak se může zdát – někteří jej řešili tak, že od místního času odečetli devět hodin (Praha je v zoně UTC+1:00, Los Angeles v zoně UTC-8:00, rozdíl devět hodin a stačí tedy napsat:&lt;/p&gt;&lt;div&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;DateTime currentTime = DateTime.Now;&lt;br&gt;DateTime losAngelesTime =  currentTime.AddHours(-9);&lt;br&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"{0:o} - {1:o}"&lt;/span&gt;, currentTime, losAngelesTime);&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Program nám vypíše:&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_6ED8C575.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="563" height="18" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_2EA2ABFB.png"&gt;&lt;/a&gt;   &lt;br&gt;Na první pohled vypadá vše v pořádku. Můžeme si ale všimnout, že čas Los Angeles má chybně vyjádřený posuv. A celý příklad obsahuje ještě jednu chybu -&amp;nbsp; nebere v úvahu DST. Tři týdny v roce bude tedy přepočet chybný. &lt;/div&gt;&lt;div&gt;Uvádění časového posunu se můžeme samozřejmě vyhnout, ale DST chybu odstraníme stěží. Naštěstí máme v .NET 3.5 více možností – je zde nová struktura&lt;b&gt; DateTimeOffset&lt;/b&gt; a nová třída pro práci s časovými zónami &lt;b&gt;TimeZoneInfo&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;h2&gt;DateTimeOffset&lt;/h2&gt;&lt;div&gt;je vlastně rozšířením &lt;b&gt;DateTime&lt;/b&gt;, ale mim datumu a&amp;nbsp; času drží i informaci o posunu vůči UTC. Jinak se ničím neliší a při práci s ní je nutno dodržovat veškeré zásady práce s &lt;b&gt;DateTime&lt;/b&gt;. &lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Následující příklad sice vyřeší správné zobrazení, ale pořád je tam skrytá chyba při přechodu na letní čas a naopak:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;DateTime currentTime = DateTime.Now;&lt;br&gt;DateTime losAngelesTime = DateTime.SpecifyKind(currentTime.AddHours(-9), DateTimeKind.Unspecified);&lt;br&gt;DateTimeOffset formattedLosAngelesTime = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DateTimeOffset(losAngelesTime, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; TimeSpan( -8, 0, 0));&lt;br&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"fff{0:o} - {1:o}"&lt;/span&gt;, currentTime, formattedLosAngelesTime);&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Výpis bude obsahovat správné časové posuny vůči UTC:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_69F611B9.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="562" height="19" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_2DCA4611.png"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Ale pozor, jak se můžeme přesvědčit, budou tyto údaje zobrazovány i v okamžiku, kdy je časová zóna v Los Angeles stále v zóně -7:00&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_424F958F.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="560" height="20" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_41E3629A.png"&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;Proto existuje třída &lt;b&gt;TimeZoneInfo&lt;/b&gt;.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;h2&gt;TimeZoneInfo&lt;/h2&gt;&lt;div&gt;Pomocí této třídy si můžeme vytvořit objekt pro danou časovou zónu a s jeho pomocí vytvářet časy, které jsou platné v této časové zóně. Navíc nám statická metoda této třídy zpřístupňuje seznam všech časových zón tak, jak jsou definovány v OS a udržovány pomocí aktualizací Microsoftem. Měli bychom tak mít zaručenou aktualizaci&amp;nbsp; pokud dojde ke změně.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;TimeZoneInfo pacificTimeZone = TimeZoneInfo.FindSystemTimeZoneById(&lt;span style="color:#006080;"&gt;"Pacific Standard Time"&lt;/span&gt;);&lt;br&gt;DateTime currentUtcTime = DateTime.UtcNow;&lt;br&gt;DateTime currentLosAngelesTime =  TimeZoneInfo.ConvertTimeFromUtc(currentUtcTime, pacificTimeZone);&lt;br&gt;&lt;br&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"{0:o}"&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DateTimeOffset(currentLosAngelesTime, pacificTimeZone.GetUtcOffset(currentLosAngelesTime)));&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Jak během normálního, tak i zimního času dostaneme správný tvar, během letního (DST):&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_48966C1D.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="272" height="21" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_41772FA5.png"&gt;&lt;/a&gt; &lt;/div&gt;&lt;div&gt;tak i&amp;nbsp; v zimním období:&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_410AFCB0.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="272" height="20" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_0BFE6D80.png"&gt;&lt;/a&gt; &lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Objekty třídy &lt;b&gt;TimeZoneInfo&lt;/b&gt; nám zpřístupňují mnoho informací o dané časové zóně. řeknou nám, jestli daný čas v dané zoně vůbec existuje (v případě, že se přechází ze zimního na letní čas, chybí nám celá hodina od 2 do 3 ráno) a nebo naopak jestli daný čas neexistuje dvakrát (pokud přecházíme z letního na zimní čas opakuje se v noci celá hodina od 2 do 3 ráno. Objekt nám pro dané datum a čas je schopen vrátit správnou odchylku od UTC. Některé možnosti&amp;nbsp; jsou zachyceny v přechozí ukázce i následující ukázce: &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;p&gt;TimeZoneInfo centralEuropeTimeZone = TimeZoneInfo.FindSystemTimeZoneById(&lt;span style="color:#006080;"&gt;"Central Europe Standard Time"&lt;/span&gt;);&lt;br&gt;&lt;br&gt;&lt;span style="color:#008000;"&gt;//31.10. 2010 - 2:30 AM&lt;/span&gt;&lt;br&gt;DateTime shiftSummerWinterTime = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DateTime(2010, 10, 31, 2, 30, 0, DateTimeKind.Unspecified);&lt;br&gt;&lt;span style="color:#008000;"&gt;//27.3. 2011 - 2:30 AM&lt;/span&gt;&lt;br&gt;DateTime shiftWinterSummerTime = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DateTime(2011, 3, 27, 2, 30, 0, DateTimeKind.Unspecified);&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"Summer to winter - two possibilities? {0}"&lt;/span&gt;, centralEuropeTimeZone.IsAmbiguousTime(shiftSummerWinterTime));  &lt;span style="color:#008000;"&gt;// true&lt;/span&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"Summer to winter - exists? {0}"&lt;/span&gt;, !centralEuropeTimeZone.IsInvalidTime(shiftSummerWinterTime)); &lt;span style="color:#008000;"&gt;//true&lt;/span&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"Winter to summer - two possibilities? {0}"&lt;/span&gt;, centralEuropeTimeZone.IsAmbiguousTime(shiftWinterSummerTime)); &lt;span style="color:#008000;"&gt;//false&lt;/span&gt;&lt;br&gt;Console.WriteLine(&lt;span style="color:#006080;"&gt;"Winter to summer - exists?{0}"&lt;/span&gt;, !centralEuropeTimeZone.IsInvalidTime(shiftWinterSummerTime)); &lt;span style="color:#008000;"&gt;//false&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#008000;"&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (var zone &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; TimeZoneInfo.GetSystemTimeZones())&lt;br&gt;{&lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"{0} {1} {2} {3} {4} {5}"&lt;/span&gt;,&lt;br&gt;                zone.Id,                            &lt;span style="color:#008000;"&gt;//Central Europe Standard Time&lt;/span&gt;&lt;br&gt;                zone.StandardName,                    &lt;span style="color:#008000;"&gt;//Central Europe Standard Time&lt;/span&gt;&lt;br&gt;                zone.DisplayName,                    &lt;span style="color:#008000;"&gt;//(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague&lt;/span&gt;&lt;br&gt;                zone.DaylightName,                    &lt;span style="color:#008000;"&gt;//Central Europe Daylight Time&lt;/span&gt;&lt;br&gt;                zone.BaseUtcOffset,                    &lt;span style="color:#008000;"&gt;//01:00:00&lt;/span&gt;&lt;br&gt;                zone.SupportsDaylightSavingTime        &lt;span style="color:#008000;"&gt;//true&lt;/span&gt;&lt;br&gt;                );&lt;br&gt;}&lt;br&gt;&lt;/p&gt;&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;A nakonec ještě stručné schéma jak správně pracovat s časy a datumy:&lt;/p&gt;&lt;p&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_12B17703.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="image" border="0" alt="image" width="388" height="484" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_188C1A9C.png"&gt;&lt;/a&gt; Poznámka: ukázky v tomto příspěvku byly spouštěny na PC ve středoevropském časovém pásmu, kde 31.10.2010 došlo k přechodu na zimní čas a 27.3. 2011 dojde k přechodu na letní čas.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx&amp;amp;;title=Bud%26%23237%3b%c4%8dek+dle+Apple+%e2%80%93+aneb+pracujeme+s+datem+a+%c4%8dasem" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx&amp;amp;;title=Bud%26%23237%3b%c4%8dek+dle+Apple+%e2%80%93+aneb+pracujeme+s+datem+a+%c4%8dasem" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx&amp;amp;;title=Bud%26%23237%3b%c4%8dek+dle+Apple+%e2%80%93+aneb+pracujeme+s+datem+a+%c4%8dasem" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx&amp;amp;title=Bud%26%23237%3b%c4%8dek+dle+Apple+%e2%80%93+aneb+pracujeme+s+datem+a+%c4%8dasem" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx&amp;amp;;title=Bud%26%23237%3b%c4%8dek+dle+Apple+%e2%80%93+aneb+pracujeme+s+datem+a+%c4%8dasem" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx&amp;amp;;title=Bud%26%23237%3b%c4%8dek+dle+Apple+%e2%80%93+aneb+pracujeme+s+datem+a+%c4%8dasem&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx&amp;amp;;subject=Bud%26%23237%3b%c4%8dek+dle+Apple+%e2%80%93+aneb+pracujeme+s+datem+a+%c4%8dasem" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/20/bud-ek-dle-apple-aneb-pracujeme-s-datem-a-asem.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=237159" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Ukázky kódu z knížek je třeba brát s rezervou</title><link>http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx</link><pubDate>Tue, 09 Nov 2010 23:22:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:237128</guid><dc:creator>mstr</dc:creator><slash:comments>9</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/237128.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=237128</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=237128</wfw:comment><description>&lt;p&gt;V knížce Pro ASP.NET MVC 2 Framework&amp;nbsp; (Apress, S. Sanderson) se autor věnuje i novým vlastnostem C# 3.0 a líčí jak s pomocí Linqu&amp;nbsp; realizovat doteď pracné operace (kapitola C# 3 Language Features, stránka 78) . Pro demonstraci si vybral kod pro vyběr&amp;nbsp; tří největších hodnot z pole čísel a uvádí tento kód jako příklad toho, jak se tento problém dosud řešil: &lt;/p&gt;  &lt;div&gt;   &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] FindMaxValuesNet2(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; number, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] unsortedValues)&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] localCopy = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[unsortedValues.Length];&lt;br&gt;&lt;br&gt;    unsortedValues.CopyTo(localCopy, 0);&lt;br&gt;&lt;br&gt;    Array.Sort(localCopy);&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] returnValues = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[number];&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; number; index++)&lt;br&gt;    {&lt;br&gt;        returnValues[index] = localCopy[localCopy.Length - 1 - index];&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; returnValues;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;aby hned ukázal, jak to lze řešit v .NET 3 za použití Linqu:&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; IEnumerable&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt; FindMaxValuesNet3(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; number, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] unsortedValues)&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (from &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; unsortedValues orderby &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt; descending select &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;).Take(number);&lt;br&gt;}&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;p&gt;&lt;i&gt;(poznámka: původní ukázky jsem upravil – doplnil jsem obálku metod, počet vyhledaných čísel je předáván parametrem a kopii pole používám aby nedošlo k narušení&amp;nbsp; pořadí původního pole).&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Autor vyzdvihuje jednoduchost a přehlednost kódu – a čtenář může nabýt dojmu, že oba přístupy jsou shodné i co se týče rychlosti a jediné správné.&amp;nbsp; Zkusil jsem si proto&amp;nbsp; změřit jak dlouho to trvá, tedy porovnat Linq s autorovým klasickým přístupem:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div id="codeSnippetWrapper"&gt;  &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br&gt;{&lt;br&gt;    Random random = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Random();&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] unsortedRandomValues = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[100000];&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; unsortedRandomValues.Length; index++)&lt;br&gt;    {&lt;br&gt;        unsortedRandomValues[index] = random.Next();&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    MeasureTakenTime(3, unsortedRandomValues, FindMaxValuesNet2);&lt;br&gt;    MeasureTakenTime(3, unsortedRandomValues, FindMaxValuesNet3);&lt;br&gt;&lt;br&gt;    Console.ReadLine();&lt;br&gt;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; MeasureTakenTime(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; number, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] unsortedValues, Func&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[], IEnumerable&amp;lt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; find)&lt;br&gt;{&lt;br&gt;    Stopwatch stopwatch = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br&gt;&lt;br&gt;    stopwatch.Start();&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; numbers = &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Join(&lt;span style="color:#006080;"&gt;","&lt;/span&gt;, find(number, unsortedValues));&lt;br&gt;    stopwatch.Stop();&lt;br&gt;&lt;br&gt;    Console.WriteLine(&lt;span style="color:#006080;"&gt;"{0}, {1} ms: {2}"&lt;/span&gt;, find.Method.Name,  stopwatch.ElapsedMilliseconds, numbers);&lt;br&gt;}&lt;/pre&gt;  &lt;br&gt;&lt;/div&gt;&lt;div&gt;a výsledky?&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_2816273E.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="473" height="32" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_273DC154.png"&gt;&lt;/a&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Klasický přístup&amp;nbsp; (klasický dle autora) je čtyřikrát rychlejší než nový &lt;i&gt;cool&lt;/i&gt; způsob pomocí Linqu.    &lt;br&gt;    &lt;br&gt;Jenže ani to, co autor vydává za klasický přístup není zrovna optimální. Kopie pole, přetřídění……Přitom stačí něco jednoduchého:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] FindMaxValues(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; number, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] unsortedValues)&lt;br&gt;{&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] foundValues = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[number];&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; lowestValueIndex = number - 1;&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; foundValues.Length; index++)&lt;br&gt;        foundValues[index] = &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.MinValue;&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; unsortedIndex = 0; unsortedIndex &amp;lt; unsortedValues.Length; unsortedIndex++)&lt;br&gt;    {&lt;br&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (unsortedValues[unsortedIndex] &amp;lt; foundValues[lowestValueIndex])&lt;br&gt;            &lt;span style="color:#0000ff;"&gt;continue&lt;/span&gt;;&lt;br&gt;&lt;br&gt;        &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; foundValues.Length; index++)&lt;br&gt;        {&lt;br&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (unsortedValues[unsortedIndex] &amp;gt; foundValues[index])&lt;br&gt;            {&lt;br&gt;                Array.Copy(foundValues, index, foundValues, index + 1, foundValues.Length -1- index);&lt;br&gt;                foundValues[index] = unsortedValues[unsortedIndex];&lt;br&gt;                &lt;span style="color:#0000ff;"&gt;break&lt;/span&gt;;&lt;br&gt;            }&lt;br&gt;        }&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; foundValues;&lt;br&gt;}&lt;/pre&gt;    &lt;br&gt;&lt;/div&gt;  &lt;div&gt;a výsledky vypadají&amp;nbsp; hned jinak:&lt;/div&gt;  &lt;div&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_71C4FF2E.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="476" height="44" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_7F974529.png"&gt;&lt;/a&gt;     &lt;br&gt;Výše uvedené platí pro&amp;nbsp; sto tisíc položek, ale pokud bychom chtěli prohledat deset milionů:&lt;/div&gt;  &lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;    &lt;pre style="border-bottom-style:none;text-align:left;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:'Courier New', courier, monospace;direction:ltr;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;" id="codeSnippet"&gt;&lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br&gt;{&lt;br&gt;    Random random = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Random();&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] unsortedRandomValues = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[10000000];&lt;br&gt;&lt;br&gt;    &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; index = 0; index &amp;lt; unsortedRandomValues.Length; index++)&lt;br&gt;    {&lt;br&gt;        unsortedRandomValues[index] = random.Next();&lt;br&gt;    }&lt;br&gt;&lt;br&gt;    MeasureTakenTime(3, unsortedRandomValues, FindMaxValuesNet2);&lt;br&gt;    MeasureTakenTime(3, unsortedRandomValues, FindMaxValuesNet3);&lt;br&gt;    MeasureTakenTime(3, unsortedRandomValues, FindMaxValues);&lt;br&gt;    Console.ReadLine();&lt;br&gt;}&lt;/pre&gt;  &lt;/div&gt;  &lt;div&gt;je rozdil ještě výraznější (uznávám, že je to extrémní příklad, ale pěkně na něm vyniknou odlišnosti):&lt;/div&gt;  &lt;div&gt;    &lt;br&gt;&lt;a href="http://blog.vyvojar.cz/blogs/mstr/image_6D4E7E67.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="image" border="0" alt="image" width="491" height="46" src="http://blog.vyvojar.cz/blogs/mstr/image_thumb_2D1864ED.png"&gt;&lt;/a&gt; &lt;/div&gt;  &lt;div&gt;Zkrátka implementace algoritmu dvacetkrát rychlejší než autorem uváděný “klasický postup” a i ten je téměř sedmkrát rychlejší než Linq.&lt;/div&gt;  &lt;div&gt;&amp;nbsp;&lt;/div&gt;  &lt;div&gt;Z výše uvedeného je vidět, že studium “klasických” algoritmů a postupů má pořád smysl a že příklady v knížkách je potřeba brát s rezervou.&amp;nbsp; Samozřejmě že někdy (často) je lepší rychleji naprogramovat, než ladit&amp;nbsp; složitější kód implementující algoritmus – ale občas mám pocit, že se na původní postupy úplně zapomíná – viz knížka, ze které jsem uváděl příklady.    &lt;br&gt;&lt;/div&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx&amp;amp;;title=Uk%26%23225%3bzky+k%26%23243%3bdu+z+kn%26%23237%3b%c5%beek+je+t%c5%99eba+br%26%23225%3bt+s+rezervou" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx&amp;amp;;title=Uk%26%23225%3bzky+k%26%23243%3bdu+z+kn%26%23237%3b%c5%beek+je+t%c5%99eba+br%26%23225%3bt+s+rezervou" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx&amp;amp;;title=Uk%26%23225%3bzky+k%26%23243%3bdu+z+kn%26%23237%3b%c5%beek+je+t%c5%99eba+br%26%23225%3bt+s+rezervou" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx&amp;amp;title=Uk%26%23225%3bzky+k%26%23243%3bdu+z+kn%26%23237%3b%c5%beek+je+t%c5%99eba+br%26%23225%3bt+s+rezervou" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx&amp;amp;;title=Uk%26%23225%3bzky+k%26%23243%3bdu+z+kn%26%23237%3b%c5%beek+je+t%c5%99eba+br%26%23225%3bt+s+rezervou" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx&amp;amp;;title=Uk%26%23225%3bzky+k%26%23243%3bdu+z+kn%26%23237%3b%c5%beek+je+t%c5%99eba+br%26%23225%3bt+s+rezervou&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx&amp;amp;;subject=Uk%26%23225%3bzky+k%26%23243%3bdu+z+kn%26%23237%3b%c5%beek+je+t%c5%99eba+br%26%23225%3bt+s+rezervou" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2010/11/10/uk-zky-k-du-v-kn-k-ch.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=237128" width="1" height="1"&gt;</description><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>LINQ - jak na dynamickou podmínku</title><link>http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx</link><pubDate>Sun, 14 Dec 2008 09:49:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228784</guid><dc:creator>mstr</dc:creator><slash:comments>2</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/228784.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=228784</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=228784</wfw:comment><description>&lt;P&gt;LINQ asi není potřeba nijak detailně představovat. Asi každý .NET vývojář se již setkal s LINQem, nejčastěji ve formě dotazu, kde byla jeho podoba již programově dána a měnit se mohl snad jen nějaký parameter dotazu:&lt;/P&gt; &lt;DIV&gt; &lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="color:#0000ff;"&gt;void&lt;/SPAN&gt; Linq1() &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt;[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    var lowNums =  from n &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; numbers&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;                   &lt;SPAN style="color:#0000ff;"&gt;where&lt;/SPAN&gt; n &amp;lt; 5&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;                   select n;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt; (var x &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; lowNums) &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    {&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        Console.WriteLine(x);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    }&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;Poznámka: tento příklad byl převzat ze stránky &lt;A href="http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx" target="_blank"&gt;101  LINQ Samples&lt;/A&gt; - výborný zdroj pro studium.&lt;/P&gt;
&lt;P&gt;Jak to ale řešit, pokud chceme podmínku sestavit dynamicky, například provozujeme realitní server a chceme jej rozšířit o službu, která na základě zaslaných podmínek v textové podobě vrátí seznam vyhovujících nemovitosti?&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Databáze nemovitostí&lt;/H2&gt;
&lt;P&gt;Řešení se pokusím vysvětli v tomto článku. Příklad bude maximálně zjednodušen, proto nebudeme dělat žádné rozhraní webové služby, ale spokojíme se s výstupem na konzolu. Též náše realitní databáze bude maximálně zjednodušena a u každého objektu si budeme držet jen tři údaje:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;název místa, kde nemovitost leží&lt;/LI&gt;
&lt;LI&gt;typ nemovitosti (výběr z číselníku)&lt;/LI&gt;
&lt;LI&gt;počet ložnic&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Class diagram pak vypádá takto:&lt;/P&gt;
&lt;P align="center"&gt;&lt;A href="http://blog.vyvojar.cz/blogs/mstr/WindowsLiveWriter/LINQjaknadynamickoupodmnku_8BFD/ClassDiagram1_2.png"&gt;&lt;IMG style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" border="0" alt="ClassDiagram1" src="http://blog.vyvojar.cz/blogs/mstr/WindowsLiveWriter/LINQjaknadynamickoupodmnku_8BFD/ClassDiagram1_thumb.png" width="370" height="203"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;Naším vstupem pak bude řetězec ve tvaru: &lt;STRONG&gt;&lt;EM&gt;Název vlastnosti:přípustné hodnoty|Název vlastnosti: přípustné hodnoty&lt;/EM&gt;&lt;/STRONG&gt;, &lt;/P&gt;
&lt;P&gt;Při předání řetězce "&lt;STRONG&gt;Location:Humpolec, Polna|PropertyType:Castle,Flat,Chateu,TerraceHouse|Bedrooms:1-20&lt;/STRONG&gt;" budeme očekávat seznam všech bytů, zámků a hradů s dvěmi až dvaceti ložnicemi nacházejícími se v lokalitě Polná a Humpolec. Při předání řetězce "&lt;STRONG&gt;Bedrooms:5-10|PropertyType:Castle&lt;/STRONG&gt;" pak zase seznam všech hradů s pěti až deseti ložnicemi.&lt;/P&gt;
&lt;P&gt;Potřebovali bychom tedy nějak dynamicky sestavit omezující podmínku výběru, neboli filtr, neboli predikát - tedy pokud bych použil příklad ze začátku článku, potřebujeme dynamicky sestavit část "&lt;SPAN style="color:#0000ff;"&gt;where&lt;/SPAN&gt; n &amp;lt; 5". &lt;/P&gt;
&lt;P&gt;To vyřešíme tak, že si definujeme metody pro sestavení každého filtru (predikátu), který bychom mohli potřebovat. Náš případ je zjednodušený - máme tři vlastnosti podle kterých chceme vyhledávat, budeme tedy definovat tři metody pro:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;získání predikátu omezujícího na základě lokality&lt;/LI&gt;
&lt;LI&gt;získání predikátu omezujícího na základě typu nemovitosti&lt;/LI&gt;
&lt;LI&gt;získání predikátu omezujícího na základě rozsahu počtu ložnic&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Příprava - převedení řetězce na hodnotu z číselníku&lt;/H2&gt;
&lt;P&gt;Požadovaný  typ nemovitosti je předáván ve formě řetězce, kde jsou jednotlivé typy oddělené čárkou. Tento řetězec musíme převést na kolekci hodnot našeho enumerátoru. K tomu nám poslouží statická funkce:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="color:#0000ff;"&gt;static&lt;/SPAN&gt; IEnumerable&amp;lt;PropertyType&amp;gt; GetPropertyTypesFromString(&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; types)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   List&amp;lt;PropertyType&amp;gt; propertyTypes = &lt;SPAN style="color:#0000ff;"&gt;new&lt;/SPAN&gt; List&amp;lt;PropertyType&amp;gt;();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   PropertyType propertyType;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   var rawPropertyTypes = types.Split(&lt;SPAN style="color:#006080;"&gt;","&lt;/SPAN&gt;.ToCharArray());&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   &lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; rawPropertyType &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; rawPropertyTypes)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   {&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;      propertyType = (PropertyType) Enum.Parse(&lt;SPAN style="color:#0000ff;"&gt;typeof&lt;/SPAN&gt;(PropertyType), rawPropertyType);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;      propertyTypes.Add(propertyType);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   }&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   &lt;SPAN style="color:#0000ff;"&gt;return&lt;/SPAN&gt; propertyTypes;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Metody pro získání predikátů&lt;/H2&gt;
&lt;P&gt;Bude se jednat o statické metody. Pro získání predikátu omezujího na základě lokality nemovitosti použijeme tuto statickou metodu:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="color:#0000ff;"&gt;static&lt;/SPAN&gt; Expression&amp;lt;Func&amp;lt;IRealProperty, &lt;SPAN style="color:#0000ff;"&gt;bool&lt;/SPAN&gt;&amp;gt;&amp;gt; IsInLocation(&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; locations)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;     var predicate = PredicateBuilder.False&amp;lt;IRealProperty&amp;gt;();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;     var rawLocations = locations.Split(&lt;SPAN style="color:#006080;"&gt;","&lt;/SPAN&gt;.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;     &lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; location &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; rawLocations)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;     {&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; tempLocation = location.Trim();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        predicate = predicate.Or(p =&amp;gt; p.Location.Contains(tempLocation));&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;     }&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;     &lt;SPAN style="color:#0000ff;"&gt;return&lt;/SPAN&gt; predicate;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Pokud by snad někoho zarážel příkaz &lt;STRONG&gt;&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; tempLocation = location.Trim();&lt;/STRONG&gt; - je tam jednoduše proto, že LINQ věci se vykonávají v okamžiku, kdy jsou použity, ne kdy jsou definovány. Pokud bychom tento řádek vynechaly a další řádek použili ve tvaru &lt;STRONG&gt;predicate = predicate.Or(p =&amp;gt; p.Location.Contains(location));&lt;/STRONG&gt; byla by použita hodnota proměnné &lt;STRONG&gt;location&lt;/STRONG&gt; v okamžiku volání, tedy v tomto případě poslední název lokace. Díky příkazu &lt;STRONG&gt;&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; tempLocation = location.Trim();&lt;/STRONG&gt;  je tedy pro každou podmínku použita vlastní proměnná držící jedinečnou hodnotu lokace v okamžiku použití.&lt;/P&gt;
&lt;P&gt;V příkladu jsou použiti metody třídy &lt;STRONG&gt;PredicateBuilder&lt;/STRONG&gt; - to je pomocná třída pro sestavování predikátů. Pokud bych to popsal polopaticky, tak předchozí funkce sestaví podmínku (v případě, že vyhledávácí řetězec obsahoval "&lt;STRONG&gt;Location:Humpolec, Polna|PropertyType:Castle,Flat,Chateu,TerraceHouse|Bedrooms:1-20&lt;/STRONG&gt;" :&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;podmínka = False Or Location='Humpolec' Or Location='Polna'&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;Třídu &lt;STRONG&gt;PredicateBuilder&lt;/STRONG&gt; jsem si vypůjčil ze stránky &lt;A href="http://www.albahari.com/nutshell/predicatebuilder.aspx" target="_blank"&gt;Dynamically Composing Expression Predicates&lt;/A&gt; - lze ji v různých obdobách nalézt i jinde, ale myslím, že tohle byl původní zdroj-&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;DIV&gt;Podobně by vypadaly i metody pro omezení dle typu nemovitosti:&lt;/DIV&gt;
&lt;DIV&gt; &lt;/DIV&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="color:#0000ff;"&gt;static&lt;/SPAN&gt; Expression&amp;lt;Func&amp;lt;IRealProperty, &lt;SPAN style="color:#0000ff;"&gt;bool&lt;/SPAN&gt;&amp;gt;&amp;gt; IsOfType(&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; types)                                  &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   var predicate = PredicateBuilder.False&amp;lt;IRealProperty&amp;gt;();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   var propertyTypes = GetPropertyTypesFromString(types);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   &lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt; (PropertyType propertyType &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; propertyTypes)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   {&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;      PropertyType tempType = propertyType;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;      predicate = predicate.Or(p =&amp;gt; p.Type ==tempType);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   }&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   &lt;SPAN style="color:#0000ff;"&gt;return&lt;/SPAN&gt; predicate;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;a i metoda omezující dle poču ložnic:&lt;/P&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;public&lt;/SPAN&gt; &lt;SPAN style="color:#0000ff;"&gt;static&lt;/SPAN&gt; Expression&amp;lt;Func&amp;lt;IRealProperty, &lt;SPAN style="color:#0000ff;"&gt;bool&lt;/SPAN&gt;&amp;gt;&amp;gt; HasBedroomCount(&lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt; min, &lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt; max)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    var predicate = PredicateBuilder.False&amp;lt;IRealProperty&amp;gt;();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    predicate = predicate.Or(p =&amp;gt; p.BedroomCount &amp;gt;=min &amp;amp;&amp;amp; p.BedroomCount&amp;lt;=max);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;SPAN style="color:#0000ff;"&gt;return&lt;/SPAN&gt; predicate;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Zpracování vyhledávací podmínky&lt;/H2&gt;
&lt;P&gt;Po definici jednotlivých metod již stačí jednoduše zpracovat předávaný řetězec a jednotlivé metody zkombinovat. Pro jednoduchost nejsou přidány žádné kontroly formální správnosti předávaného řetězce - spoléháme se, že tvar bude dodržen:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; searchConditions = &lt;SPAN style="color:#006080;"&gt;"Location:Humpolec, Polna|PropertyType:Castle,Flat,Chateu,TerraceHouse|Bedrooms:1-20"&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;var conditions = searchConditions.Split(&lt;SPAN style="color:#006080;"&gt;"|"&lt;/SPAN&gt;.ToCharArray());&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;var predicate = PredicateBuilder.True&amp;lt;IRealProperty&amp;gt;();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt; (&lt;SPAN style="color:#0000ff;"&gt;string&lt;/SPAN&gt; condition &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; conditions)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   var keyValuePair = condition.Split(&lt;SPAN style="color:#006080;"&gt;":"&lt;/SPAN&gt;.ToCharArray());&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   &lt;SPAN style="color:#0000ff;"&gt;switch&lt;/SPAN&gt; (keyValuePair[0])&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   {&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;      &lt;SPAN style="color:#0000ff;"&gt;case&lt;/SPAN&gt; &lt;SPAN style="color:#006080;"&gt;"PropertyType"&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;         predicate = predicate.And(RealProperty.IsOfType(keyValuePair[1]));&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;         &lt;SPAN style="color:#0000ff;"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;      &lt;SPAN style="color:#0000ff;"&gt;case&lt;/SPAN&gt; &lt;SPAN style="color:#006080;"&gt;"Bedrooms"&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;         var bedroomRange = keyValuePair[1].Split(&lt;SPAN style="color:#006080;"&gt;"-"&lt;/SPAN&gt;.ToCharArray());&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;         &lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt; min= &lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt;.Parse(bedroomRange[0]);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;         &lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt; max = &lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt;.Parse(bedroomRange[1]);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;         predicate = predicate.And(RealProperty.HasBedroomCount(min, max));&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;         &lt;SPAN style="color:#0000ff;"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;      &lt;SPAN style="color:#0000ff;"&gt;case&lt;/SPAN&gt; &lt;SPAN style="color:#006080;"&gt;"Location"&lt;/SPAN&gt;:&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;         predicate = predicate.And(RealProperty.IsInLocation(keyValuePair[1]));&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;         &lt;SPAN style="color:#0000ff;"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;   }&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Provedení dotazu&lt;/H2&gt;
&lt;P&gt;Nyní stačí získaný předpis jen zkompilovat, použít v LINQ dotazu a výsledek vypsat:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;Func&amp;lt;IRealProperty, &lt;SPAN style="color:#0000ff;"&gt;bool&lt;/SPAN&gt;&amp;gt; SatisfiesSearchConditions = predicate.Compile();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;var query = from property &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; propertis&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;SPAN style="color:#0000ff;"&gt;where&lt;/SPAN&gt; SatisfiesSearchConditions(property)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            select property;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt;(RealProperty property &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; query)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;   Console.WriteLine(property.ToString());&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;A je to.&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Závěr&lt;/H2&gt;
&lt;P&gt;Snažil jsem ukázat, jak lze dynamicky konstruovat omezovací podmínky LINQ dotazu. V některém volném pokračování ukáži jak lze podobně provést i seřazení výsledků a i reálné použítí. Ačkoliv byl tento článek založen na zjednodušeném příkladě, myslím že není problém přenést principy zde ukázané jinam.&lt;/P&gt;
&lt;P&gt;Zdrojový kód příkladu je jako obvykle přiložen v zip balíčku.&lt;/P&gt;
&lt;P&gt;Na závěr tedy ještě přehledně dva odkazy zmíněné v článku, kde lze nalézt další informace a studijní materiál:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx" target="_blank"&gt;101  LINQ Samples&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.albahari.com/nutshell/predicatebuilder.aspx" target="_blank"&gt;Dynamically Composing Expression Predicates&lt;/A&gt;&lt;BR&gt; &lt;/LI&gt;&lt;/UL&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx&amp;amp;;title=LINQ+-+jak+na+dynamickou+podm%26%23237%3bnku" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx&amp;amp;;title=LINQ+-+jak+na+dynamickou+podm%26%23237%3bnku" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx&amp;amp;;title=LINQ+-+jak+na+dynamickou+podm%26%23237%3bnku" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx&amp;amp;title=LINQ+-+jak+na+dynamickou+podm%26%23237%3bnku" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx&amp;amp;;title=LINQ+-+jak+na+dynamickou+podm%26%23237%3bnku" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx&amp;amp;;title=LINQ+-+jak+na+dynamickou+podm%26%23237%3bnku&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx&amp;amp;;subject=LINQ+-+jak+na+dynamickou+podm%26%23237%3bnku" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/14/linq-jak-na-dynamickou-podm-nku.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228784" width="1" height="1"&gt;</description><enclosure url="http://blog.vyvojar.cz/mstr/attachment/228784.ashx" length="5228" type="application/zip" /><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Rozšíření možností Visual Studia - Add-in (2)</title><link>http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx</link><pubDate>Thu, 11 Dec 2008 21:52:00 GMT</pubDate><guid isPermaLink="false">99a92ff2-698a-48c2-8eaf-f3d9b6202627:228779</guid><dc:creator>mstr</dc:creator><slash:comments>5</slash:comments><comments>http://blog.vyvojar.cz/mstr/comments/228779.aspx</comments><wfw:commentRss>http://blog.vyvojar.cz/mstr/commentrss.aspx?PostID=228779</wfw:commentRss><wfw:comment>http://blog.vyvojar.cz/mstr/rsscomments.aspx?PostID=228779</wfw:comment><description>&lt;P&gt;V &lt;A href="http://blog.vyvojar.cz/mstr/archive/2008/12/08/roz-en-mo-nost-visual-studia-add-in.aspx" target="_blank"&gt;předchozím díle&lt;/A&gt; jsem ukázal, jak si vytvořit základní obálku pro add-in. Nyní ukáži, jak napsat metodu, která něco provede - to něco je přesun using direktiv do těla namespace. Není to až tak těžké.&lt;/P&gt; &lt;P&gt;Jistě si vzpomenete, že v části 1. jsme získali referenci na objekt DTE2, což je vlastně IDE Visual Studia. Díky tomu získáme přístup k našemu kódu. Zjednodušeně lze strukturu, se kterou budeme pracovat, nakreslit takto:&lt;/P&gt; &lt;P align="center"&gt;&lt;A href="http://blog.vyvojar.cz/blogs/mstr/WindowsLiveWriter/RozenmonostVisualStudiaAddin2_13B25/DTE_2.jpg"&gt;&lt;IMG style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" border="0" alt="DTE" src="http://blog.vyvojar.cz/blogs/mstr/WindowsLiveWriter/RozenmonostVisualStudiaAddin2_13B25/DTE_thumb.jpg" width="444" height="358"&gt;&lt;/A&gt; &lt;/P&gt; &lt;P&gt;Je třeba si uvědomit, že pod DTE objektem je zabalene COM rozhraní, navíc zatížené různými nelogičnostmi (například Document má i vlastnost Language, která vrací název programovacího jazyka, napříkla CSharp či vb. Stejně nazvanou property nalezneme i v CodeElement či FileCodeModel, ale tentokrat vraci už string s GUID kodem jazyka z kolekce CodeModelLanguageConstants).&lt;/P&gt; &lt;P&gt;Vlastní kod bude velmi jednoduchý:&lt;/P&gt; &lt;OL&gt; &lt;LI&gt;získáme seznam usings&lt;/LI&gt; &lt;LI&gt;získáme seznam namespaců&lt;/LI&gt; &lt;LI&gt;odstraním usings&lt;/LI&gt; &lt;LI&gt;vložíme usings do namespaců&lt;/LI&gt; &lt;LI&gt;zarovnáme kód.&lt;/LI&gt;&lt;/OL&gt; &lt;P&gt; &lt;/P&gt; &lt;H2&gt;Získání seznamu usings a namespaců&lt;/H2&gt; &lt;P&gt;Získáme aktivní dokument (z něj došlo k zavolání add-inu). Přes ProjectItem se dostaneme k vlastnímu modelu kódu. Staří nám procházet první úroveň a vyhledat všechny using a namespace prvky. V případě using rovnou získáme i kód daného prvku:&lt;/P&gt; &lt;P&gt; &lt;/P&gt; &lt;DIV&gt; &lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;Document document = applicationObject.ActiveDocument;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;ProjectItem projectItem = document.ProjectItem;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;FileCodeModel2 codeModel = projectItem.FileCodeModel &lt;SPAN style="color:#0000ff;"&gt;as&lt;/SPAN&gt; FileCodeModel2;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;List&amp;lt;CodeElement&amp;gt; usings = &lt;SPAN style="color:#0000ff;"&gt;new&lt;/SPAN&gt; List&amp;lt;CodeElement&amp;gt;();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;List&amp;lt;CodeNamespace&amp;gt; namespaces = &lt;SPAN style="color:#0000ff;"&gt;new&lt;/SPAN&gt; List&amp;lt;CodeNamespace&amp;gt;();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;StringBuilder sb = &lt;SPAN style="color:#0000ff;"&gt;new&lt;/SPAN&gt; StringBuilder();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;sb.AppendLine();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt; (CodeElement element &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; codeModel.CodeElements)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;SPAN style="color:#0000ff;"&gt;switch&lt;/SPAN&gt; (element.Kind)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    {&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;        &lt;SPAN style="color:#0000ff;"&gt;case&lt;/SPAN&gt; vsCMElement.vsCMElementImportStmt:&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            usings.Add(element);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            &lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt; startPoint = element.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes).Line;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt; endPoint = element.GetEndPoint(vsCMPart.vsCMPartWholeWithAttributes).Line;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            sb.AppendLine(element.StartPoint.CreateEditPoint().GetLines(startPoint, endPoint + 1).Trim());&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;SPAN style="color:#0000ff;"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;        &lt;SPAN style="color:#0000ff;"&gt;case&lt;/SPAN&gt; vsCMElement.vsCMElementNamespace:&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;            namespaces.Add((CodeNamespace)element);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;            &lt;SPAN style="color:#0000ff;"&gt;break&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    }&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Ostranění usings&lt;/H2&gt;
&lt;P&gt;Zde využijeme metodu &lt;STRONG&gt;Remove&lt;/STRONG&gt;:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt; (CodeElement element &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; usings)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{  &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    codeModel.Remove(element);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV&gt; &lt;/DIV&gt;
&lt;H2&gt;Vložení usings do namespace prkvu&lt;/H2&gt;
&lt;DIV&gt;Zde využijeme &lt;STRONG&gt;String Builder&lt;/STRONG&gt; objekt naplěný při získávání seznamů prvků a vložíme jej do každého prvku &lt;STRONG&gt;namespace&lt;/STRONG&gt;, který jsme našli:&lt;/DIV&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;foreach&lt;/SPAN&gt; (CodeNamespace namespaceElement &lt;SPAN style="color:#0000ff;"&gt;in&lt;/SPAN&gt; namespaces)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    EditPoint ep = namespaceElement.GetStartPoint(vsCMPart.vsCMPartNavigate).CreateEditPoint();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    ep.LineDown(1);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    ep.Insert(sb.ToString());&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    ep.SmartFormat(namespaceElement.GetEndPoint(vsCMPart.vsCMPartNavigate));&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Jistě jste si už všimli, že ze zdrojovým kódem pracujeme pomocí &lt;STRONG&gt;EditPoint&lt;/STRONG&gt;ů. Získáme začátek daného kodového elementu, posuneme ukazatal o řádek níže (&lt;STRONG&gt;ep.LineDown&lt;/STRONG&gt;), vložíme prvek a provedeme zarovnání celého elementu.&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Úprava kódu&lt;/H2&gt;
&lt;P&gt;Po odstraněných using z rootu kodu tam zůstaly prázdné řádky. Odstraníme tedy i je - krokujeme od prvního řádku a odstraňujeme všechny nalezene prázdné řádky z rootu kódu dokud nedojdeme k začátku definice prvního namespace. Používá se zde další objekt TextSelection:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;CodeNamespace firstNamespace = namespaces[0];&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;TextSelection selection = document.Selection &lt;SPAN style="color:#0000ff;"&gt;as&lt;/SPAN&gt; TextSelection;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt; lineNumber = 1;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;int&lt;/SPAN&gt; stopLine = firstNamespace.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes).Line;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;while&lt;/SPAN&gt; (lineNumber &amp;lt; stopLine)&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    selection.GotoLine(lineNumber, &lt;SPAN style="color:#0000ff;"&gt;true&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    selection.DeleteWhitespace(vsWhitespaceOptions.vsWhitespaceOptionsVertical);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    lineNumber++;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;    stopLine = firstNamespace.GetStartPoint(vsCMPart.vsCMPartWholeWithAttributes).Line;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;selection.Cancel();&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Drobné úpravy&lt;/H2&gt;
&lt;P&gt;V kíod se provádí několik změn. Pokud by uživatel použil po skončení běhu našeho kódu Undo, vracely by se provedene změny postupně. Pokud chceme, aby se jednim stiskem &lt;STRONG&gt;Undo&lt;/STRONG&gt; vrátili změny v kodu do stavu před spuštěním našeho add-inu, použijeme před změnamy příkaz:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;applicationObject.UndoContext.Open(&lt;SPAN style="color:#006080;"&gt;"SortCode Macro"&lt;/SPAN&gt;, &lt;SPAN style="color:#0000ff;"&gt;false&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;a po úspěšném provedení změn pak zavoláme:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;applicationObject.UndoContext.Close();&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Celý náš kód uzavřeme do bloku &lt;STRONG&gt;try&lt;/STRONG&gt;...&lt;STRONG&gt;catch&lt;/STRONG&gt;....&lt;STRONG&gt;finally&lt;/STRONG&gt;:&lt;BR&gt;&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;applicationObject.UndoContext.Open(&lt;SPAN style="color:#006080;"&gt;"SortCode Macro"&lt;/SPAN&gt;, &lt;SPAN style="color:#0000ff;"&gt;false&lt;/SPAN&gt;);&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt; &lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;try&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    &lt;SPAN style="color:#008000;"&gt;// the main routine&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;catch&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    applicationObject.UndoContext.SetAborted();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;&lt;SPAN style="color:#0000ff;"&gt;finally&lt;/SPAN&gt;&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;{&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;    applicationObject.UndoContext.Close();&lt;/PRE&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;}&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Spuštění&lt;/H2&gt;
&lt;P&gt;Pro testování mám jednoduchý zdrojový kód, po vyvolání kontextové nápovědy se objeví známá nabídka Reorder usings :&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blog.vyvojar.cz/blogs/mstr/WindowsLiveWriter/RozenmonostVisualStudiaAddin2_13B25/image_2.png"&gt;&lt;IMG style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/WindowsLiveWriter/RozenmonostVisualStudiaAddin2_13B25/image_thumb.png" width="335" height="307"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Po spuštění pak dostaneme:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blog.vyvojar.cz/blogs/mstr/WindowsLiveWriter/RozenmonostVisualStudiaAddin2_13B25/image_4.png"&gt;&lt;IMG style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" border="0" alt="image" src="http://blog.vyvojar.cz/blogs/mstr/WindowsLiveWriter/RozenmonostVisualStudiaAddin2_13B25/image_thumb_1.png" width="333" height="327"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;A jediné stisknutí Undo nás vrátí do výchozího stavu.&lt;/P&gt;
&lt;P&gt; &lt;/P&gt;
&lt;H2&gt;Závěr&lt;/H2&gt;
&lt;P&gt;Ukázal jsem jednoduchou práci s kódem. Add-in lze i mírně vylepšovat, například k stavovému řádku a výpisu hlášení o úspěšním provedení akce se dostaneme jednoduše pomocí:&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;PRE style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none;"&gt;applicationObject.StatusBar.Text = &lt;SPAN style="color:#006080;"&gt;"Usings successfuly moved."&lt;/SPAN&gt;;&lt;/PRE&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;P&gt;Přiložen je aktualizovaný soubor &lt;STRONG&gt;Connect.cs&lt;/STRONG&gt;. Pokud vás to zaujalo, rád se k tématu tvorby add-inlů vrátím - napište do komentářů, co by se vám líbilo.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Přidej do&lt;/strong&gt; &lt;a href = "http://linkuj.cz/?id=linkuj&amp;amp;url=http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx&amp;amp;;title=Roz%c5%a1%26%23237%3b%c5%99en%26%23237%3b+mo%c5%benost%26%23237%3b+Visual+Studia+-+Add-in+(2)" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx"&gt;linkuj.cz!&lt;/a&gt; |  &lt;a href = "http://www.jagg.cz/bookmarks.php?action=add&amp;amp;address=http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx&amp;amp;;title=Roz%c5%a1%26%23237%3b%c5%99en%26%23237%3b+mo%c5%benost%26%23237%3b+Visual+Studia+-+Add-in+(2)" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx"&gt;jagg.cz!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx&amp;amp;;title=Roz%c5%a1%26%23237%3b%c5%99en%26%23237%3b+mo%c5%benost%26%23237%3b+Visual+Studia+-+Add-in+(2)" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx"&gt;del.icio.us!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx&amp;amp;title=Roz%c5%a1%26%23237%3b%c5%99en%26%23237%3b+mo%c5%benost%26%23237%3b+Visual+Studia+-+Add-in+(2)" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx&amp;amp;;title=Roz%c5%a1%26%23237%3b%c5%99en%26%23237%3b+mo%c5%benost%26%23237%3b+Visual+Studia+-+Add-in+(2)" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx&amp;amp;;title=Roz%c5%a1%26%23237%3b%c5%99en%26%23237%3b+mo%c5%benost%26%23237%3b+Visual+Studia+-+Add-in+(2)&amp;amp;;top=1" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx"&gt;live it!&lt;/a&gt; |  &lt;a href = "mailto:?body=Thought you might like this: http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx&amp;amp;;subject=Roz%c5%a1%26%23237%3b%c5%99en%26%23237%3b+mo%c5%benost%26%23237%3b+Visual+Studia+-+Add-in+(2)" target="_blank" title = "Post http://blog.vyvojar.cz/mstr/archive/2008/12/11/roz-en-mo-nost-visual-studia-add-in-2.aspx"&gt;email it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.vyvojar.cz/aggbug.aspx?PostID=228779" width="1" height="1"&gt;</description><enclosure url="http://blog.vyvojar.cz/mstr/attachment/228779.ashx" length="1973" type="application/zip" /><category domain="http://blog.vyvojar.cz/mstr/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blog.vyvojar.cz/mstr/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item></channel></rss>