﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>andrzej.net.pl &#187; c#</title>
	<atom:link href="http://andrzej.net.pl/index.php/category/csharp/feed/" rel="self" type="application/rss+xml" />
	<link>http://andrzej.net.pl</link>
	<description>Blog o programowaniu C#, ASP.NET</description>
	<lastBuildDate>Mon, 27 Jun 2011 22:36:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Script i self-closing tags</title>
		<link>http://andrzej.net.pl/index.php/2011/06/script-i-self-closing-tags/</link>
		<comments>http://andrzej.net.pl/index.php/2011/06/script-i-self-closing-tags/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 19:25:41 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[script self-closing tag]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=882</guid>
		<description><![CDATA[Pół godziny z głowy z powodu.. roztargnienia. Przerzuciłem się kilka dni temu z powrotem na Operę. Powód? Mułowatość, toporność i pamięciożerność Firefoxa. Jedyne za czym tęsknię to Firebug. Stwierdziłem jednak, że zacznę przyzwyczajać się i poznawać Opera Dragonfly. Z ubolewaniem muszę stwierdzić, że wiele jeszcze brakuje temu narzędziu do używalności jaką oferuje Firebug. Jednak &#8211; [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/?referer=');">Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>Pół godziny z głowy z powodu.. roztargnienia.<br />
Przerzuciłem się kilka dni temu z powrotem na <a href="http://www.opera.com/" onclick="pageTracker._trackPageview('/outgoing/www.opera.com/?referer=');">Operę</a>. Powód? Mułowatość, toporność i pamięciożerność Firefoxa. Jedyne za czym tęsknię to Firebug. Stwierdziłem jednak, że zacznę przyzwyczajać się i poznawać <a href="http://www.opera.com/dragonfly/" onclick="pageTracker._trackPageview('/outgoing/www.opera.com/dragonfly/?referer=');">Opera Dragonfly</a>.<br />
Z ubolewaniem muszę stwierdzić, że wiele jeszcze brakuje temu narzędziu do używalności jaką oferuje Firebug. Jednak &#8211; nie o tym post.<br />
Testując różne funkcjonalności na stronie, którą przygotowuję (ASP.NET MVC 3.0 z Razor&#8217;em) przerzuciłem się na chwilę na Firefox 5.0. Ze zdziwieniem stwierdziłem, że żaden JavaScript nie działa! Zwaliłem to na nieumiejętne użycie przeze mnie @section oraz @RenderSection jakie oferuje Razor. Zajrzenie w źródło strony &#8211; jednak nie. Wszystko jest ok. Prawie. Rebus dla spostrzegawczych:</p>
<p><span id="more-882"></span></p>
<p>Ten kod nie działa w FF:<br />
<script type="text/javascript" src="http://embed.snipt.org/xkmlo"></script><noscript>if(embedStylesPrinted != true) {document.write('<link type="text/css" rel="stylesheet" href="http://snipt.org/snipt/extend/embed/snipt_js.css">');}var embedStylesPrinted = true;var content = 'Snipt Not Found.';document.write(content);<br>[code snippet: <a href="http://snipt.org/xkmlo" onclick="pageTracker._trackPageview('/outgoing/snipt.org/xkmlo?referer=');">http://snipt.org/xkmlo</a>]</noscript></p>
<p>Ten kod działa w FF:<br />
<script type="text/javascript" src="http://embed.snipt.org/xkmlp"></script><noscript>if(embedStylesPrinted != true) {document.write('<link type="text/css" rel="stylesheet" href="http://snipt.org/snipt/extend/embed/snipt_js.css">');}var embedStylesPrinted = true;var content = 'Snipt Not Found.';document.write(content);<br>[code snippet: <a href="http://snipt.org/xkmlp" onclick="pageTracker._trackPageview('/outgoing/snipt.org/xkmlp?referer=');">http://snipt.org/xkmlp</a>]</noscript></p>
<p>Różnica? Self-closing tag script, użyty nieopatrznie w pierwszym przypadku powoduje totalne ogłupienie FF. Opera zachowuje się bez problemu.</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/?referer=');">Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2011/06/script-i-self-closing-tags/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Entity Framework i optimistic concurrency</title>
		<link>http://andrzej.net.pl/index.php/2011/06/entity-framework-i-optimistic-concurrency/</link>
		<comments>http://andrzej.net.pl/index.php/2011/06/entity-framework-i-optimistic-concurrency/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 20:18:21 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[entity framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Entity Framework 4]]></category>
		<category><![CDATA[optimistic concurrency]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=851</guid>
		<description><![CDATA[W przypadkach, gdy dane edytowane są dość rzadko i przez niewielką liczbę użytkowników, najczęściej stosowanym modelem blokowania danych do edycji jest&#8230; brak blokowania. Mówiąc konkretnie &#8211; chodzi o OCC, czyli Optimistic Concurrency Control. Pytanie to &#8211; w wersji teoretycznej &#8211; poruszane było nie tak dawno na devpytaniach. Jeśli możemy założyć, że konflikty będą występować rzadko [...]


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>W przypadkach, gdy dane edytowane są dość rzadko i przez niewielką liczbę użytkowników, najczęściej stosowanym modelem blokowania danych do edycji jest&#8230; brak blokowania. Mówiąc konkretnie &#8211; chodzi o OCC, czyli Optimistic Concurrency Control.</p>
<p>Pytanie to &#8211; w wersji teoretycznej &#8211; poruszane było nie tak dawno na <a href="http://devpytania.pl/questions/2764/entity-framework-optimistic-concurrency" onclick="pageTracker._trackPageview('/outgoing/devpytania.pl/questions/2764/entity-framework-optimistic-concurrency?referer=');">devpytaniach</a>. Jeśli możemy założyć, że konflikty będą występować rzadko lub jest to akceptowalne w konkretnym przypadku, który mamy zaprogramować, użycie optymistycznego blokowania jest dobrym i prostym wyborem.<br />
Optimistic concurrency nie blokuje rekordu przy jego pobieraniu, natomiast przy zapisie dokonywane jest nadmiarowe sprawdzenie, czy dane w bazie są tożsame z danymi, które były podstawą naszych zmian.</p>
<p>Stanąłem przed problemem obsługi optimistic concurrency przy korzystaniu z Entity Framework 4.0. Po krótkiej lekturze <a href="http://www.amazon.com/Entity-Framework-Recipes-Problem-Solution-Approach/dp/1430227036" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/Entity-Framework-Recipes-Problem-Solution-Approach/dp/1430227036?referer=');">&#8222;Entity Framework 4.0 Recipes &#8211; A problem-solution approach&#8221;</a> okazało się, że EF wspiera Optimistic Concurrency. Wystarczy dodać do bazy danych kolumnę informującą o &#8211; mówiąc ogólnie &#8211; wersji obiektu. Najłatwiej będzie przeanalizować problem na bardzo prostym przykładzie (kod do pobrania na końcu artykułu).</p>
<p><span id="more-851"></span></p>
<p>Załóżmy, że mamy tabelę przechowującą informacje o klientach:<br />
<script type="text/javascript" src="http://embed.snipt.org/xklkg"></script><noscript>if(embedStylesPrinted != true) {document.write('<link type="text/css" rel="stylesheet" href="http://snipt.org/snipt/extend/embed/snipt_js.css">');}var embedStylesPrinted = true;var content = 'Snipt Not Found.';document.write(content);<br>[code snippet: <a href="http://snipt.org/xklkg" onclick="pageTracker._trackPageview('/outgoing/snipt.org/xklkg?referer=');">http://snipt.org/xklkg</a>]</noscript></p>
<p>Zacznijmy od dodania kolumny Timestamp, która pomoże nam w obsłudze OCC.<br />
<script type="text/javascript" src="http://embed.snipt.org/xklkh"></script><noscript>if(embedStylesPrinted != true) {document.write('<link type="text/css" rel="stylesheet" href="http://snipt.org/snipt/extend/embed/snipt_js.css">');}var embedStylesPrinted = true;var content = 'Snipt Not Found.';document.write(content);<br>[code snippet: <a href="http://snipt.org/xklkh" onclick="pageTracker._trackPageview('/outgoing/snipt.org/xklkh?referer=');">http://snipt.org/xklkh</a>]</noscript></p>
<p>Teraz możemy wygenerować nasz model w EF. Tutaj następuje kluczowy krok &#8211; oznaczenie kolumny Timestamp jako odpowiedzialnej za sprawdzanie wersji obiektu.<br />
W kolumnie Timestamp w naszym modelu musimy zmienić dwie właściwości:</p>
<ul>
<li><strong>StoreGeneratedPattern</strong> &#8211; na wartość <strong>computed</strong>. Podpowiadamy tutaj EF, że wartość tej kolumny nie będzie ustawiana przez nas a generowana za każdym razem gdy obiekt jest wstawiany lub aktualizowany.</li>
<li><strong>Concurrency Mode</strong> &#8211; na wartość <strong>fixed</strong>. Ustawienie to oznacza, że oryginalna wartość tej kolumny będzie dołączona do warunku WHERE przy modyfikacji danych. Są to właściwie dwa przypadku &#8211; kasowanie oraz aktualizacja. Warunek taki wyglądał więc będzie mniej więcej tak: update table set &#8230;. where id = @id AND fixedColumn = @fixedColumnOriginalValue</li>
</ul>
<p><a href="http://andrzej.net.pl/wp-content/uploads/2011/06/optimistic_concurrency_edmx.jpg" rel="lightbox[851]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2011/06/optimistic_concurrency_edmx.jpg?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2011/06/optimistic_concurrency_edmx-300x222.jpg" alt="" title="optimistic concurrency edmx - ustawienie kolumny timestamp" width="300" height="222" class="aligncenter size-medium wp-image-857" /></a></p>
<p>Po wykonaniu tych prostych modyfikacji możemy przetestować nasz model i jego zachowanie w przypadku wystąpienia konfliktu.<br />
Prosty kod testowy, który:</p>
<ul>
<li>Pobiera dane klienta korzystając z jednego kontekstu EF, zmienia je ale nie utrwala z powrotem w bazie</li>
<li>Pobiera dane tego samego klienta, zmienia je i od razu utrwala <strong>korzystając z innego kontekstu</strong>.</li>
<li>Utrwala dane klienta z kroku pierwszego</li>
</ul>
<p><script type="text/javascript" src="http://embed.snipt.org/xklZ"></script><noscript>if(embedStylesPrinted != true) {document.write('<link type="text/css" rel="stylesheet" href="http://snipt.org/snipt/extend/embed/snipt_js.css">');}var embedStylesPrinted = true;var content = 'Snipt Not Found.';document.write(content);<br>[code snippet: <a href="http://snipt.org/xklZ" onclick="pageTracker._trackPageview('/outgoing/snipt.org/xklZ?referer=');">http://snipt.org/xklZ</a>]</noscript></p>
<p>Wynikiem działania tego kodu będzie rzucenie wyjątku w momencie wywołania ostatniej linii:</p>
<p><a href="http://andrzej.net.pl/wp-content/uploads/2011/06/optimistic_concurrency_exception.jpg" rel="lightbox[851]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2011/06/optimistic_concurrency_exception.jpg?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2011/06/optimistic_concurrency_exception-300x245.jpg" alt="" title="OptimisticConcurrencyException" width="300" height="245" class="aligncenter size-medium wp-image-858" /></a></p>
<p>Entity Framework dzięki naszej kolumnie fixed typu timestamp wykrył, że nastąpiła modyfikacja obiektu między momentem pobrania go przez nas a chęcią wykonania zapisu. Wyjątku typu OptimisticConcurrencyException informuje nas o tym fakcie i pozwala obsłużyć tę sytuację. Wystarczy prosta modyfikacja ostatniej linii naszego kodu:</p>
<p><script type="text/javascript" src="http://embed.snipt.org/xklki"></script><noscript>if(embedStylesPrinted != true) {document.write('<link type="text/css" rel="stylesheet" href="http://snipt.org/snipt/extend/embed/snipt_js.css">');}var embedStylesPrinted = true;var content = 'Snipt Not Found.';document.write(content);<br>[code snippet: <a href="http://snipt.org/xklki" onclick="pageTracker._trackPageview('/outgoing/snipt.org/xklki?referer=');">http://snipt.org/xklki</a>]</noscript></p>
<p>I problem optimistic concurrency rozwiązany.<br />
Możemy również zaprząc do pomocy program Sql Server Profiler (nieoceniony przy pracy z Entity Framework) aby przekonać się, że wszystko wykonuje się dokładnie tak jak tego oczekiwaliśmy.</p>
<p>Tak wygląda pierwsza aktualizacja obiektu (ta nie powodująca wystąpienia wyjątku):<br />
<script type="text/javascript" src="http://embed.snipt.org/xklkj"></script><noscript>if(embedStylesPrinted != true) {document.write('<link type="text/css" rel="stylesheet" href="http://snipt.org/snipt/extend/embed/snipt_js.css">');}var embedStylesPrinted = true;var content = 'Snipt Not Found.';document.write(content);<br>[code snippet: <a href="http://snipt.org/xklkj" onclick="pageTracker._trackPageview('/outgoing/snipt.org/xklkj?referer=');">http://snipt.org/xklkj</a>]</noscript></p>
<p>Tak natomiast ostatnia aktualizacja obiektu, czyli powodująca konflikt:<br />
<script type="text/javascript" src="http://embed.snipt.org/xklkk"></script><noscript>if(embedStylesPrinted != true) {document.write('<link type="text/css" rel="stylesheet" href="http://snipt.org/snipt/extend/embed/snipt_js.css">');}var embedStylesPrinted = true;var content = 'Snipt Not Found.';document.write(content);<br>[code snippet: <a href="http://snipt.org/xklkk" onclick="pageTracker._trackPageview('/outgoing/snipt.org/xklkk?referer=');">http://snipt.org/xklkk</a>]</noscript></p>
<p>Jest to być może mało zauważalne, ale oba polecenia T-SQL jakie wygenerował dla nas EF modyfikują kolumnę Group różnymi wartościami (&#8222;C&#8221; oraz &#8222;B&#8221;) jednocześnie wysyłając identyfikator rekordu (Id) oraz wartość kolumny Timestamp. Entity Framework sprawdza następnie ile rekordów zostało zmodyfikowanych poleceniem. Jeśli ta liczba wynosi zero &#8211; rzucany jest wspomniany wcześniej wyjątek.</p>
<p><strong>Kod aplikacji testowej do pobrania</strong>: <a href='http://andrzej.net.pl/wp-content/uploads/2011/06/OptimisticConcurrencyDemo.zip' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2011/06/OptimisticConcurrencyDemo.zip?referer=');">OptimisticConcurrencyDemo &#8211; VS 2010 Solution</a></p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2011/06/entity-framework-i-optimistic-concurrency/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Proste i przyjemne porównanie kolekcji w .NET</title>
		<link>http://andrzej.net.pl/index.php/2011/06/proste-i-przyjemne-porownanie-kolekcji-w-net/</link>
		<comments>http://andrzej.net.pl/index.php/2011/06/proste-i-przyjemne-porownanie-kolekcji-w-net/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 09:01:35 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[kolekcje]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=849</guid>
		<description><![CDATA[Polecam i początkującym i doświadczonym wpis C#/.NET Fundamentals: Choosing the Right Collection Class na blogu Jamesa Michaela Hare. Zwięzły i konkretny opis podstawowych kolekcji w .NET &#8211; zastosowania, zalety, wady. Złożoność wstawiania i wyszukiwania. Wpis co prawda nie obejmuje nowych concurrent collections w .NET ale i tak jest wart uwagi. Powiązane wpisy:BugNET i TRAC &#8211; [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/02/bugnet-i-trac-porownanie-czesc-i/' rel='bookmark' title='Permanent Link: BugNET i TRAC &#8211; porównanie. Część I' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/02/bugnet-i-trac-porownanie-czesc-i/?referer=');">BugNET i TRAC &#8211; porównanie. Część I</a></li>
<li><a href='http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/' rel='bookmark' title='Permanent Link: Wielopoziomowa aplikacja &#8211; nauka przez przykład' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">Wielopoziomowa aplikacja &#8211; nauka przez przykład</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>Polecam i początkującym i doświadczonym wpis <a href="http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx" onclick="pageTracker._trackPageview('/outgoing/geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx?referer=');">C#/.NET Fundamentals: Choosing the Right Collection Class</a> na blogu Jamesa Michaela Hare.<br />
Zwięzły i konkretny opis podstawowych kolekcji w .NET &#8211; zastosowania, zalety, wady. Złożoność wstawiania i wyszukiwania.<br />
Wpis co prawda nie obejmuje nowych concurrent collections w .NET ale i tak jest wart uwagi.</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/02/bugnet-i-trac-porownanie-czesc-i/' rel='bookmark' title='Permanent Link: BugNET i TRAC &#8211; porównanie. Część I' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/02/bugnet-i-trac-porownanie-czesc-i/?referer=');">BugNET i TRAC &#8211; porównanie. Część I</a></li>
<li><a href='http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/' rel='bookmark' title='Permanent Link: Wielopoziomowa aplikacja &#8211; nauka przez przykład' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">Wielopoziomowa aplikacja &#8211; nauka przez przykład</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2011/06/proste-i-przyjemne-porownanie-kolekcji-w-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>EntityFramework i datetime2 oraz System.Data.UpdateException</title>
		<link>http://andrzej.net.pl/index.php/2011/06/entityframework-i-datetime2-oraz-system-data-updateexception/</link>
		<comments>http://andrzej.net.pl/index.php/2011/06/entityframework-i-datetime2-oraz-system-data-updateexception/#comments</comments>
		<pubDate>Tue, 14 Jun 2011 20:08:02 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[entity framework]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=842</guid>
		<description><![CDATA[Dziś napotkałem bardzo dziwny błąd przy próbie zapisu danych do bazy MS SQL za pomocą Entity Framework z .NET 4.0. Otrzymywałem błąd: System.Data.UpdateException: Wystąpił błąd podczas aktualizowania wpisów. Aby uzyskać szczegółowe informacje, zobacz wyjątek wewnętrzny. &#8212;&#62; System.ArgumentException: Używana wersja programu SQL Server nie obsługuje typu danych &#8216;datetime2&#8242;. ang: The version of SQL Server in use [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2011/06/entity-framework-i-optimistic-concurrency/' rel='bookmark' title='Permanent Link: Entity Framework i optimistic concurrency' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2011/06/entity-framework-i-optimistic-concurrency/?referer=');">Entity Framework i optimistic concurrency</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>Dziś napotkałem bardzo dziwny błąd przy próbie zapisu danych do bazy MS SQL za pomocą Entity Framework z .NET 4.0. Otrzymywałem błąd:</p>
<blockquote><p>System.Data.UpdateException: Wystąpił błąd podczas aktualizowania wpisów. Aby uzyskać szczegółowe informacje, zobacz wyjątek wewnętrzny. &#8212;&gt; System.ArgumentException: Używana wersja programu SQL Server nie obsługuje typu danych &#8216;datetime2&#8242;.</p>
<p>ang: The version of SQL Server in use does not support datatype &#8216;datetime2</p></blockquote>
<p>Najdziwniejsze było jednak to, że po przeskanowaniu całego pliku EDMX nigdzie nie stwierdziłem występowania typu &#8222;datetime2&#8243; w mapowaniach. Typ &#8222;datetime2&#8243; został dodany w MS SQL Server od wersji 2008. Problem okazał się dość trywialny &#8211; EDMX (czyli wszelkie mapowania i ustawienia) zostały wygenerowane dla tej właśnie bazy. Połączenie natomiast realizowane było z bazą MS SQL  Server 2005.<br />
<span id="more-842"></span><br />
To naprowadziło mnie na przeszukanie pliku EDMX raz jeszcze &#8211; w zwykłym edytorze tekstowym, bez designera. Winowajcą okazała się linia:</p>
<div class="codecolorer-container xml default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Schema</span> <span style="color: #000066;">Namespace</span>=<span style="color: #ff0000;">&quot;AppEntities.Store&quot;</span></span><br />
<span style="color: #009900;"><span style="color: #000066;">Alias</span>=<span style="color: #ff0000;">&quot;Self&quot;</span> <span style="color: #000066;">Provider</span>=<span style="color: #ff0000;">&quot;System.Data.SqlClient&quot;</span></span><br />
<span style="color: #009900;"><span style="color: #000066;">ProviderManifestToken</span>=<span style="color: #ff0000;">&quot;2008&quot;</span>...<span style="color: #000000; font-weight: bold;">&gt;</span></span></div></div>
<p>a dokładniej atrybut ProviderManifestToken ustawiony na wartość 2008. Po krótkim googlowaniu dowiedziałem się, że gdy ProviderManifestToken jest ustawiony na 2008, Entity Framework domyślnie używa jako typu daty właśnie datetime2. Ręczna zmiana na &#8222;2005&#8243;, kompilacja i &#8211; wszystko działa.</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2011/06/entity-framework-i-optimistic-concurrency/' rel='bookmark' title='Permanent Link: Entity Framework i optimistic concurrency' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2011/06/entity-framework-i-optimistic-concurrency/?referer=');">Entity Framework i optimistic concurrency</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2011/06/entityframework-i-datetime2-oraz-system-data-updateexception/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Proste narzędzie do testowania zapytań XPath</title>
		<link>http://andrzej.net.pl/index.php/2010/11/proste-narzedzie-do-testowania-zapytan-xpath/</link>
		<comments>http://andrzej.net.pl/index.php/2010/11/proste-narzedzie-do-testowania-zapytan-xpath/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 23:19:31 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[programy]]></category>
		<category><![CDATA[przydatne narzędzia]]></category>
		<category><![CDATA[XPath]]></category>
		<category><![CDATA[XPath tester]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=829</guid>
		<description><![CDATA[Potrzebowałem banalnie prostego narzędzia, które byłoby pomocne w testowaniu zapytań XPath. Po krótkich poszukiwaniach i odnalezieniu kilku kombajnów stwierdziłem, że nawet dla wprawy szybciej stworzę odpowiednie narzędzie, spełniające moje wymagania ;) Dzielę się więc minimalistycznym, intuicyjnym w użyciu programem. Ascetyczny interfejs i funkcjonalność. Nie ma kolorowania, animacji ani miliona wielce-potrzebnych-funkcji. Całość oparta jest o XPathDocument, [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/?referer=');">Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>Potrzebowałem banalnie prostego narzędzia, które byłoby pomocne w testowaniu zapytań <a href="http://www.w3schools.com/xpath/default.asp" onclick="pageTracker._trackPageview('/outgoing/www.w3schools.com/xpath/default.asp?referer=');">XPath</a>. Po krótkich poszukiwaniach i odnalezieniu kilku kombajnów stwierdziłem, że nawet dla wprawy szybciej stworzę odpowiednie narzędzie, spełniające moje wymagania ;) Dzielę się więc minimalistycznym, intuicyjnym w użyciu programem.  Ascetyczny interfejs i funkcjonalność. Nie ma kolorowania, animacji ani miliona wielce-potrzebnych-funkcji.<br />
<span id="more-829"></span><br />
Całość oparta jest o <a href="http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathdocument.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.xml.xpath.xpathdocument.aspx?referer=');">XPathDocument</a>, <a href="http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnavigator.aspx?referer=');">XPathNavigator</a> oraz <a href="http://msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnodeiterator.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.xml.xpath.xpathnodeiterator.aspx?referer=');">XPathNodeIterator</a>. Aplikacyjka pozwala na wczytanie pliku XML, wpisanie w polu tekstowym zapytania XPath i podejrzenia wyników. Nie ma sprawdzania poprawności zapytania.</p>
<p><a href="http://andrzej.net.pl/wp-content/uploads/2010/11/XPathTester.png" rel="lightbox[829]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/11/XPathTester.png?referer=');"><img class="aligncenter size-medium wp-image-830" title="XPathTester" src="http://andrzej.net.pl/wp-content/uploads/2010/11/XPathTester-300x231.png" alt="" width="300" height="231" /></a></p>
<p>Program do pobrania: <a href="http://andrzej.net.pl/wp-content/uploads/2010/11/XPathTester.zip" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/11/XPathTester.zip?referer=');">tutaj</a></p>
<p>Dla ciekawskich, realizacja poszukiwania XPath realizowana jest następującym kodem:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">XPathDocument document <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> XPathDocument<span style="color: #008000;">&#40;</span><span style="color: #666666;">@&quot;PodanaSciezka\DoPliku.xml&quot;</span><span style="color: #008000;">&#41;</span><br />
<br />
XPathNavigator xPathNavigator <span style="color: #008000;">=</span> document<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateNavigator</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
XPathNodeIterator nodeIterator <span style="color: #008000;">=</span> xPathNavigator<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Select</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;WPROWADZONE ZAPYTANIE XPATH&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
StringBuilder results <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringBuilder<span style="color: #008000;">&#40;</span>nodeIterator<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">*</span> <span style="color: #FF0000;">100</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #0600FF; font-weight: bold;">while</span> <span style="color: #008000;">&#40;</span>nodeIterator<span style="color: #008000;">.</span><span style="color: #0000FF;">MoveNext</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><br />
<br />
<span style="color: #008000;">&#123;</span><br />
<br />
results<span style="color: #008000;">.</span><span style="color: #0000FF;">AppendLine</span><span style="color: #008000;">&#40;</span>nodeIterator<span style="color: #008000;">.</span><span style="color: #0000FF;">Current</span><span style="color: #008000;">.</span><span style="color: #0000FF;">InnerXml</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008000;">&#125;</span><br />
<br />
<span style="color: #008080; font-style: italic;">//tutaj przepisanie wyników do innego TextBoxa</span></div></div>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/?referer=');">Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/11/proste-narzedzie-do-testowania-zapytan-xpath/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Nauka przez przykład &#8211; opowieści użytkownika</title>
		<link>http://andrzej.net.pl/index.php/2010/11/nauka-przez-przyklad-opowiesci-uzytkownika/</link>
		<comments>http://andrzej.net.pl/index.php/2010/11/nauka-przez-przyklad-opowiesci-uzytkownika/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 23:00:46 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[nauka przez przykład]]></category>
		<category><![CDATA[opowieści użytkownika]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=825</guid>
		<description><![CDATA[Kontynuując poprzedni wpis dotyczący nauki przez przykład, określiłem tzw. opowieści użytkownika. Pozwoli to na zdefiniowanie wymagań dotyczących budowanej aplikacji. Jeśli będziemy wiedzieć czego użytkownik oczekuje, będziemy mogli zaproponować rozwiązanie spełniające te wymagania. Poniżej opowieści: Aplikacja ma wspomagać zarządzanie zadaniami rozdzielanymi dla użytkowników firmy. Po wykonaniu zadania, przenoszone jest ono do „archiwum”, tak aby możliwy był [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/' rel='bookmark' title='Permanent Link: Wielopoziomowa aplikacja &#8211; nauka przez przykład' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">Wielopoziomowa aplikacja &#8211; nauka przez przykład</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>Kontynuując <a href="http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">poprzedni wpis</a> dotyczący nauki przez przykład, określiłem tzw. opowieści użytkownika. Pozwoli to na zdefiniowanie wymagań dotyczących budowanej aplikacji.</p>
<p>Jeśli będziemy wiedzieć czego użytkownik oczekuje, będziemy mogli zaproponować rozwiązanie spełniające te wymagania.</p>
<p>Poniżej opowieści:</p>
<p><span id="more-825"></span></p>
<ol>
<li>Aplikacja ma wspomagać zarządzanie zadaniami rozdzielanymi dla użytkowników firmy.</li>
<li>Po wykonaniu zadania, przenoszone jest ono do „archiwum”, tak aby możliwy był podgląd zrealizowanych już zadań</li>
<li>Zadania mają prostą postać. Użytkownik zlecający zadanie może zdefiniować:
<ul>
<li>Temat</li>
<li>Treść</li>
<li>Priorytet (zwykły, wysoki, krytyczny)</li>
<li>Data wykonania (opcjonalna – nie zawsze jest określana)</li>
<li>Osoby, które przypisane są do realizacji danego zadania (jedna lub więcej)</li>
</ul>
</li>
<li>Zadania mają statusy:
<ul>
<li>Aktualne</li>
<li>Zrealizowane (archiwalne)</li>
<li>Zakończone bez realizacji (archiwalne)</li>
</ul>
</li>
<li>Użytkownik ma dostęp do listy swoich zadań. Widzi zarówno zadania przypisane do siebie jak i zadania przypisane przez siebie dla innych osób. Kolumny widoczne na liście, to:
<ul>
<li>Tytuł</li>
<li>Priorytet (w formie graficznej –ikona symbolizująca priorytet)</li>
<li>Opis (ok. 100 pierwszych znaków z treści zadania)</li>
<li>Data wykonania</li>
<li>Od (oznaczenie osoby, która zleciła zadanie)</li>
<li>Dla (oznaczenie osoby, dla której zlecone jest zadanie)</li>
</ul>
</li>
<li>Lista zadań może być filtrowana wg następujących kryteriów:
<ul>
<li>Stan (aktualne, archiwalne)</li>
<li>Data wykonania (filtr wyłączony lub określona data)</li>
<li>Tytuł/treść (wpisanie frazy, która będzie jednocześnie wyszukiwania w tytule i treści zadania)</li>
<li>Przypisane do (wybór z listy osób) – do kogo zadanie jest przypisane</li>
<li>Przypisane od (wybór z listy osób) – od kogo pochodzi zadanie</li>
</ul>
</li>
<li>Lista zadań powinna mieć możliwość wydruku – z uwzględnieniem filtrowania</li>
<li>Użytkownik powinien mieć możliwość podglądu szczegółów zadania – w odrębnym oknie.</li>
<li>Użytkownik powinien mieć możliwość zmiany statusu zadania na:
<ul>
<li>Zrealizowane</li>
<li>Zakończone bez realizacji</li>
</ul>
</li>
<li>Nie można zmienić statusu zadania ze zrealizowanego lub zakończonego bez realizacji na aktywny.</li>
<li>Zadania mogą być edytowane wyłącznie przez jego autora</li>
<li>Użytkownicy powinni móc logować się do aplikacji przy użyciu nazwy użytkownika i hasła. Dane te są nadawane przez administratora systemu.</li>
<li>Użytkownik może sortować listę wg dowolnej z wyświetlanych kolumn</li>
<li>Użytkownik może dowolnie zmieniać kolejność kolumn</li>
<li>Aplikacja powinna zapamiętywać ostatnio wybrany przez użytkownika wygląd listy (kolejność oraz posortowanie kolumn)</li>
</ol>
<p>Skoro wiemy już, jakie są oczekiwania użytkownika co do systemu &#8211; możemy przystąpić do wstępnego projektu. To już w następnym odcinku.</p>
<p>Przypomnę tylko o zaproszeniu do współpracy, <a href="http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">zawartym w poprzednim wpisie</a>.</p>
<ol></ol>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/' rel='bookmark' title='Permanent Link: Wielopoziomowa aplikacja &#8211; nauka przez przykład' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">Wielopoziomowa aplikacja &#8211; nauka przez przykład</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/11/nauka-przez-przyklad-opowiesci-uzytkownika/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wielopoziomowa aplikacja &#8211; nauka przez przykład</title>
		<link>http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/</link>
		<comments>http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 22:12:31 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[Entity Framework 4]]></category>
		<category><![CDATA[WCF]]></category>
		<category><![CDATA[WPF]]></category>
		<category><![CDATA[wspólny projekt]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=810</guid>
		<description><![CDATA[Większość aplikacji w jakich tworzeniu uczestniczyłem była aplikacjami webowymi. Postanowiłem zmierzyć się z&#160;innym zadaniem &#8211; aplikacją desktopową, która oparta będzie o dostępne w .NET mechanizmy. Nie jest to komercyjny projekt a poligon testowy polegający na określeniu architektury, zaprojektowaniu systemu i jego implemenacji. Wiadomo &#8211; teoria teorią, jednak dopiero zderzenie się w praktyce z poruszanymi zagadnieniami [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/11/nauka-przez-przyklad-opowiesci-uzytkownika/' rel='bookmark' title='Permanent Link: Nauka przez przykład &#8211; opowieści użytkownika' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/11/nauka-przez-przyklad-opowiesci-uzytkownika/?referer=');">Nauka przez przykład &#8211; opowieści użytkownika</a></li>
<li><a href='http://andrzej.net.pl/index.php/2011/06/proste-i-przyjemne-porownanie-kolekcji-w-net/' rel='bookmark' title='Permanent Link: Proste i przyjemne porównanie kolekcji w .NET' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2011/06/proste-i-przyjemne-porownanie-kolekcji-w-net/?referer=');">Proste i przyjemne porównanie kolekcji w .NET</a></li>
<li><a href='http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/' rel='bookmark' title='Permanent Link: Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/?referer=');">Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>Większość aplikacji w jakich tworzeniu uczestniczyłem była aplikacjami webowymi. Postanowiłem zmierzyć się z&nbsp;innym zadaniem &#8211; aplikacją desktopową, która oparta będzie o dostępne w .NET mechanizmy. Nie jest to komercyjny projekt a poligon testowy polegający na określeniu architektury, zaprojektowaniu systemu i jego implemenacji. Wiadomo &#8211; teoria teorią, jednak dopiero zderzenie się w praktyce z poruszanymi zagadnieniami pozwala na nauczenie się czegokolwiek zdecydowanie skuteczniej.<br />
<span id="more-810"></span></p>
<p>Tyle tytułem nudnego wstępu, przejdźmy do konkretów. Z racji tego, że przez zasiedzenie w technologiach webowych ominęło mnie <a href="http://msdn.microsoft.com/en-us/library/ms754130.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/ms754130.aspx?referer=');">WPF</a> &#8211; postanowiłem wykorzystać właśnie tę technologię przy realizacji projektu. Godne zainteresowania jest również <a href="http://msdn.microsoft.com/en-us/netframework/aa663324.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/netframework/aa663324.aspx?referer=');">Windows Communication Foundation</a> &#8211; czyli WCF. Jeśli chodzi o dostęp do danych przyznam, że wybór jest trudny. Używam i pokochałem <a href="http://nhforge.org/Default.aspx" onclick="pageTracker._trackPageview('/outgoing/nhforge.org/Default.aspx?referer=');">NHibernate</a> ale przy chęci nauki nowych narzędzi mocno kusi <a href="http://msdn.microsoft.com/en-us/data/ef.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/data/ef.aspx?referer=');">Entity Framework 4</a>, który jest już na tyle dojrzały, że warto się nim zainteresować.</p>
<p>Pewnie zastanawiacie się co to za projekt, który determinowany jest technologiami. Jak widać jest tutaj trochę odwrotna sytuacja &#8211; &#8222;dobieram&#8221; projekt do tego, czego chciałbym się nauczyć. Blog będzie dziennikiem, opisem napotykanych problemów, miejscem na Waszą krytykę podejmowanych działań.</p>
<p>Tutaj właśnie dochodzę do sedna sprawy. Przedzieranie się przez tyle nowych rzeczy może okazać się dość trudne przy ograniczonych zasobach czasowych (praca na pełny etat). Może więc znajdzie się czytelnik (dwóch?) chętnych do wspólnej nauki i prowadzenia projektu. Mam tutaj na myśli połączenie sił i konkretne podejście do tematu &#8211; bez kompromisów. Poligon z ostrą amunicją.</p>
<p>Przygotuję serię opowieści użytkownika pozwalających na opracowanie architektury systemu. Następnym etapem byłaby stopniowa implementacja i publikowanie wyników &#8211; np. na <a href="http://taskman.codeplex.com/" onclick="pageTracker._trackPageview('/outgoing/taskman.codeplex.com/?referer=');">CodePlex</a>. Pełny, konkretny i kompletny projekt, którego wynikiem będzie open source&#8217;owe oprogramowanie. Publikacja postępów na blogu (tym, który właśnie czytasz lub dedykowanym dla projektu &#8211; do wyboru).</p>
<p>Jednak żeby nie przedłużać, podsumujmy:</p>
<p>Cel: <strong>Aplikacja do zarządzania zadaniami z wykorzystaniem WPF, WCF, Entity Framework</strong><br />
Założenia: <strong>Publikowanie postępów, problemów i wyników kolejnych kroków w formie artykułów na blogu</strong><br />
Potrzebne: <strong>1-2 osoby, chcące uczestniczyć w projekcie. Idealnie, gdyby osoba ta <em>nie znała</em> przynajmniej jednej z wymienionych technologii i aby <em>znała co najmniej jedną</em> z nich</strong></p>
<p>Jeśli kogoś pomysł zainteresuje &#8211; zapraszam do kontaktu za pomocą <a href="http://andrzej.net.pl/index.php/kontakt/" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/kontakt/?referer=');">formularza</a>. Zobaczę, czy znajdą się zainteresowani i jak dalej potoczą się losy tego pomysłu.</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/11/nauka-przez-przyklad-opowiesci-uzytkownika/' rel='bookmark' title='Permanent Link: Nauka przez przykład &#8211; opowieści użytkownika' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/11/nauka-przez-przyklad-opowiesci-uzytkownika/?referer=');">Nauka przez przykład &#8211; opowieści użytkownika</a></li>
<li><a href='http://andrzej.net.pl/index.php/2011/06/proste-i-przyjemne-porownanie-kolekcji-w-net/' rel='bookmark' title='Permanent Link: Proste i przyjemne porównanie kolekcji w .NET' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2011/06/proste-i-przyjemne-porownanie-kolekcji-w-net/?referer=');">Proste i przyjemne porównanie kolekcji w .NET</a></li>
<li><a href='http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/' rel='bookmark' title='Permanent Link: Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/?referer=');">Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Operatory konwersji implicit oraz explicit</title>
		<link>http://andrzej.net.pl/index.php/2010/10/operatory-konwersji-implicit-oraz-explicit/</link>
		<comments>http://andrzej.net.pl/index.php/2010/10/operatory-konwersji-implicit-oraz-explicit/#comments</comments>
		<pubDate>Tue, 12 Oct 2010 20:53:30 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[conversion operators]]></category>
		<category><![CDATA[explicit operator]]></category>
		<category><![CDATA[implicit operator]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=804</guid>
		<description><![CDATA[W C# skorzystać możemy z operatorów konwersji &#8211; explicit (jawnych) oraz implicit (niejawnych). Co nam to daje? To co tygryski lubią najbardziej &#8211; wygodę i prostotę użytkowania ;) Definiując strukturę, wartość inicjalizujemy głównie przez konstruktor, np: struct SomeStruct &#160; &#160; &#123; &#160; &#160; &#160; &#160; private int _value; &#160; &#160; &#160; &#160; public int Value [...]


Nie znaleziono powiązanych wpisów.

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>W C# skorzystać możemy z operatorów konwersji &#8211; explicit (jawnych) oraz implicit (niejawnych).<br />
Co nam to daje? To co tygryski lubią najbardziej &#8211; wygodę i prostotę użytkowania ;)<br />
<span id="more-804"></span><br />
Definiując strukturę, wartość inicjalizujemy głównie przez konstruktor, np:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666cc; font-weight: bold;">struct</span> SomeStruct<br />
&nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">int</span> _value<span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">int</span> Value<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> _value<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> SomeStruct<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> value<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _value <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span></div></div>
<p>Utworzenie nowej instancji struktury w tym przypadku:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SomeStruct someStruct <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> SomeStruct<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">12</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></div></div>
<p>Okazuje się, że dzięki zastosowaniu jednego z tytułowych bohaterów &#8211; operatora implicit &#8211; możemy operację uprościć. Do struktury dodajemy kod:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #0600FF; font-weight: bold;">implicit</span> <span style="color: #0600FF; font-weight: bold;">operator</span> SomeStruct<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> value<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SomeStruct res <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> SomeStruct <span style="color: #008000;">&#123;</span> _value <span style="color: #008000;">=</span> value <span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> res<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span></div></div>
<p>Dzięki czemu możemy już pisać:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SomeStruct someStruct <span style="color: #008000;">=</span> <span style="color: #FF0000;">12</span><span style="color: #008000;">;</span></div></div>
<p>co wcześniej zwracało błąd kompilacji &#8222;cannot convert source type &#8222;int&#8221; to target type &#8222;SomeStruct&#8221;.</p>
<p>Bardzo podobnie sytuacja wygląda w drugą stronę. Dodając operator explicit konwersji na typ int:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #0600FF; font-weight: bold;">explicit</span> <span style="color: #0600FF; font-weight: bold;">operator</span> <span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#40;</span>SomeStruct someStruct<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> someStruct<span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span></div></div>
<p>możemy rzutować naszą strukturę bezpośrednio na typ int:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6666cc; font-weight: bold;">int</span> a <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#41;</span>someStruct<span style="color: #008000;">;</span></div></div>
<p>O ile w tym trywialnym przypadku zasadność korzystania z operatora explicit jest dyskusyjna, o tyle przy delikatnie bardziej złożonych strukturach można pamiętać o tych dobrodziejstwach.</p>


<p>Nie znaleziono powiązanych wpisów.</p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/10/operatory-konwersji-implicit-oraz-explicit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ErrorProvider i focus po nieudanej walidacji</title>
		<link>http://andrzej.net.pl/index.php/2010/05/errorprovider-i-focus-po-nieudanej-walidacji/</link>
		<comments>http://andrzej.net.pl/index.php/2010/05/errorprovider-i-focus-po-nieudanej-walidacji/#comments</comments>
		<pubDate>Thu, 13 May 2010 21:59:43 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[windows forms]]></category>
		<category><![CDATA[autovalidate]]></category>
		<category><![CDATA[errorprovider]]></category>
		<category><![CDATA[focus]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=771</guid>
		<description><![CDATA[Notka to bardziej &#8211; ku pamięci &#8211; niż pełnowartościowy wpis. Na co dzień programuję głównie dla weba używając ASP.NET, od czasu do czasu zdarza mi się napisać proste rzeczy w Windows Forms. Dziś przez dobre 30 minut (jeśli nie lepiej) rwałem sobie włosy z głowy zastanawiając się jakie property i w czym przestawić, żeby kontrolka [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET &#8211; Date Validator' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/?referer=');">Własny validator w ASP.NET &#8211; Date Validator</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p>Notka to bardziej &#8211; ku pamięci &#8211; niż pełnowartościowy wpis. Na co dzień programuję głównie dla weba używając ASP.NET, od czasu do czasu zdarza mi się napisać proste rzeczy w Windows Forms. Dziś przez dobre 30 minut (jeśli nie lepiej) rwałem sobie włosy z głowy zastanawiając się jakie property i w czym przestawić, żeby kontrolka ErrorProvider po zwalidowaniu TextBoxa pokazała błąd ale <strong>pozwoliła przejść dalej w formularzu</strong> (zmienić focus).</p>
<p><span id="more-771"></span></p>
<p>Im dłużej szukałem tym bardziej irytacja narastała. Przypadek ala &#8222;<a href="http://czasdzieci.pl/czytanki/id,41f74-julian_tuwim_okulary.html" onclick="pageTracker._trackPageview('/outgoing/czasdzieci.pl/czytanki/id_41f74-julian_tuwim_okulary.html?referer=');">Biega, krzyczy pan Hilary: Gdzie są moje okulary?&#8221;</a> Pamiętałem, że chodziło o coś w stylu &#8222;AllowTabChange&#8221;, &#8222;AllowFocusChaneOnError&#8221; czy inne cudo.</p>
<p>Najbardziej naturalne wydało mi się poszukiwanie we właściwościach samej kontrolki error provider. Oczywiście &#8211; nic bardziej mylnego :]</p>
<p><a href="http://andrzej.net.pl/wp-content/uploads/2010/05/error_provider3.png" rel="lightbox[771]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/05/error_provider3.png?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2010/05/error_provider3-212x300.png" alt="" title="ErrorProvider properties" width="212" height="300" class="alignnone size-medium wp-image-772" /></a></p>
<p>BlinkRate, BlinkStyle.. Nie ma nic pomocnego w rozwiązaniu mojego ogromnego, egzystencjonalnego problemu.<br />
Później zacząłem się przyglądać właściwościom samego TextBoxa&#8230; CausingValidation! Nie.. też nie to. Wtedy przestały się odpalać zdarzenia Validating i Validated &#8211; w sumie czemu miałoby być inaczej niż mówi opis tej właściwości ;) ?</p>
<p>Nadal uparcie blokował się focus na TextBoxie, jeśli jego zawartość nie spełniała warunków walidacji.. a ja tylko chciałem wypelnić sobie formularz w dowolnej kolejności!</p>
<p><a href="http://andrzej.net.pl/wp-content/uploads/2010/05/error_provider1.png" rel="lightbox[771]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/05/error_provider1.png?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2010/05/error_provider1.png" alt="" title="ErrorProvider - focus zablokowany" width="244" height="212" class="alignnone size-full wp-image-773" /></a></p>
<p>Przyszło oświecenie i zacząłem szukać we właściwościach samej formy.. Wiadomo &#8211; im bardziej czegoś się szuka tym bardziej się to ukrywa. Chyba za trzecim razem znalazłem property <strong>AutoValidate</strong>! Tak &#8211; to było to&#8230; Oklaski, owacje na stojąco, kurtyna&#8230; Zapamiętam już raczej do końca życia ;)</p>
<p><a href="http://andrzej.net.pl/wp-content/uploads/2010/05/error_provider4.png" rel="lightbox[771]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/05/error_provider4.png?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2010/05/error_provider4-228x300.png" alt="" title="ErrorProvider - AutoValidate" width="228" height="300" class="alignnone size-medium wp-image-774" /></a> <a href="http://andrzej.net.pl/wp-content/uploads/2010/05/error_provider5.png" rel="lightbox[771]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/05/error_provider5.png?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2010/05/error_provider5.png" alt="" title="ErrorProvider - uff" width="263" height="230" class="alignnone size-full wp-image-775" /></a></p>
<p>Oj potrafią dać w kość czasem takie głupoty. Człowiek nagle nie wie jak odpytać google&#8217;a, by coś sensownego podpowiedział, nikogo znajomego na żadnym komunikatorze. Strach i przerażenie ;)</p>
<p>Też zdarzają się Wam takie małe przeszkadzajki, odbierające więcej energii niż kilka godzin programowania :) ?</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET &#8211; Date Validator' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/?referer=');">Własny validator w ASP.NET &#8211; Date Validator</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/05/errorprovider-i-focus-po-nieudanej-walidacji/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji</title>
		<link>http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 22:40:53 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[C# klonowanie]]></category>
		<category><![CDATA[deep copy]]></category>
		<category><![CDATA[ICloneable]]></category>
		<category><![CDATA[serializacja]]></category>
		<category><![CDATA[shallow copy]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=692</guid>
		<description><![CDATA[Rozróżnia się dwie możliwości klonowania obiektów: shallow copy &#8211; tzw. płytka kopia. Najczęściej wykonywana przy użyciu metody MemberwiseClone z klasy Object. deep copy &#8211; tzw. głęboka, pełna kopia. Przyjrzymy się jednej z możliwości jej realizacji &#8211; wykorzystania serializacji do strumienia w pamięci. Zapewne wszyscy wiedzą o istnieniu metody MemberwiseClone w klasie Object. Pozwala ona na [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/?referer=');">Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Rozróżnia się dwie możliwości klonowania obiektów:</p>
<ul>
<li>shallow copy &#8211; tzw. płytka kopia. Najczęściej wykonywana przy użyciu metody MemberwiseClone z klasy Object.</li>
<li>deep copy &#8211; tzw. głęboka, pełna kopia. Przyjrzymy się jednej z możliwości jej realizacji &#8211; wykorzystania serializacji do strumienia w pamięci.</li>
</ul>
<p style="text-align:justify">
Zapewne wszyscy wiedzą o istnieniu metody <a href="http://msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.object.memberwiseclone.aspx?referer=');">MemberwiseClone</a> w klasie Object.<br />
Pozwala ona na wykonanie tzw. &#8222;shallow copy&#8221;, czyli &#8222;płytkiej kopii&#8221; obiektu. Kopia taka nie radzi sobie jednak z typami referencyjnymi zagnieżdżonymi w klonowanym obiekcie. Potrafi poprawnie kopiować tylko Value Types.
</p>
<p><span id="more-692"></span></p>
<p style="text-align:justify">
Weźmy przykładową klasę Person:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Person<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> FirstName <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span> LastName <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> DateTime BirthDate <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> Person Boss <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> Person<span style="color: #008000;">&#40;</span> <span style="color: #6666cc; font-weight: bold;">string</span> firstName, <span style="color: #6666cc; font-weight: bold;">string</span> lastName, DateTime birthDate <span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">FirstName</span> <span style="color: #008000;">=</span> firstName<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">LastName</span> <span style="color: #008000;">=</span> lastName<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">BirthDate</span> <span style="color: #008000;">=</span> birthDate<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span> &nbsp; &nbsp; &nbsp;<br />
<span style="color: #008000;">&#125;</span></div></div>
<p style="text-align:justify">
<p>Możemy zaimplementować interfejs <a href="http://msdn.microsoft.com/en-us/library/system.icloneable.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.icloneable.aspx?referer=');">ICloneable</a> dla &#8222;shallow copy&#8221; w ten sposób:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">object</span> Clone<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">MemberwiseClone</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p style="text-align:justify">
<p>Co się jednak stanie, gdy wykonamy kopię zmiennej kowalski z poniższego przykładu?
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Person jankowski <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Stefan&quot;</span>, <span style="color: #666666;">&quot;Jankowski&quot;</span>, <span style="color: #008000;">new</span> DateTime<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">1977</span>,<span style="color: #FF0000;">2</span>,<span style="color: #FF0000;">25</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
Person kowalski <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Jan&quot;</span>, <span style="color: #666666;">&quot;Kowalski&quot;</span>, <span style="color: #008000;">new</span> DateTime<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">1980</span>,<span style="color: #FF0000;">12</span>,<span style="color: #FF0000;">4</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
kowalski<span style="color: #008000;">.</span><span style="color: #0000FF;">Boss</span> <span style="color: #008000;">=</span> jankowski<span style="color: #008000;">;</span><br />
<br />
Person kowalskiCopy <span style="color: #008000;">=</span> <span style="color: #008000;">&#40;</span>Person<span style="color: #008000;">&#41;</span>kowalski<span style="color: #008000;">.</span><span style="color: #0000FF;">Clone</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
Debug<span style="color: #008000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;">&#40;</span>kowalski<span style="color: #008000;">.</span><span style="color: #0000FF;">Boss</span> <span style="color: #008000;">==</span> kowalskiCopy<span style="color: #008000;">.</span><span style="color: #0000FF;">Boss</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></div></div>
<p style="text-align:justify">
<p>Wynik? Tak jak oczekiwaliśmy, Boss w obiekcie kowalski oraz kowalskiCopy wskazują na ten sam obiekt &#8211; jankowski.</p>
<p>Jak widać nie jest to idealne wyjście. Rzadko zdarza się, by obiekt zawierał wyłącznie value types. Ponadto metodę MemberwiseClone możemy wywołać tylko w klasie, do której mamy dostęp. Dlaczego? Ponieważ jest ona oznaczona jako protected w klasie Object. Oznacza to, że nie użyjemy jej, gdy chcemy sklonować typ z innej biblioteki, której źródła nie jesteśmy w stanie sami zmodyfikować implementując ICloneable.</p>
<p>Właśnie tutaj z pomocą przychodzi nam serializacja. Wystarczy zserializować obiekt do strumienia w pamięci i zdeserializować do innej instancji. Gotowe.</p>
<p>Jak z realizacją?<br />
Nic nie stoi na przeszkodze, aby zamknąć kod w statycznej metodzie i wykorzystać typ generyczny. Dzięki temu będziemy mogli przy użyciu jednej metody serializować wszystkie typy! No &#8211; prawie wszystkie.</p>
<p>Należy pamiętać, że typ, który chcemy serializować:</p>
<ul>
<li>musi być oznaczony atrybutem <a href="http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.serializableattribute.aspx?referer=');">Serializable</a></li>
<li>wszystkie jego pola muszą być serializowalne</li>
</ul>
<p>Jeśli klasa nie będzie spełniać powyższych wymagań, w runtime otrzymamy SerializationException.</p>
<p> Do naszej klasy wprowadzamy więc małą modyfikację:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>Serializable<span style="color: #008000;">&#93;</span><br />
<span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> Person<br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">...</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p style="text-align:justify">
<p>Metoda, którą będziemy serializować nasze obiekty jest dość prosta.</p>
<p>W dyrektywie using tworzymy nowy MemoryStream. Następnie tworzymy instancję <a href="http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx?referer=');">BinaryFormattera</a>, informując go w konstruktorze, że będzie użyty w kontekście serializacji.<br />
Serializujemy przekazany obiekt, przewijamy stream do początku i deserializujemy. Musimy przeprowadzić rzutowanie (Deserialize zwraca Object). Trochę kodu:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> T CloneObject<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span> T item <span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp;<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008000;">&#40;</span> MemoryStream ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//instancja BinaryFormattera - informujemy go,</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//ze bedzie uzyty w celu klonowania</span><br />
&nbsp; &nbsp; &nbsp; BinaryFormatter bf <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> BinaryFormatter<span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">null</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">new</span> StreamingContext<span style="color: #008000;">&#40;</span>StreamingContextStates<span style="color: #008000;">.</span><span style="color: #0000FF;">Clone</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//serializacja</span><br />
&nbsp; &nbsp; &nbsp; bf<span style="color: #008000;">.</span><span style="color: #0000FF;">Serialize</span><span style="color: #008000;">&#40;</span>ms, item<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//przewijamy memoryStream do poczatku</span><br />
&nbsp; &nbsp; &nbsp; ms<span style="color: #008000;">.</span><span style="color: #0000FF;">Seek</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">0</span>, SeekOrigin<span style="color: #008000;">.</span><span style="color: #0000FF;">Begin</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//deserializacja</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #008000;">&#40;</span> T <span style="color: #008000;">&#41;</span>bf<span style="color: #008000;">.</span><span style="color: #0000FF;">Deserialize</span><span style="color: #008000;">&#40;</span>ms<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp;<span style="color: #008000;">&#125;</span><br />
<span style="color: #008000;">&#125;</span></div></div>
<p style="text-align:justify">
<p>To wszystko. Przykład użycia:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Person kowalskiCopy <span style="color: #008000;">=</span> Tools<span style="color: #008000;">.</span><span style="color: #0000FF;">CloneObject</span><span style="color: #008000;">&lt;</span>Person<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span>kowalski<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
Debug<span style="color: #008000;">.</span><span style="color: #0000FF;">Write</span><span style="color: #008000;">&#40;</span>kowalski<span style="color: #008000;">.</span><span style="color: #0000FF;">Boss</span> <span style="color: #008000;">==</span> kowalskiCopy<span style="color: #008000;">.</span><span style="color: #0000FF;">Boss</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></div></div>
<p>Efekt wykonania tej metody? W oknie output pojawi się false. Oznacza to, że obiekt został w pełni sklonowany &#8211; łącznie z referencją do szefa.</p>
<p>Jest jeszcze kilka niewielkich niuansów związanych z serializacją &#8211; jak np. delegaty czy propertiesy, które nie powinny być serializowalne. To jednak materiał na odrębny, obszerny wpis.</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/?referer=');">Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Visual Studio &#8211; jednoczesne debugowanie kilku projektów w solution</title>
		<link>http://andrzej.net.pl/index.php/2010/01/visual-studio-jednoczesne-debugowanie-kilku-projektow-w-solution/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/visual-studio-jednoczesne-debugowanie-kilku-projektow-w-solution/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 21:45:06 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[visual studio tricks]]></category>
		<category><![CDATA[debugowanie wielu projektów]]></category>
		<category><![CDATA[visual studio 2008]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=685</guid>
		<description><![CDATA[Najprostsze rozwiązania często są w Visual Studio sprytnie ukryte. Takie czasem odnoszę wrażenie. Jedną z rzeczy, na które narzekałem przy debugowaniu np. WebService&#8217;ów czy aplikacji współdzielących niektóre zasoby był brak możliwości ustawienia jako &#8222;Startup&#8221; kilku projektów w ramach jednej solucji. Okazuje się jednak, że jest to banalnie proste.. Przeważnie ustawiałem jeden projekt jako startowy korzystając [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/the-web-application-is-configured-to-use-iis-the-iis-web-server-is-not-installed-on-this-computer/' rel='bookmark' title='Permanent Link: The Web Application is configured to use IIS. The IIS Web server is not installed on this computer.' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/the-web-application-is-configured-to-use-iis-the-iis-web-server-is-not-installed-on-this-computer/?referer=');">The Web Application is configured to use IIS. The IIS Web server is not installed on this computer.</a></li>
<li><a href='http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/' rel='bookmark' title='Permanent Link: Wielopoziomowa aplikacja &#8211; nauka przez przykład' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">Wielopoziomowa aplikacja &#8211; nauka przez przykład</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Najprostsze rozwiązania często są w Visual Studio sprytnie ukryte. Takie czasem odnoszę wrażenie. Jedną z rzeczy, na które narzekałem przy debugowaniu np. WebService&#8217;ów czy aplikacji współdzielących niektóre zasoby był brak możliwości ustawienia jako &#8222;Startup&#8221; kilku projektów w ramach jednej solucji. Okazuje się jednak, że jest to banalnie proste..
</p>
<p><span id="more-685"></span></p>
<p style="text-align:justify">
Przeważnie ustawiałem jeden projekt jako startowy korzystając z opcji w menu kontekstowym na projekcie: &#8222;Set as startup project&#8221;.<br />
<a href="http://andrzej.net.pl/wp-content/uploads/2010/01/plik046.jpg" rel="lightbox[685]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/01/plik046.jpg?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2010/01/plik046-150x150.jpg" alt="" title="Opcja &quot;Set as startup project&quot;" width="150" height="150" class="aligncenter size-thumbnail wp-image-686" /></a>
</p>
<p style="text-align:justify">
Możliwe jest jednak ustawienie wielu projektów jako startowych. W tym celu należy wywołać menu kontekstowe na Solution i wybrać Properties:<br />
<a href="http://andrzej.net.pl/wp-content/uploads/2010/01/plik047.jpg" rel="lightbox[685]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/01/plik047.jpg?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2010/01/plik047-150x150.jpg" alt="" title="Solution, menu kontekstowe" width="150" height="150" class="aligncenter size-thumbnail wp-image-687" /></a>
</p>
<p style="text-align:justify">
Naszym oczom ukaże się okno właściwości. Wybieramy po lewej opcję Common Properties -> Startup Project.<br />
Teraz wystarczy przełączyć je w tryb &#8222;Multiple startup projects&#8221; i wybrać akcję na tych projektach, które nas interesują:<br />
<a href="http://andrzej.net.pl/wp-content/uploads/2010/01/plik048.jpg" rel="lightbox[685]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2010/01/plik048.jpg?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2010/01/plik048-150x150.jpg" alt="" title="Właściwości solucji" width="150" height="150" class="aligncenter size-thumbnail wp-image-688" /></a>
</p>
<p style="text-align:justify">
Można ustawić projekt w trybie:</p>
<ul>
<li>None &#8211; wiadomo ;)</li>
<li>Start &#8211; uruchamia z debuggerem</li>
<li>Start without debugging &#8211; wiadomo ;)</li>
</ul>
<p>Także.. happy debugging! ;)</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/08/the-web-application-is-configured-to-use-iis-the-iis-web-server-is-not-installed-on-this-computer/' rel='bookmark' title='Permanent Link: The Web Application is configured to use IIS. The IIS Web server is not installed on this computer.' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/the-web-application-is-configured-to-use-iis-the-iis-web-server-is-not-installed-on-this-computer/?referer=');">The Web Application is configured to use IIS. The IIS Web server is not installed on this computer.</a></li>
<li><a href='http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/' rel='bookmark' title='Permanent Link: Wielopoziomowa aplikacja &#8211; nauka przez przykład' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">Wielopoziomowa aplikacja &#8211; nauka przez przykład</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/visual-studio-jednoczesne-debugowanie-kilku-projektow-w-solution/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną</title>
		<link>http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/</link>
		<comments>http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/#comments</comments>
		<pubDate>Mon, 04 Jan 2010 21:30:55 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[jedna instancja aplikacji]]></category>
		<category><![CDATA[mutex]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=677</guid>
		<description><![CDATA[Uzupełniam ostatnio braki w wiedzy, dotyczące synchronizacji wątków. Gdzieś w podrozdziale dotyczącym tego tematu przykuł moją uwagę Mutex. Mutex to, obok monitorów i semaforów, jedna z &#8222;prymitywnych&#8221; metod synchronizacji. Ma jednak bardzo ciekawą właściwość, odróżniającą ją od kolegów po fachu&#8230; Otóż co to za właściwość? Tatusiem Mutexu jest bezpośrednio windowsowy kernel a jego właścicielem może [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/' rel='bookmark' title='Permanent Link: Wielopoziomowa aplikacja &#8211; nauka przez przykład' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">Wielopoziomowa aplikacja &#8211; nauka przez przykład</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/' rel='bookmark' title='Permanent Link: &#8222;throw&#8221; czy &#8222;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/?referer=');">&#8222;throw&#8221; czy &#8222;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej</a></li>
<li><a href='http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/' rel='bookmark' title='Permanent Link: Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/?referer=');">Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify">
Uzupełniam ostatnio braki w wiedzy, dotyczące synchronizacji wątków. Gdzieś w podrozdziale dotyczącym tego tematu przykuł moją uwagę <a href="http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.threading.mutex.aspx?referer=');">Mutex</a>. Mutex to, obok monitorów i semaforów, jedna z &#8222;prymitywnych&#8221; metod synchronizacji. Ma jednak bardzo ciekawą właściwość, odróżniającą ją od kolegów po fachu&#8230;
</p>
<p><span id="more-677"></span></p>
<p style="text-align:justify">
Otóż co to za właściwość? Tatusiem Mutexu jest bezpośrednio windowsowy kernel a jego właścicielem może być w jednej chwili tylko jeden wątek. Wątek, który przejmuje obiekt typu Mutex na własność nie blokuje sam siebie ale musi zwolnić go przy użyciu metody ReleaseMutex. Co w tym nadzwyczajnego? Jeszcze jedna sztuczka!
</p>
<p style="text-align:justify">
Korzystając z jednego z przeciążonych konstruktorów, możemy nadać obiektowi typu Mutex nazwę. Uwaga, kurtyna w górę ;) <strong>Nazwa ta jest unikalna</strong> wśród wszystkich procesów w systemie! Otóż to, panie i panowie ;) Całe to cudeńko pozwala nam niejako udostępniać obiekt Mutex pomiędzy różnymi aplikacjami. Przeważnie użylibyśmy tej właściwości do synchronizacji dostępu tych aplikacji np. do zasobów dyskowych, sieciowych itp. Jednak jest jeszcze jedno interesujące użycie.
</p>
<p style="text-align:justify">
Do sedna. Wykorzystując <a href="http://msdn.microsoft.com/en-us/library/bwe34f1k.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/bwe34f1k.aspx?referer=');">konstruktor z trzema parametrami</a>:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> Mutex<span style="color: #008000;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #6666cc; font-weight: bold;">bool</span> initiallyOwned,<br />
&nbsp; &nbsp; <span style="color: #6666cc; font-weight: bold;">string</span> name,<br />
&nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">out</span> <span style="color: #6666cc; font-weight: bold;">bool</span> createdNew<br />
<span style="color: #008000;">&#41;</span></div></div>
<p>Możemy skonstruować sprytny kod, który pozwoli uruchomić jednocześnie tylko jedną instancję pisanej przez nas aplikacji. Przykład?</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args <span style="color: #008000;">&#41;</span><br />
<span style="color: #008000;">&#123;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #6666cc; font-weight: bold;">bool</span> isNewCreated<span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #000000;">System.<span style="color: #0000FF;">Threading</span></span><span style="color: #008000;">.</span><span style="color: #0000FF;">Mutex</span> mutex <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Mutex<span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">true</span>, <span style="color: #666666;">&quot;MUTEX_DEMO&quot;</span>, <span style="color: #0600FF; font-weight: bold;">out</span> isNewCreated<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp;<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span> isNewCreated <span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp;<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Brawo - jesteś pierwszy! ;)&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp;<span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp;<span style="color: #0600FF; font-weight: bold;">else</span><br />
&nbsp; &nbsp;<span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Niestety! Nie byłeś pierwszy ;)&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp;<span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp;Console<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
<span style="color: #008000;">&#125;</span></div></div>
<p>W sumie jedną linijką kodu załatwiamy sprawdzenie. Być może nie jest to wyjście idealne, ale czasem może uratować trochę czasu.</p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/' rel='bookmark' title='Permanent Link: Wielopoziomowa aplikacja &#8211; nauka przez przykład' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/10/wielopoziomowa-aplikacja-nauka-przez-przyklad/?referer=');">Wielopoziomowa aplikacja &#8211; nauka przez przykład</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/' rel='bookmark' title='Permanent Link: &#8222;throw&#8221; czy &#8222;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/?referer=');">&#8222;throw&#8221; czy &#8222;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej</a></li>
<li><a href='http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/' rel='bookmark' title='Permanent Link: Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/?referer=');">Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Książki &#8211; co czytam. Certyfikacja &#8211; czy warto?</title>
		<link>http://andrzej.net.pl/index.php/2009/10/ksiazki-co-czytam-certyfikacja-czy-warto/</link>
		<comments>http://andrzej.net.pl/index.php/2009/10/ksiazki-co-czytam-certyfikacja-czy-warto/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 21:52:07 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[ogólne]]></category>
		<category><![CDATA[certyfikacja MS]]></category>
		<category><![CDATA[CLR VIA C#]]></category>
		<category><![CDATA[książki o C#]]></category>
		<category><![CDATA[MCTS 70-536]]></category>
		<category><![CDATA[THE BASE CLASS LIBRARY]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=627</guid>
		<description><![CDATA[Na wstępie &#8222;krótkie&#8221; wprowadzenie &#8211; opis książki, którą męczyłem przez ostatnie ładnych &#8222;kilka&#8221; dni ;) Co uważniejsi z czytelników zauważyli malutki widget po prawej stronie &#8211; &#8222;Obecnie czytam&#8221;. Właśnie wymieniła się w niej książka. Skończyłem czytać &#8222;CLR VIA C#&#8221; Richtera, zabieram się za &#8222;VISUAL C# 2005: THE BASE CLASS LIBRARY&#8221; Balena. Z tą książką powinno [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/' rel='bookmark' title='Permanent Link: Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/?referer=');">Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p><a rev="vote-for" href="http://dotnetomaniak.pl/Ksi%C4%85%C5%BCki-co-czytam" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/Ksi_C4_85_C5_BCki-co-czytam?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F10%2Fksiazki-co-czytam-certyfikacja-czy-warto%2F" style="border:0px"/></a></p>
<p>Na wstępie &#8222;krótkie&#8221; wprowadzenie &#8211; opis książki, którą męczyłem przez ostatnie ładnych &#8222;kilka&#8221; dni ;)</p>
<p style="text-align:justify">
Co uważniejsi z czytelników zauważyli malutki widget po prawej stronie &#8211; &#8222;Obecnie czytam&#8221;. Właśnie wymieniła się w niej książka. Skończyłem czytać <a href="http://www.microsoft.com/learning/en/us/book.aspx?ID=6522&#038;locale=en-us" onclick="pageTracker._trackPageview('/outgoing/www.microsoft.com/learning/en/us/book.aspx?ID=6522_038_locale=en-us&amp;referer=');">&#8222;CLR VIA C#&#8221; Richtera</a>, zabieram się za <a href="http://www.amazon.com/Programming-Microsoft-Visual-2005-Pro-Developer/dp/0735623082" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/Programming-Microsoft-Visual-2005-Pro-Developer/dp/0735623082?referer=');">&#8222;VISUAL C# 2005: THE BASE CLASS LIBRARY&#8221; Balena</a>. Z tą książką powinno pójść łatwiej i szybciej niż z Richterem (takie mam wrażenie).
</p>
<p style="text-align:justify">
CLR VIA C# jest bardzo interesującą pozycją, którą polecam każdemu. Richter w dość swoisty sposób rozebrał na części pierwsze wszystko, z czym spotykamy się na co dzień. Pierwsza część jest mocno teoretyczna &#8211; operacja na otwartym sercu .NET, czyli CLR właśnie. Ciekawostki, ogólny zarys i założenia, które zapadają w pamięć i sporo rozjaśniają. Część &#8222;Working with types&#8221; &#8211; dość ciekawa. Nie zanudza, mimo, iż opisuje rzeczy oczywiste. &#8222;Designing parts&#8221; &#8211; wspaniałe kompendium dla każdego, kto programuje współdzielone komponenty lub po prostu dąży do tego, by jego kod był zgodny ze standardem, skalowalny, bezpieczny i zoptymalizowany. 70 stron czyta się z miłym odczuciem, że nareszcie ktoś uporządkował to nad czym zawsze zastanawiałem się &#8222;czy robię to dobrze?&#8221;.
</p>
<p><span id="more-627"></span></p>
<p style="text-align:justify">
Dział &#8222;Essential types&#8221; również segreguje i porządkuje zagadnienia dotyczące rzeczy, z którymi spotykami się często. Praca z tekstem, typami enumerowanymi, tablicami, interfejsami, typami generycznymi &#8211; po lekturze staje się bardziej przewidywalna i pewna. Same przykłady są naprawdę w porządku. Prezentują często wiele aspektów poruszanego zagadnienia w&nbsp;przystępny sposób. Nie traktują czytelnika jako &#8222;niepełnosprytnego&#8221; wyjaśniając niepotrzebnie każdą linijkę &#8211; oby takie przykłady spotykać w każdej książce.
</p>
<p style="text-align:justify">
Sekcja &#8222;CLR Facilities&#8221; nie jest lekka ale jest niesamowicie przydatna. Świadomość istnienia i sposób działania Garbage Collectora, refleksje i operacje asynchroniczne &#8211; nie taki wilk straszny, jak go malują.
</p>
<p style="text-align:justify">
Książki tej (niemal 650 stron) nie da się przeczytać i zapamiętać wszystkiego. Nie raz jednak wracam do niej podczas codziennej pracy, utrwalając coś, co w danej chwili robię. Sama świadomość, że wiadomo gdzie zajrzeć aby uzyskać pewną podpowiedź czy wskazówkę jest komfortowa. Książka to kompendium, które zwraca uwagę na aspekty często traktowane w innych publikacjach po macoszemu lub wręcz pomijane. &#8222;Important notes&#8221; &#8211; przyciągają uwagę do pułapek, na których można się wyłożyć przy nieumiejętnym używaniu tego, co oferuje C#. Jednocześnie książkę czyta się przyjemnie. Liczne wzmianki o tym, że Microsoft (zdaniem autora) coś schrzanił i ma nadzieję, że naprawią to w następnej wersji przyprawiają o&nbsp;uśmiech i zwracają uwagę na to, że nikt nie jest nieomylny ;) Richter ma co prawda świra na punkcie thread safety, security, wydajności, zasięgu widoczności zmiennych, pieczętowania klas &#8211; i trochę tym zaraża ;) To w sumie jedyny zarzut do książki ;)
</p>
<p style="text-align:justify">
Jeden z przykładów, gdy sedno będzie krótsze niż wstęp ;) Po przeczytaniu &#8222;THE BCL&#8221; zastanawiam się nad połknięciem pozycji stricte &#8222;egzaminowej&#8221; i podejście do MCTS. Propozycja szefostwa i własne obserwacje to <a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-536&#038;Locale=en-us" onclick="pageTracker._trackPageview('/outgoing/www.microsoft.com/learning/en/us/Exam.aspx?ID=70-536_038_Locale=en-us&amp;referer=');">70-536: Microsoft .NET Framework &#8211; Application Development Foundation</a>. Ktoś z Was miał sposobność zdawać? Jak poszło? Jak się przygotowywaliście? Ile czasu Wam to zajęło? Może ktoś, tak jak ja, dopiero planuje? Czy według Was obecnie takie potwierdzenie umiejętności &#8211; poza własną satysfakcją &#8211; jest przydatne?
</p>
<p style="text-align:justify">
Zapraszam do dyskusji w&nbsp;komentarzach. Myślę, że pomoże to i mi rozwiać niektóre wątpliwości.<br />
Jeśli ktoś chce podzielić się informacją o ciekawej książce (niekoniecznie w tematyce egzaminowej) &#8211; również chętnie zapoznam się z Waszym &#8222;co czytam&#8221;.
</p>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/Ksi%C4%85%C5%BCki-co-czytam" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/Ksi_C4_85_C5_BCki-co-czytam?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F10%2Fksiazki-co-czytam-certyfikacja-czy-warto%2F" style="border:0px"/></a></p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/' rel='bookmark' title='Permanent Link: Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/01/shallow-copy-a-deep-copy-klonowanie-obiektu-z-memberwiseclone-oraz-przy-uzyciu-serializacji/?referer=');">Shallow copy a deep copy &#8211; klonowanie obiektu z MemberwiseClone oraz przy użyciu serializacji</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/10/ksiazki-co-czytam-certyfikacja-czy-warto/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>&#8222;throw&#8221; czy &#8222;throw exc&#8221; &#8211; czyli jak najlepiej przerzucić wyjątek wyżej</title>
		<link>http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/</link>
		<comments>http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 22:31:19 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[c#]]></category>
		<category><![CDATA[nowe]]></category>
		<category><![CDATA[pełny stack trace]]></category>
		<category><![CDATA[przerzucenie wyjątku]]></category>
		<category><![CDATA[re-throw]]></category>
		<category><![CDATA[throw]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=613</guid>
		<description><![CDATA[Pewnie nie raz staliście przed sytuacją, w której jakaś z funkcji spowodować może powstanie wyjątku, którego wystąpienie trzeba zalogować i przerzucić go dalej (re-throw), aby aplikacja zajęła się nim jak należy. Jednocześnie idealnie, gdy wyjątek zawierał będzie jak najwięcej informacji. Zalicza się do nich przyjaciel każdego programisty &#8211; StackTrace. Rozpatrzmy poniższy kod: public sealed class [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/' rel='bookmark' title='Permanent Link: Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/?referer=');">Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p><a rev="vote-for" href="http://dotnetomaniak.pl/throw-czy-throw-exc-czyli-jak-najlepiej-przerzuci%C4%87-wyj%C4%85tek-wy%C5%BCej-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/throw-czy-throw-exc-czyli-jak-najlepiej-przerzuci_C4_87-wyj_C4_85tek-wy_C5_BCej-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F10%2Fthrow-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek%2F" style="border:0px"/></a></p>
<p style="text-align:justify;">
Pewnie nie raz staliście przed sytuacją, w której jakaś z funkcji spowodować może powstanie wyjątku, którego wystąpienie trzeba zalogować i przerzucić go dalej (re-throw), aby aplikacja zajęła się nim jak należy. Jednocześnie idealnie, gdy wyjątek zawierał będzie jak najwięcej informacji. Zalicza się do nich przyjaciel każdego programisty &#8211; <a href="http://msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx" onclick="pageTracker._trackPageview('/outgoing/msdn.microsoft.com/en-us/library/system.exception.stacktrace.aspx?referer=');">StackTrace</a>.
</p>
<p><span id="more-613"></span></p>
<p style="text-align:justify;">
Rozpatrzmy poniższy kod:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">sealed</span> <span style="color: #6666cc; font-weight: bold;">class</span> SomeClass<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> SomeTestPublicMethod<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SomeMethod<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">catch</span> <span style="color: #008000;">&#40;</span>ApplicationException exc<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008080; font-style: italic;">//logujemy blad</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">throw</span> exc<span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">private</span> <span style="color: #6666cc; font-weight: bold;">void</span> SomeMethod<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">throw</span> <span style="color: #008000;">new</span> ApplicationException<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Błąd w SomeMethod&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span></div></div>
<p style="text-align:justify;">
Czyli testowa klasa, której metodę SomeTestPublicMethod udostępniamy jako publiczną, ona natomiast wywołuje prywatną metodę SomeMethod &#8211; rzucającą wyjątek ApplicationException.<br />
Jak widać wystąpienie wyjątku chcemy zalogować w metodzie SomeTestPublicMethod i rzucić wyjątek dalej. Kod wykonujący nasz &#8222;błędny&#8221; program:
</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SomeClass sc <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> SomeClass<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sc<span style="color: #008000;">.</span><span style="color: #0000FF;">SomeTestPublicMethod</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">catch</span> <span style="color: #008000;">&#40;</span>Exception exc<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>exc<span style="color: #008000;">.</span><span style="color: #0000FF;">Message</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>exc<span style="color: #008000;">.</span><span style="color: #0000FF;">StackTrace</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span></div></div>
<p style="text-align:justify;">
Czego spodziewacie się w StackTrace? Czy zaprowadzi nas ona do oryginalnej metody SomeMethod, która spowodowała błąd? Otóż niestety nie, StackTrace wygląda tak:
</p>
<div id="attachment_619" class="wp-caption aligncenter" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2009/10/plik024.jpg" rel="lightbox[613]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2009/10/plik024.jpg?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2009/10/plik024-300x80.jpg" alt="Niepełny StackTrace" title="Niepełny StackTrace" width="300" height="80" class="size-medium wp-image-619" /></a><p class="wp-caption-text">Niepełny StackTrace</p></div>
<p style="text-align:justify;">
Zauważcie, że Message jest w porządku &#8211; pochodzi z oryginalnie rzuconego wyjątku. Dokładna informacja o&nbsp;linii wskazuje jednak dopiero na miejsce, w&nbsp;którym napisaliśmy &#8222;throw exc;&#8221; &#8211; czyli  SomeTestPublicMethod. Może wydawać się to nieistotne, bez debugowania ciężko byłoby jednak odgadnąć w czym problem i&nbsp;gdzie on tak naprawdę powstaje.<br />
Zamieńmy dosłownie jedną linię &#8211; zamiast &#8222;throw exc&#8221; zróbmy &#8222;throw&#8221;. Efekt?
</p>
<div id="attachment_620" class="wp-caption aligncenter" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2009/10/plik025.jpg" rel="lightbox[613]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2009/10/plik025.jpg?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2009/10/plik025-300x97.jpg" alt="Kompletny StackTrace" title="Kompletny StackTrace" width="300" height="97" class="size-medium wp-image-620" /></a><p class="wp-caption-text">Kompletny StackTrace</p></div>
<p style="text-align:justify;">
Różnica? Bogatszy StackTrace wskazujący na oryginalne miejsce powstania błędu &#8211; czyli prywatną metodę SomeMethod. Być może zagadnienie niektórym wydaje się trywialne, ale pamiętajcie &#8211; jeśli chcecie po prostu &#8222;pchnąć&#8221; wyjątek dalej, bez utraty informacji (ani opakowania go we własną klasę wyjątku &#8211; np. przekazując jako InnerException) używajcie samego &#8222;throw&#8221;. Oszczędzić może trochę pracy w przyszłości ;)
</p>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/throw-czy-throw-exc-czyli-jak-najlepiej-przerzuci%C4%87-wyj%C4%85tek-wy%C5%BCej-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/throw-czy-throw-exc-czyli-jak-najlepiej-przerzuci_C4_87-wyj_C4_85tek-wy_C5_BCej-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F10%2Fthrow-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek%2F" style="border:0px"/></a></p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/' rel='bookmark' title='Permanent Link: Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2010/01/mutex-i-sprawdzanie-czy-aplikacja-jest-jedyna-uruchomiona/?referer=');">Mutex i sprawdzanie czy aplikacja jest jedyną uruchomioną</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/10/throw-czy-throw-exc-czyli-jak-najlepiej-przerzucic-wyjatek/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Własny validator w ASP.NET – CheckBoxListValidator</title>
		<link>http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-%e2%80%93-checkboxlistvalidator/</link>
		<comments>http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-%e2%80%93-checkboxlistvalidator/#comments</comments>
		<pubDate>Sat, 19 Sep 2009 22:18:58 +0000</pubDate>
		<dc:creator>andrzej</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[checkboxlistvalidator]]></category>
		<category><![CDATA[custom validator]]></category>
		<category><![CDATA[walidacja checkboxlist]]></category>

		<guid isPermaLink="false">http://andrzej.net.pl/?p=589</guid>
		<description><![CDATA[W przedostatnim wpisie, poruszyłem temat napisania własnego walidatora do daty. Dziś napotkałem na podobny problem &#8211; walidacja kontrokli CheckBoxList pod kątem zaznaczenia przynajmniej jednej wartości. Jakieś było moje zaskoczenie ;-) gdy okazało się, że żadna z&#160;domyślnych kontrolek walidatorów nie potrafi tego niezmiernie skomplikowanego zadania wykonać ;-) Oczywiście można to załatwić banalnie: CustomValidator i odpowiednia prosta [...]


Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET &#8211; Date Validator' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/?referer=');">Własny validator w ASP.NET &#8211; Date Validator</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/?referer=');">Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol>

Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.]]></description>
			<content:encoded><![CDATA[<p><a rev="vote-for" href="http://dotnetomaniak.pl/W%C5%82asny-validator-w-ASPNET-CheckBoxListValidator-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/W_C5_82asny-validator-w-ASPNET-CheckBoxListValidator-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F09%2Fwlasny-validator-w-asp-net-%25e2%2580%2593-checkboxlistvalidator%2F" style="border:0px"/></a></p>
<p style="text-align:justify">
W przedostatnim wpisie, poruszyłem temat napisania <a href="http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/?referer=');">własnego walidatora do daty</a>. Dziś napotkałem na podobny problem &#8211; walidacja kontrokli CheckBoxList pod kątem zaznaczenia przynajmniej jednej wartości. Jakieś było moje zaskoczenie ;-) gdy okazało się, że żadna z&nbsp;domyślnych kontrolek walidatorów nie potrafi tego niezmiernie skomplikowanego zadania wykonać ;-) Oczywiście można to załatwić banalnie: CustomValidator i odpowiednia prosta funkcja. Gdzie jednak ponowne wykorzystanie kodu &#8211; tak przecież przez nas wszystkich lubiane :) W kolejnym projekcie, na kolejnej stronie &#8211; nie będziemy przecież kopiować kodu.<br />
<span id="more-589"></span>
</p>
<p>W związku z tym, że większość kodu dla walidatorów jest wspólna (różnią się tylko funkcją EvaluateIsValid oraz kodem JS) nie będę zbyt mocno się rozpisywał. Oto kod:</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> CheckBoxListValitator <span style="color: #008000;">:</span> BaseValidator<br />
&nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">bool</span> ControlPropertiesValid<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> FindControl<span style="color: #008000;">&#40;</span>ControlToValidate<span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">as</span> CheckBoxList <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">bool</span> EvaluateIsValid<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #008000;">&#40;</span>FindControl<span style="color: #008000;">&#40;</span>ControlToValidate<span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">as</span> CheckBoxList<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">SelectedItem</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">protected</span> <span style="color: #0600FF; font-weight: bold;">override</span> <span style="color: #6666cc; font-weight: bold;">void</span> OnPreRender<span style="color: #008000;">&#40;</span>EventArgs e<span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">base</span><span style="color: #008000;">.</span><span style="color: #0000FF;">OnPreRender</span><span style="color: #008000;">&#40;</span>e<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">&#40;</span>ControlPropertiesValid<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">EnableClientScript</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Page<span style="color: #008000;">.</span><span style="color: #0000FF;">ClientScript</span><span style="color: #008000;">.</span><span style="color: #0000FF;">RegisterClientScriptResource</span><span style="color: #008000;">&#40;</span>GetType<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;WebControls.Resources.checkboxlist_validate.js&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Page<span style="color: #008000;">.</span><span style="color: #0000FF;">ClientScript</span><span style="color: #008000;">.</span><span style="color: #0000FF;">RegisterExpandoAttribute</span><span style="color: #008000;">&#40;</span>ClientID, <span style="color: #666666;">&quot;evaluationfunction&quot;</span>, <span style="color: #666666;">&quot;validate_CBL&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #008000;">&#125;</span></div></div>
<p>Wszystko wygląda standardowo:</p>
<ul>
<li><strong>ControlPropertiesValid</strong> &#8211; sprawdzamy, czy kontrolka, której ID trzyma property ControlToValidate jest rzeczywiście kontrolką typu CheckBoxList</li>
<li><strong>EvaluateIsValid</strong> &#8211; sprawdzamy, czy jakikolwiek element został zaznaczony</li>
<li><strong>OnPreRender</strong> &#8211; podłączamy nasz kod do walidacji po stronie klienta</li>
</ul>
<p style="text-align:justify">
Kod do walidacji CheckBoxLista po stronie klienta również nie jest zbyt skomplikowany. CheckBoxList jest renderowany jako tabelka, w której komórki są zestawem: input typu checkbox + label z atrybutem for. Wystarczy więc pętlą &#8222;przelecieć&#8221; po wszystkich elementach tabelki typu checkbox i sprawdzić, czy którykolwiek z nich jest zaznaczony.</p>
<div id="attachment_594" class="wp-caption aligncenter" style="width: 310px"><a href="http://andrzej.net.pl/wp-content/uploads/2009/09/plik020.jpg" rel="lightbox[589]" onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/wp-content/uploads/2009/09/plik020.jpg?referer=');"><img src="http://andrzej.net.pl/wp-content/uploads/2009/09/plik020-300x68.jpg" alt="CheckBoxList renderowany jako tabelka" title="CheckBoxList renderowany jako tabelka" width="300" height="68" class="size-medium wp-image-594" /></a><p class="wp-caption-text">CheckBoxList renderowany jako tabelka</p></div>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #003366; font-weight: bold;">function</span> validate_CBL<span style="color: #009900;">&#40;</span>sender<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> val <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>sender.<span style="color: #660066;">id</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">controltovalidate</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> col <span style="color: #339933;">=</span> val.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;*&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>col <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> col.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>col.<span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">tagName</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;INPUT&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>col.<span style="color: #000066; font-weight: bold;">item</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">checked</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p style="text-align:justify">
Gotowe. Nasz skrypt podłączamy tak jako ostatnio &#8211; w zasobach, rejestrując go w pliku AssemblyInfo.cs, w folderze Properties projektu. Jednocześnie oczywiście nie zapominamy o ustawieniu we właściwościah naszego pliku Build Action na Embedded Resource ;)</p>
<div class="codecolorer-container csharp default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="csharp codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #008000;">&#91;</span>assembly<span style="color: #008000;">:</span> WebResource<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;WebControls.Resources.checkboxlist_validator.js&quot;</span>, <span style="color: #666666;">&quot;application/x-javascript&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#93;</span></div></div>
<p>Demo:<br />
<a href="http://asp.andrzej.net.pl/" onclick="pageTracker._trackPageview('/outgoing/asp.andrzej.net.pl/?referer=');">asp.andrzej.net.pl</a></p>
<p>Kod do pobrania:<br />
Note: There is a file embedded within this post, please visit this post to download the file.</p>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/W%C5%82asny-validator-w-ASPNET-CheckBoxListValidator-Blog-o-programowaniu-C-ASPNET" onclick="pageTracker._trackPageview('/outgoing/dotnetomaniak.pl/W_C5_82asny-validator-w-ASPNET-CheckBoxListValidator-Blog-o-programowaniu-C-ASPNET?referer=');"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fandrzej.net.pl%2Findex.php%2F2009%2F09%2Fwlasny-validator-w-asp-net-%25e2%2580%2593-checkboxlistvalidator%2F" style="border:0px"/></a></p>


<p>Powiązane wpisy:<ol><li><a href='http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/' rel='bookmark' title='Permanent Link: Własny validator w ASP.NET &#8211; Date Validator' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-date-validator/?referer=');">Własny validator w ASP.NET &#8211; Date Validator</a></li>
<li><a href='http://andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/' rel='bookmark' title='Permanent Link: Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#' onclick="pageTracker._trackPageview('/outgoing/andrzej.net.pl/index.php/2009/08/show-hide-javascript-proste-podlaczenie-przy-uzyciu-c/?referer=');">Show-hide JavaScript &#8211; proste podłączenie przy użyciu C#</a></li>
</ol></p>
<p>Powiązane wpisy wygenerowane przez <a href='http://yarpp.org' onclick="pageTracker._trackPageview('/outgoing/yarpp.org?referer=');">wtyczkę Yet Another Related Posts</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://andrzej.net.pl/index.php/2009/09/wlasny-validator-w-asp-net-%e2%80%93-checkboxlistvalidator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

