<?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>gruch4.pl - personal home page</title>
	<atom:link href="http://gruch4.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://gruch4.pl</link>
	<description>Kolejny tech-blog</description>
	<lastBuildDate>Sun, 07 Aug 2011 21:53:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>PowerShell w praktyce &#8211; rozpakowywanie wielu archiwów</title>
		<link>http://gruch4.pl/2011/08/07/powershell-w-praktyce-rozpakowywanie-wielu-archiwow/</link>
		<comments>http://gruch4.pl/2011/08/07/powershell-w-praktyce-rozpakowywanie-wielu-archiwow/#comments</comments>
		<pubDate>Sun, 07 Aug 2011 17:01:03 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=234</guid>
		<description><![CDATA[PowerShell jest potężnym narzędziem w systemie Windows. Służy do administracji systemem i aplikacjami z poziomu wiersza poleceń, a dzięki skryptom potrafi zautomatyzować wiele czynności. Chciałbym pokazać, jak za pomocą tego narzędzia zautomatyzować wypakowywanie archiwów RAR, znajdujących się w wielu katalogach. Z taką sytuacją można się spotkać, kiedy ściągamy z internetu np. cały sezon jakiegoś serialu [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://gruch4.pl/wp-content/uploads/2010/04/Windows_PowerShell_icon.png" alt="WPS" title="Windows_PowerShell_icon" width="128" height="128" class="alignleft size-full wp-image-38" />PowerShell jest potężnym narzędziem w systemie Windows. Służy do administracji systemem i aplikacjami z poziomu wiersza poleceń, a dzięki skryptom potrafi zautomatyzować wiele czynności. Chciałbym pokazać, jak za pomocą tego narzędzia zautomatyzować wypakowywanie archiwów RAR, znajdujących się w wielu katalogach.</p>
<p><span id="more-234"></span><br />
Z taką sytuacją można się spotkać, kiedy ściągamy z internetu np. cały sezon jakiegoś serialu w wydaniu tzw. scenowym <img src='http://gruch4.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Wtedy mamy do czynienia z każdym odcinkiem w osobnym katalogu, w którym znajdują się podzielone na części archiwa RAR, przeważnie ok. 14 MB. Często wypakowywanie takiego czegoś bywa monotonne i irytujące <img src='http://gruch4.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Z pomocą przychodzi nam wspomniany PowerShell. Poniżej prezentuję krótki skrypt, który wykona za nas tą pracę:</p>
<pre name="code" class="c-sharp">
$env:Path = "C:\Program Files\WinRAR\"
$loc = Get-Location
$folders = ls | Where-Object { $_.PSIsContainer };
foreach ($folder in $folders)
{
   $arr = $folder.FullName, "\*.rar"
   $txt = $arr -join ""
   $arrargs = "x", $txt, $loc
   $args = $arrargs -join " "
   $app =  Start-Process WinRAR $args -passthru
   do
   {
   }
   while (Get-Process -Id $app.Id -ea SilentlyContinue)
}
</pre>
<p>Pokrótce jak to działa. Na początku dodajemy ścieżkę, do aplikacji WinRar. W drugiej linii dodajemy zmienną, przechowującą, gdzie został uruchomiony skrypt.<br />
Linia
<pre>$folders = ls | Where-Object { $_.PSIsContainer };</pre>
<p> tworzy tablicę katalogów po której będzie poruszał się skrypt. Ta linia zwraca nam tylko katalogi.  Następnie zostaje tworzona pętla, która porusza się po wcześniej zadeklarowanej tablicy. W pętli zostają utworzone wszystkie potrzebne parametry wywołania dla WinRar&#8217;a. Linia
<pre> $app =  Start-Process WinRAR $args -passthru</pre>
<p> wypakowuje poszczególne pliki. Pętla do&#8230;while, została tutaj zastosowana, aby wszystkie archiwa wypakowywały się kolejno, w przeciwnym razie wszystkie archiwa wypakowywałyby się jednocześnie.</p>
<h3>Jak to wykorzystać?</h3>
<p>W PowerShell, każdy skrypt musi być podpisany. Dlatego aby uruchomić ten skrypt trzeba go albo podpisać, albo zezwolić na uruchamiania wszystkich skryptów. Na czas wykonywania takiego skryptu w konsoli PowerShell można wydać polecenie:
<pre>Set-ExecutionPolicy unrestricted -confirm</pre>
<p>, które po zaakceptowaniu pozwoli na uruchamianie takiego skryptu.<br />
Kiedy już umożliwimy uruchomienie takiego skryptu, kopiujemy go do katalogu, gdzie mamy to co chcemy wypakować. Następnie po naciśnięciu prawego przycisku myszy uruchamiamy skrypt poleceniem &#8222;Run with PowerShell&#8221;. Po tym następuje wypakowywanie plików, w miejsce, gdzie został wklejony skrypt.</p>
<p>Po tej operacji należy powrócić do pierwotnych ustawień:
<pre>Set-ExecutionPolicy AllSigned</pre>
<p>, aby zabezpieczyć się przed przypadkowym uruchomieniem szkodliwego skryptu.<br />
Aby ściągnąć skrypt kliknij <a href="http://gruch4.pl/download/download.php?id=6">TUTAJ!</a></p>
Wyświetleń : 458]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2011/08/07/powershell-w-praktyce-rozpakowywanie-wielu-archiwow/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Zabawa z paskiem zadań w Windows 7 i .NET &#8211; ToolbarButton</title>
		<link>http://gruch4.pl/2011/02/28/zabawa-z-paskiem-zadan-w-windows-7-i-net-toolbarbutton/</link>
		<comments>http://gruch4.pl/2011/02/28/zabawa-z-paskiem-zadan-w-windows-7-i-net-toolbarbutton/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 19:57:14 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=214</guid>
		<description><![CDATA[Ostatnio natknąłem się na ciekawą opcję podczas oglądania wideo w Media Player Clasic. Otóż po najechaniu na MPC na pasku zadań w okienku podglądu zobaczyłem przyciski odtwarzacza. Bardzo spodobała mi się taka opcja i chciałem zobaczyć czy zaimplementowanie takiego dodatku we własnym programie będzie trudne. Otóż okazało się, że&#8230; nie. Poniżej opis stworzenia prostej aplikacji [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://gruch4.pl/wp-content/uploads/2011/02/Windows-7-Logo.jpg" alt="" width="100" height="100" class="alignleft size-full wp-image-164" />Ostatnio natknąłem się na ciekawą opcję podczas oglądania wideo w Media Player Clasic. Otóż po najechaniu na MPC na pasku zadań w okienku podglądu zobaczyłem przyciski odtwarzacza. Bardzo spodobała mi się taka opcja i chciałem zobaczyć czy zaimplementowanie takiego dodatku we własnym programie będzie trudne. Otóż okazało się, że&#8230; nie. Poniżej opis stworzenia prostej aplikacji korzystającej z tego dodatku.<br />
<span id="more-214"></span></p>
<h3>Co nam będzie potrzebne?</h3>
<p>Aby rozpocząć zabawę z paskiem zadań musimy ściągnąć paczkę <a href="http://archive.msdn.microsoft.com/WindowsAPICodePack">Windows API Code Pack</a>.<br />
Po stworzeniu nowego projektu w Visual Studio musimy podpiąć następujące odwołania:</p>
<ul>
<li>Microsoft.WindowsAPICodePack</li>
<li>Microsoft.WindowsAPICodePack.Shell</li>
<li>PrezentationCore</li>
<li>WindowsBase</li>
</ul>
<p>Pierwsze dwa musimy dodać z paczki, którą przed chwilą ściągnęliśmy. Ostatnie dwa są w odwołaniach .NET.</p>
<p>Potrzebna nam będzie również ikonka, która będzie nam służyła jako przycisk w naszej aplikacji. Stworzoną przez nas ikonę wrzucamy do zasobów naszego rozwiązania.</p>
<h3>Jak to zakodować?</h3>
<p>Pierwszą rzeczą jaką musimy zrobić (dla ułatwienia kodowania) jest dodanie przestrzeni nazw</p>
<pre name="code" class="c-sharp">
using Microsoft.WindowsAPICodePack.Taskbar;
</pre>
<p>Następnie dodajemy pole prywatne do naszego formularza:</p>
<pre name="code" class="c-sharp">
private ThumbnailToolBarButton btn;
</pre>
<p>Następnie w konstruktorze formularza dodajemy kod:</p>
<pre name="code" class="c-sharp">
            btn = new ThumbnailToolBarButton(Properties.Resources.tbb, "Kliknij");
            btn.Click+=new EventHandler<ThumbnailButtonClickedEventArgs>(button1_Click);
            TaskbarManager.Instance.ThumbnailToolBars.AddButtons(this.Handle, btn);
</pre>
<p>Pierwsza linijka, jest to utworzenie obiektu naszego przycisku. Jako parametry podajemy wcześniej dodaną do zasobów ikonkę, drugi parametr jest to tooltip przycisku. W drugiej linijce, dodajemy zdarzenie, co ma się dziać po naciśnięciu przycisku. W tym przypadku jest to metoda przycisku, który jest już na formularzu. W linijce trzeciej, dodajmy nasz przycisk do kolekcji. Jako pierwszy argument jest tutaj uchwyt do formularza, drugi to przycisk.<br />
Teraz już wystarczy tylko uruchomić nasz program i powinniśmy ujrzeć taki efekt:<br />
<img src="http://gruch4.pl/wp-content/uploads/2011/02/tbb.png" alt="Wynik działania programu" title="ToolBarButton" width="317" height="202" class="aligncenter size-full wp-image-218" /><br />
Po naciśnięciu przycisku wywoła się metoda, która jest podpięta do Button1, w moim przypadku jest to po prostu wyświetlenie okienka dialogowego.</p>
<p>Cała klasa prezentuje się następująco:</p>
<pre name="code" class="c-sharp">

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsAPICodePack;
using Microsoft.WindowsAPICodePack.Shell;
using Microsoft.WindowsAPICodePack.Taskbar;
namespace tbb
{
    public partial class Form1 : Form
    {
        private ThumbnailToolBarButton btn;
        public Form1()
        {
            InitializeComponent();
            btn = new ThumbnailToolBarButton(Properties.Resources.tbb, "Kliknij");
            btn.Click+=new EventHandler<ThumbnailButtonClickedEventArgs>(button1_Click);
            TaskbarManager.Instance.ThumbnailToolBars.AddButtons(this.Handle, btn);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Komunikat");
        }
    }
}
</pre>
<p><a rev="vote-for" href="http://dotnetomaniak.pl/Zabawa-z-paskiem-zada%C5%84-w-Windows-7-i-NET-ToolbarButton-gruch4pl-personal-home-page"><img alt="Promuj" src="http://dotnetomaniak.pl/image.axd?url=http%3A%2F%2Fgruch4.pl%2F2011%2F02%2F28%2Fzabawa-z-paskiem-zadan-w-windows-7-i-net-toolbarbutton%2F" style="border:0px"/></a></p>
Wyświetleń : 1139]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2011/02/28/zabawa-z-paskiem-zadan-w-windows-7-i-net-toolbarbutton/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jak stworzyć unikalną nazwę pliku w .NET</title>
		<link>http://gruch4.pl/2010/12/29/jak-stworzyc-unikalna-nazwe-pliku-w-net/</link>
		<comments>http://gruch4.pl/2010/12/29/jak-stworzyc-unikalna-nazwe-pliku-w-net/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 12:12:51 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=190</guid>
		<description><![CDATA[Przy pisaniu którejś z kolei aplikacji na pewno natkniemy się na problem nadania unikalnej nazwy jakiemuś plikowi. Czasami jest to podyktowane tym, że nie obchodzi nas jaka będzie nazwa takiego pliku, bo ścieżka do niego będzie przechowywana np. w bazie danych, lub nie chcemy aby plik o identycznej nazwie znalazł się jeszcze raz w tym [...]]]></description>
			<content:encoded><![CDATA[<p>Przy pisaniu którejś z kolei aplikacji na pewno natkniemy się na problem nadania unikalnej nazwy jakiemuś plikowi. Czasami jest to podyktowane tym, że nie obchodzi nas jaka będzie nazwa takiego pliku, bo ścieżka do niego będzie przechowywana np. w bazie danych, lub nie chcemy aby plik o identycznej nazwie znalazł się jeszcze raz w tym samym katalogu, co oczywiście zaowocuje błędem. Poniżej przedstawiam jak wygenerować taką unikalną nazwę pliku/katalogu. Niektóre z poniższych przykładów nadawają się również idealnie do generowania haseł.<br />
<span id="more-190"></span><br />
Kiedy stajemy przed wyżej wymienionym problemem pierwszą myślą jaka przychodzi do głowy, jest to aby samemu napisać metodę, która generuje nam unikalny ciąg znaków. W tym wpisie przedstawię jak takie metody mogą wyglądać. Ja wpadłem na dwa sposoby wygenerowania takich ciągów znaków. Pierwszym z nich było skorzystanie z tablicy <a href="http://pl.wikipedia.org/wiki/ASCII">ASCII</a>. Po małym przeszukiwaniu google, znalazłem jak można to wykorzystać. Poniżej przedstawiam kod takiej metody:</p>
<pre name="code" class="c-sharp">
        public static string GenerujLosowaNazwe(int iloscZnakow, bool maleZnaki = false)
        {
            StringBuilder lancuch = new StringBuilder();
            Random rnd = new Random();
            char znak;

            for (int i = 0; i < iloscZnakow; i++)
            {
                znak = Convert.ToChar(Convert.ToInt32((Math.Floor(26 * rnd.NextDouble() + 65))));
                lancuch.Append(znak);
            }
            if (maleZnaki)
            {
                return lancuch.ToString().ToLower();
            }
            else
            {
                return lancuch.ToString();
            }
        }
</pre>
<p>Jak widzimy jest to prosta metoda, korzystająca z klasy <a href="http://msdn.microsoft.com/en-us/library/system.random.aspx">Random</a> do wygenerowania odpowiedniego kodu ASCII. Metoda generuje tylko litery od A do Z, dlatego możemy jeszcze przekazać, aby został zwrócony łańcuch z małych liter.<br />
Oczywiście metoda ta nie jest za doskonała, ponieważ dostaniemy tylko same litery od A do Z, i to tylko w postaci małych lub tylko wielkich liter. Rozwiązaniem jest druga metoda, którą przedstawiam poniżej:</p>
<pre name="code" class="c-sharp">
        private static readonly string _znaki = "ABCDEFGHIJKLMNPQRSTWXYZabcdefghijkmnopqrstwxyz0123456789";

        public static string GenereujLosowaNazwe2(int iloscZnakow)
        {
            Random rnd = new Random();
            StringBuilder lancuch = new StringBuilder();
            char[] tablica = _znaki.ToCharArray();
            for (int i = 0; i < iloscZnakow; i++)
            {
                int numer = rnd.Next(0, tablica.Length);
                lancuch.Append(tablica[numer]);
            }
            return lancuch.ToString();
        }
</pre>
<p>Widać, że ta metoda jest odrobinę prostsza od poprzedniej. Tutaj bazujemy na tablicy znaków z jakich możemy budować nasz łańcuch. Wystarczy w polu prywatnym
<pre>_znaki</pre>
<p> dodać lub usunąć określony znak.</p>
<p>Jak widać wyżej, napisanie metody, która generuje ciąg znaków, nie jest trudny, ale po co wywarzać już otwarte drzwi? Platforma .NET za nas dostarcza już gotowe metody, które za nas wygenerują nasz losowy ciąg znaków.</p>
<p>Pierwszym z takich losowych ciągów znaków jest GUID (ang. <em>Globally Unique Identifier</em>). Jeden taki klucz przechowuje 32 znaki. Całkowita liczba kluczy jakich może wygenerować GUID to 2<sup>128</sup> czyli 340 282 366 920 938 463 463 374 607 431 768 211 456 czyli całkiem dużo.<br />
Sposób wygenerowania GUID'u pod .NET jest bardzo prosty:</p>
<pre name="code" class="c-sharp">
string g = Guid.NewGuid().ToString();
</pre>
<p>Wygenerowany GIUD jest postaci:</p>
<pre>030B4A82-1B7C-11CF-9D53-00AA003C9CB6</pre>
<p>Czasami znaki myślnika nie są nam potrzebne, dlatego możemy je łatwo usunąć:</p>
<pre name="code" class="c-sharp">
 string g = Guid.NewGuid().ToString().Replace("-", "");
</pre>
<p>Jednak nie zawsze potrzebna jest nam tak długa nazwa pliku. Dlatego platforma dostarcza nam jeszcze jedną metodę, przeznaczoną specjalnie do generowania nazw plików. Metoda ta znajduje się w przestrzeni nazw <a href="http://msdn.microsoft.com/en-us/library/29kt2zfk.aspx">System.IO</a>. W klasie <a href="http://msdn.microsoft.com/en-us/library/system.io.path.aspx">Path</a> mamy do dyspozycji metodę <a href="http://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename.aspx">GetRandomFileName</a>. Generuje ona 8 znakową przypadkową nazwę pliku z 3 literowym przypadkowym rozszerzeniem. Przykład wykorzystania poniżej:</p>
<pre name="code" class="c-sharp">
string f = Path.GetRandomFileName();
</pre>
<p>Wynikiem może być:</p>
<pre>2cual2s2.zpm</pre>
<p>W klasie <em>Path</em> jest jeszcze jedna metoda, bardzo przydatna do tworzenia plików tymczasowych:</p>
<pre name="code" class="c-sharp">
string t = Path.GetTempFileName();
</pre>
<p>Wynikiem metody jest:</p>
<pre>C:\Users\NazwaUżytkownika\AppData\Local\Temp\tmpC7F0.tmp</pre>
<p>Metoda ta służy do tworzenia nazwy pliku tymczasowego w katalogu tymczasowym aplikacji systemu. Metoda ta tworzy samą nazwę, <strong>nie tworzy pliku na dysku</strong>.</p>
Wyświetleń : 1716]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2010/12/29/jak-stworzyc-unikalna-nazwe-pliku-w-net/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>LINQ to XML &#8211; wstęp cz. 2 z 2</title>
		<link>http://gruch4.pl/2010/10/15/linq-to-xml-wstep-cz-2-z-2/</link>
		<comments>http://gruch4.pl/2010/10/15/linq-to-xml-wstep-cz-2-z-2/#comments</comments>
		<pubDate>Fri, 15 Oct 2010 22:30:17 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=184</guid>
		<description><![CDATA[Niecały tydzień temu napisałem posta o LINQ to XML. Wtedy jednak zająłem się tylko tym czym jest XML, co to jest LINQ oraz jak wygląda przetwarzanie dokumentów XML przy pomocy przestrzeni nazw System.Xml. Dzisiaj jako kontynuacja wpisu pokażę już konkretne zapytania XLINQ oraz jak ogólnie wygląda przestrzeń nazw System.Xml.Linq. 4. LINQ to XML (XLINQ) LINQ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://gruch4.pl/wp-content/uploads/2010/10/logoLinq2.png" alt="" title="logoLinq2" width="421" height="135" class="alignleft size-full wp-image-164" /><br />
Niecały tydzień temu napisałem posta o LINQ to XML. Wtedy jednak zająłem się tylko tym czym jest XML, co to jest LINQ oraz jak wygląda przetwarzanie dokumentów XML przy pomocy przestrzeni nazw System.Xml. Dzisiaj jako kontynuacja wpisu pokażę już konkretne zapytania XLINQ oraz jak ogólnie wygląda przestrzeń nazw System.Xml.Linq.<br />
<span id="more-184"></span></p>
<h1>4. LINQ to XML (XLINQ)</h1>
<p>LINQ to XML jest nowym podejściem pracy z dokumentami XML. Dzięki LINQ to XML można łatwo załadować dokument XML do pamięci i równie łatwo można poprzez zapytania odczytywać dokument oraz go modyfikować. Po przetworzeniu można łatwo dokument zapisać z pamięci na dysk.<br />
Ogromną zaletą LINQ to XML jest to, że można przetwarzać dokumenty XML-owe o wiele łatwiej niż to miało miejsce poprzednio czyli na przykład przy pomocy .NET-owej przestrzeni nazw System.Xml. Dzięki LINQ obsługa tych dokumentów stała się o wiele prostsza, przetwarzanie pojedynczych węzłów stało się o wiele bardziej łatwiejsze, a kod stał się o wiele bardziej czytelniejszy i krótszy.<br />
LINQ to XML jest dostępne w przestrzeni nazw System.Xml.Linq, która to przestrzeń dostarcza wszystkie potrzebne klasy do pracy z dokumentem XML. Poniżej przedstawiam diagram klas tej przestrzeni nazw:<br />
<a href="http://gruch4.pl/wp-content/uploads/2010/10/diagramKlas.png"><img src="http://gruch4.pl/wp-content/uploads/2010/10/diagramKlas-300x161.png" alt="" title="diagramKlas" width="300" height="161" class="aligncenter size-medium wp-image-170" /></a><br />
Jak widać powyżej przestrzeń nazw XLINQ jest dość złożona.  Jednak aby sprawnie posługiwać  się dokumentami XML za pomocą LINQ to XML trzeba poznać trzy najważniejsze klasy: <code>XElement</code>, <code>XAttribute</code> oraz <code>XDocument</code>. Klasa <code>XElement</code> reprezentuje element XML. Jak widać z diagramu powyżej pochodzi ona z abstrakcyjnej klasy <code>XContainer</code>, która to pochodzi z klasy <code>XNode</code>. Hierarchia tych klas jest taka, ponieważ każdy element w XML jest węzłem. Klasa <code>XElement</code> jest jedną z najważniejszych klas, ponieważ z jej pomocą można tworzyć i manipulować elementami XML tzn. można tworzyć elementy, dodawać i modyfikować atrybuty elementów oraz manipulować zawartością elementów tj. dodawać, usuwać oraz modyfikować elementy potomne.<br />
Klasa <code>XAttribute</code> służy do manipulowania atrybutami elementów dokumentu XML. Jak wiadomo atrybut w XML jest to para nazwa/wartość przypisana konkretnemu elementowi. Praca z atrybutami w LINQ to XML jest bardzo podobna do pracy z elementami XML. Jednak należy pamiętać, że atrybut nie jest węzłem XML co doskonale widać z diagramu wyżej. Ponadto każdy atrybut musi posiadać nazwę, która jest unikatowa dla danego elementu.<br />
Klasa <code>XDocument</code> umożliwia prace z poprawnymi dokumentami XML włączając w to deklaracje i komentarze. Klasa ta dziedziczy z klasy <code>XContainer</code>, czyli może posiadać elementy i węzły lecz może posiadać tylko jeden główny obiekt <code>XElement</code>, który jest węzłem głównym (ang. <em>Root Element</em>).</p>
<h1>5. Programowanie w LINQ to XML (XLINQ)</h1>
<h4>5.1. Tworzenie drzew</h4>
<p>Jedną z podstawowych rzeczy przy obsłudze dokumentów XML jest ich tworzenie. W XLINQ tworzenie drzew XML jest bardzo proste. Poniżej przedstawiam prosty pseudo-kod do tworzenia drzew XML:</p>
<pre name="code" class="c-sharp">
XElement employee = new XElement(XName,
    new XElement(XName,
        new XElement(XName name),
        new XElement(XName name),
        new XElement(XName name),
        new XElement(XName name)
    );
</pre>
<p>Jak widać z powyższego kodu, za pomocą klasy <code>XElement</code> tworzymy nowe elementy drzewa XML. Deklaracja nagłówka klasy prezentuje się następująco:</p>
<pre name="code" class="c-sharp">
XElement(XName name, params object[] content)
</pre>
<p>Z powyższej definicji widać, że konstruktor klasy przyjmuje dwa parametry: pierwszy, jest to nazwa elementu tworzonego, a drugim parametrem jest tablica obiektów, które mają się znaleźć w klasie. Obiektem tym może być zarówno atrybut jak i nowy element potomny.</p>
<h4>5.2. Wczytywanie drzew XML</h4>
<p>Wczytywanie drzewa XML możemy zrealizować z różnych źródeł. Podstawowa składnia wczytywania drzewa wygląda następująco:</p>
<pre name="code" class="c-sharp">
XElement employees = XElement.Load(object);
</pre>
<p>Metoda ta jako parametr przyjmuje obiekty typu <code>Stream</code>, <code>String</code> (ścieżka do pliku),  <code>XmlReader</code>,  <code>TextReader</code>.</p>
<h4>5.3. Serializacja dokumentów XML</h4>
<p>Proces serializacji polega na zapisaniu obiektu na dysk twardy lub do pamięci. Kiedy proces przetwarzania dokumentu XML zostanie zakończony, wyniki pracy można zapisać do pliku. Proces ten uzyskuje się dzięki metodzie <code>Save()</code> klasy <code>XDocument</code> lub <code>XElement</code>. Do metody tej możemy przekazać albo ścieżkę do fizycznego miejsca na dysku, gdzie ma być zapisany dokument, obiekt <code>XmlWriter</code> lub <code>TextWriter</code>. Poniżej krótki przykład:</p>
<pre name="code" class="c-sharp">

XElement employees = XElement.Parse(@"
            <Employees>
                <Employee id=’1’ debt=’Dev’>
                    <Name>Scott</Name>
                    <Title>Mr. SciFi</Title>
                    <Department>Gaming</Department>
                    <HireDate>04/17/92</HireDate>
                    <Gender>M</Gender>
                    <MaritalStatus>M</MaritalStatus>
                </Employee>
            </Employees>");
using (StringWriter sw = new StringWriter())
{
    employees.Save(sw, true);
}
</pre>
<h4>5.4. Wykonywanie zapytań LINQ w dokumentach XML</h4>
<p>Kiedy dokument XML zostanie już wczytany można wykonywać zapytania XLINQ.  Najlepszym sposobem do wyciągnięcia wszystkich elementów jest odwołanie się do głównego elementu dokumentu Root. Następnie należy się odwołać do interesującego nas elementu i wybrać elementy które nas interesują. Poniżej przedstawiam przykład:</p>
<pre name="code" class="c-sharp">
            var doc =  XDocument.Load("planety.xml");

            var q = from p in doc.Root.Elements("Planet")
                    select p.Element("Name").Value;

            foreach (var s in q)
            {
                rtbXml.Text += s.ToString()+"\n"; //RichTextBox

            }
</pre>
<p>Taka składnia wyrażenia jest dobra, kiedy nie musimy zbyt głęboko wchodzić w strukturę dokumentu. Natomiast kiedy musimy przejść przez wiele poziomów dokumentu z pomocą przychodzi metoda <code>Descendats()</code>.  Poniżej krótki kod, przedstawiający użycia tej metody. Kod ten wyświetla wszystkie elementy które są zagnieżdżone drugim lub większym poziomie dokumentu względem elementu głównego:</p>
<pre name="code" class="c-sharp">

            var doc = XDocument.Load("planety.xml");

            var q = from p in doc.Descendants("Moon")
                    select p.Element("Name");

            foreach (var s in q)
            {
                rtbXml.Text += s.ToString() + "\n";
            }
</pre>
<p>Dla porównania ten sam efekt możemy uzyskać za pomocą takiego wyrażenia:</p>
<pre name="code" class="c-sharp">

            var doc = XDocument.Load("planety.xml");

            var q = from p in doc.Root.Elements("Planet").Elements("Moons").Elements("Moon")
                       select p.Element("Name");

            foreach (var s in q)
            {
                rtbXml.Text += s.ToString() + "\n";
            }
</pre>
<p>Oczywiście z kodu XML można wyciągać również konkretne, interesujące się dane. Poniżej krótki przykład wyszukiwania elementu:</p>
<pre name="code" class="c-sharp">

            var doc = XDocument.Load("planety.xml");

            var q = from XText t in doc.DescendantNodes().OfType<XText>()
                    where t.Value == "Moon"
                    select t;

            rtbXml.Text = q.First().ToString();
</pre>
<p>Kiedy elementy w dokumencie zawierają charakterystyczną, unikalną cechę w dokumencie, odnalezienie takiego węzła nie stanowi problemu:</p>
<pre name="code" class="c-sharp">

            var doc = XDocument.Load("planety.xml");

            var q = from p in doc.Root.Elements("Planet")
                    where p.Attribute("id").Value == "3"
                    select p;

            rtbXml.Text = q.First().ToString();
</pre>
<h4>5.5. Edytowanie dokumentu XML</h4>
<p>Jedną z podstawowych operacji na dokumencie jest usuwanie węzłów. Wykonanie tego zadania realizuje się za pomocą metody <code>Remove()</code>. Metoda ta nie przyjmuje żadnych parametrów. Jest to metoda wywołana z wyniku zapytania. Po zakończeniu edycji należy zapisać plik:</p>
<pre name="code" class="c-sharp">

            var doc = XDocument.Load("planety2.xml");

            var q = from p in doc.Root.Elements("Planet")
                    where p.Attribute("id").Value == "2"
                    select p;

            q.Remove();

            doc.Save("planety2.xml");

            rtbXml.Text = "Element został usunięty";
</pre>
<p>Edycja węzłów jest bardzo podobna. Wybieramy interesujący nas węzeł do edycji i za pomocą metody <code>SetValue()</code> . Metoda ta, podobnie jak przy usuwaniu, jest wywołana ze zmiennej przechowującej wynik zapytania:</p>
<pre name="code" class="c-sharp">

            var doc = XDocument.Load("planety2.xml");

            var q = (from p in doc.Descendants("Planet")
                     where p.Element("Name").Value == "Mercury"
                     select p).Single();

            q.Element("Name").SetValue("Mercury po zmianie");

            doc.Save("planety2.xml");

            rtbXml.Text = "Element został zmieniony";
</pre>
<p>W powyższym kodzie przy zapytaniu została użyta metoda <code>Single()</code>, która gwarantuje zwrócenie tylko jednego rezultatu. Zabezpiecza to nas przed przypadkowym zmienieniem większej ilości danych w dokumencie.<br />
Ostatnią czynnością przy edycji dokumentów jest dodawanie nowych elementów.  Operację tę realizujemy za pomocą metody <code>Add()</code> obiektu <code>XDocument</code>. Nowy element możemy dodać w dowolnym stopniu zagnieżdżenia. W poniższym przykładzie, nowy element jest dodawany jest w węźle głównym dokumentu Root:</p>
<pre name="code" class="c-sharp">

            var doc = XDocument.Load("planety2.xml");

doc.Root.Add(new XElement("Planet", new XAttribute("id", "5"), new XElement("Name", "Jupiter")));

            doc.Save("planety2.xml");

            rtbXml.Text = "Element został dodany";
</pre>
<p>Nowy element dodawany jest przez <code>new XElement</code>, nowy atrybut przez<code> new XAttribute</code>. <code>XElement</code> jako parametry przyjmuje nazwę elementu i jego wartość, lub nowe zagnieżdżone elementy. <code>XAttribute</code> przyjmuje nazwę atrybutu i jego wartość.</p>
<h4>5.6. Walidacja dokumentu XML </h4>
<p>Ostatnią czynnością dla upewnienia się, czy w dokumencie zostały wprowadzone dobre zmiany jest walidacja dokumentu. Walidacja polega na sprawdzenie dokumentu czy jest zgodny ze schematem. Dzięki wbudowanemu mechanizmowi w VS za pomocą paru linijek kodu, można sprawdzić poprawność dokumentu XML. Do walidacji dokumentu wymagane jest użycia klasy <code>XmlSchemaSet</code> z przestrzeni nazw <code>System.Xml.Schema</code> oraz użycia metody <code>Validate() </code>obiektu <code>XDocument</code>.</p>
<p>Do wpisu dołączam przykładowy projekt wykonany w Visual Studio 2010 prezentujący wymienione powyżej przykłady. Aby pobrać plik z solucją kliknij <a href="http://gruch4.pl/download/download.php?id=4" title="LINQ to XML">TUTAJ!</a></p>
Wyświetleń : 2391]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2010/10/15/linq-to-xml-wstep-cz-2-z-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>LINQ to XML &#8211; wstęp cz.1 z 2</title>
		<link>http://gruch4.pl/2010/10/10/linq-to-xml-wstep-cz-1-z-2/</link>
		<comments>http://gruch4.pl/2010/10/10/linq-to-xml-wstep-cz-1-z-2/#comments</comments>
		<pubDate>Sun, 10 Oct 2010 17:20:51 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=116</guid>
		<description><![CDATA[Kiedy piszemy aplikacje, prędzej czy później nadejdzie czas kiedy będziemy musieli korzystać z przetwarzania dokumentów XML. Nie ważne czy będziemy je tworzyć czy przetwarzać już istniejące. Dokument XML jest niczym innym jak zwykłym plikiem tekstowym lub strumieniem w pamięci. A więc bez problemu możemy napisać klasę lub klasy parsujące tekst XML i go odpowiednio przerabiać. [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-123" title="logo" src="http://gruch4.pl/wp-content/uploads/2010/10/logo2.png" alt="" width="457" height="142" /><br />
Kiedy piszemy aplikacje, prędzej czy później nadejdzie czas kiedy będziemy musieli korzystać z przetwarzania dokumentów XML. Nie ważne czy będziemy je tworzyć czy przetwarzać już istniejące. Dokument XML jest niczym innym jak zwykłym plikiem tekstowym lub strumieniem w pamięci. A więc bez problemu możemy napisać klasę lub klasy parsujące tekst XML i go odpowiednio przerabiać. Jednak samodzielne pisanie takiej klasy mija się z celem, zwłaszcza kiedy mamy do przetworzenia na przykład jeden plik. Oczywiście na platformie .NET istnieją sposoby przetwarzania takich dokumentów. Jednym z nich jest korzystanie z przestrzeni nazw System.XML. Jednak przetwarzanie całych lub skomplikowanych dokumentów nie jest takie proste jak byśmy tego chcieli. Dlatego z pomocą przychodzi nam LINQ, stosunkowo młody produkt firmy Microsoft na platformę .NET. W przetwarzaniu XML za pomocą LINQ najbardziej będziemy się interesowali przestrzenią nazw System.Xml.Linq. Jednak zacznijmy od początku&#8230;<br />
<span id="more-116"></span></p>
<h1>1. Standard XML</h1>
<p>XML (Extensible Markup Language) jest standardem przetwarzania danych zalecanym przez konsorcjum W3C. XML jest spokrewniony z SGML (Standard Generalization Markup Language), ale w stosunku do niego jest o wiele bardziej uproszczony i pozbawionych wielu trudnych, rzadko używanych elementów.<br />
XML tak samo jak język HTML jest językiem znaczników. Jednak w przeciwieństwie do HTML, XML pozwala na tworzenie własnych znaczników i ich atrybutów, gdzie w HTML ich struktura i nazwy są ściśle określone w standardzie HTML (np. &lt;body&gt;, &lt;head&gt;). W XML natomiast możemy tworzyć własne znacznik. Każdy taki element może być definiowany przez jego własny DTP (Document Type Definition) oraz arkusze stylów, które mogą być stosowane do jednego lub wielu dokumentów XML.<br />
Mimo, że w XML można tworzyć własne znaczniki ich odpowiednie oznakowanie i  położenie musi być ściśle zgodne ze standardami konsorcjum W3C. Podstawowym elementem w dokumencie XML-owym jest znacznik, który może posiadać dowolne atrybuty. Bardzo ważnym aspektem jest, że każdy znacznik musi być zamknięty. Jest to jeden z warunków koniecznych, aby dokument był zgodny ze standardami. Poniżej przedstawiam trzy przykłady znaczników w dokumencie:</p>
<ul>
<li>znacznik otwierający i zamykający z zawartością
<pre name="code" class="xml"><Author>Henryk Sienkiewicz</Author></pre>
</li>
<li>znacznik otwierający i zamykający z atrybutem i zawartością
<pre name="code" class="xml"><Price currency=”USD”>2,75</Price></pre>
</li>
<li>znacznik otwierający i zamykający z atrybutem bez zawartości
<pre name="code" class="xml"><Element id=”1”></Element></pre>
<p>lub:</p>
<pre name="code" class="xml"><Element id=”1” /></pre>
</li>
</ul>
<p>Jak wspomniałem wcześniej, dokument XML musi być ściśle zgodny ze standardami. Poniżej przedstawiam listę zagadnień, których znajomość jest nieodzowna przy tworzeniu własnego dokumentu:</p>
<ul>
<li>XML jest wrażliwy na wielkość znaków, dlatego znaczniki otwierające muszą być zapisane dokładnie w taki sam sposób jak zamykające,</li>
<li>wartości atrybutów muszą być zapisane w cudzysłowach,</li>
<li>niepusty element musi mieć znacznik otwierający i zamykający</li>
<li>znaczniki muszą być zagnieżdżane w odpowiedniej kolejności. Zamykanie znaczników musi odbywać się w kierunku od ostatniego do pierwszego w stosunku do znaczników otwierających.</li>
</ul>
<p>Do poprawnego zbudowania dokumentu jednak potrzebna jest odpowiednia budowa samego pliku lub plików. Do budowy poprawnego dokumentu XML zazwyczaj potrzebne są dwa pliki, lecz nie jest to wymagane. Pierwszym z nich jest to dokument XML, zawierający konkretne dane. Drugim plikiem jest  plik DTD (<em>Document Type Definition</em>), który zawiera reguły, jak elementy XML, atrybuty i inne dane, które są definiowane i logicznie połączone w dokumencie.<br />
Poniżej przedstawiam przykładowy, poprawny dokument XML (bez DTD):</p>
<pre name="code" class="xml">
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Contacts>
    <Person>
        <FirstName>John</FirstName>
        <LastName>Doe</LastName>
        <Gender value="male" />
        <Phone type="landline">624253468</Phone>
        <Phone type="mobile">2546885</Phone>
        <Phone type="fax">254842546</Phone>
    </Person>
    <Person>
        <FirstName>Jane</FirstName>
        <LastName>Doe</LastName>
        <Gender value="female" />
        <Phone type="landline"></Phone>
        <Phone type="mobile">54575485</Phone>
        <Phone type="fax"></Phone>
    </Person>
</Contacts>
</pre>
<p>Jak widać z przykładu powyżej dokument XML to hierarchiczny zbiór znaczników, gdzie na najwyższym poziomie może wystąpić tylko jeden znacznik, który jest elementem głównym dokumentu (ang. root).<br />
Jak wspomniałem wcześniej dokument XML musi być ściśle związany ze standardami. Aby sprawdzić czy dany dokument XML jest prawidłowy pod względem składniowym i logicznym wykorzystuje się wspomniane wcześniej pliki DTD. Mechanizm ten jest odziedziczony po SGML-u i jest stosunkowo stary. Obecnie powszechnie wykorzystuje się również schematy XML (ang. <em>XML Schema</em>), który jest mechanizmem nowszym od DTD. Istnieje również trzeci mechanizm, który jest specyficzny dla firmy Microsoft o nazwie XDR (ang. <em>XML Data Reduced</em>), jednak wszędzie gdzie jest to możliwe powinno stosować się XSD (ang. <em>XML Schema Definition</em>) zalecany przez W3C. Wszystkie trzy mechanizmy pozwalają definiować ograniczenia co do zawartości dokumentu XML po przez określenie znaczników, które mogą wystąpić w dokumencie, znaczników opcjonalnych itd.<br />
Dokument XML można również przedstawić jako drzewo DOM (ang. <em>Document Object Model</em> – Obiektowy model dokumentu), który reprezentuje wszystkie węzły i atrybuty w postaci drzewa. Poniżej przykład takiego drzewa:<br />
<a href="http://gruch4.pl/wp-content/uploads/2010/10/drzewo.png"><img class="aligncenter size-full wp-image-144" title="drzewo" src="http://gruch4.pl/wp-content/uploads/2010/10/drzewo.png" alt="" width="304" height="315" /></a></p>
<p>Na koniec wprowadzenia do XML wymienię kilka obecnie szeroko stosowanych zastosowań standardu XML:</p>
<ul>
<li>zapis dokumentów przy pomocy zbioru znaczników zamiast stosowania skomercjalizowanych technologii (Word, PDF),</li>
<li>wymiana danych, zarówno do wymiany danych między aplikacjami jak i całymi systemami,</li>
<li>przechowywanie danych,</li>
<li>realizacja operacji bazodanowych (np. w Microsoft Access czy SQL Server, wynikiem zapytania SQL może być dokument XML).</li>
</ul>
<h1>2. Klasyczne przetwarzanie XML (przestrzeń nazw System.Xml)</h1>
<p>Większość funkcji związanych z przetwarzaniem dokumentów XML znajduje się w przestrzeni nazw System.Xml, która to realizuje przetwarzanie dokumentów XML w obowiązujących standardach (wersja 1.0) m.in.: przestrzenie nazw XML, schematy XML do sprawdzania poprawności dokumentów XML, DOM poziom 2 i inne.<br />
Podstawową klasą do odczytu dokumentów XML jest XmlTextReader, która to zapewnia szybki, nie buforowany dostęp do strumienia danych XML, w którym poruszać się można tylko do przodu. Oznacza to, że cały dokument nie musi być ładowany do pamięci, a jedynie jest odczytywany jeden węzeł. Przy odczytywaniu kolejnych węzłów właściwości obiektu XmlTextReader odpowiadają aktualnie przetwarzanemu węzłowi.<br />
Poniżej przedstawiam przykład użycia obiektu klasy XmlTextReader:</p>
<pre name="code" class="c-sharp">

XmlTextReader rdr = new XmlTextReader("C:\Employees.Xml");
while (rdr.Read())
{
    XmlNodeType nt = rdr.NodeType;
    switch (nt)
    {
        case XmlNodeType.Element:
        break;
        case XmlNodeType.Attribute:
        break;
        case XmlNodeType.Comment:
        break;
        case XmlNodeType.Whitespace:
        break;
    }
}
</pre>
<p>Przestrzeń System.Xml pozwala nam również na zapis dokumentów XML. Służy do tego klasa XmlTextWriter, która zapewnia szybki, nie buforowany zapis danych XML w strumieniu lub pliku, w którym poruszać się można tylko do przodu. Korzystanie z tej klasy polega na wywołaniu metod, które wyprowadzają dane XML. W ten sposób decydujemy dokładnie w którym momencie co ma być wyprowadzone do strumienia lub pliku.<br />
Poniżej przedstawiam przykład użycia klasy XmlTextWriter:</p>
<pre name="code" class="c-sharp">
XmlTextWriter wrt = new XmlTextWriter(@"C:\Employees.Xml", Encoding.UTF8);
wrt.WriteStartDocument();
wrt.WriteComment("This is an example");
wrt.WriteStartElement("Employees");
wrt.WriteStartElement("Employee");
wrt.WriteStartElement("FirstName");
wrt.WriteString("Scott");
wrt.WriteEndElement();
wrt.WriteEndElement();
wrt.WriteEndElement();
</pre>
<p>Jak widzimy w powyższym przykładzie, zapis danych do pliku XML, zwłaszcza przy większej ilości danych może sprawiać problemy, zwłaszcza kiedy mamy do czynienia z wielopoziomowymi dokumentami, gdzie poziom zagłębienia jest duży.<br />
Oczywiście przestrzeń nazw System.Xml zawiera o wiele więcej klas i metod do obsługi dokumentów XML, sprawdzania poprawności dokumentów oraz wiele więcej.</p>
<h1>3. Projekt LINQ</h1>
<p><strong>LINQ</strong> (<strong>L</strong>anguage <strong>In</strong>tegrated <strong>Q</strong>uery) jest to część platformy .NET i jest to zestaw standardowych operatorów zapytań które dostarczają bazową architekturę zapytań do nawigowania, filtrowania i wykonywania zapytań praktycznie z każdym źródłem danych. Takim źródłem danych może być relacyjna baza danych (LINQ to SQL), obiekt DataSet (LINQ to DataSet), dokument XML (LINQ to XML) lub kolekcja danych przechowywana w pamięci.<br />
Jak wspomniałem wcześniej LINQ to zestaw operatorów zapytania, które wprowadzają udogodnienia wprost do języka programowania (Visual Basic, C#), dlatego dzięki LINQ nie trzeba już zapisywać zapytań SQL jako ciąg znaków nic nie znaczących dla kompilatora. Dzięki temu mamy kontrolę nad poprawnością zapisu zapytania już na etapie kodowania aplikacji.<br />
Bardzo ważnym aspektem wyników zwracanych przez zapytanie LINQ jest to, że odpytywane źródło danych musi implementować generyczną wersję interfejsu IEnumerable<T>, który znajduje się w przestrzeni nazw System.Collections.Generic.<br />
Poniżej przedstawiam przykład zapytania LINQ. Pierwsze jest to tzw. Query Syntax. Jest to forma bardziej czytelna, która ma wiele wspólnego z zapytaniami SQL:</p>
<pre name="code" class="c-sharp">
var query =
                    from c in contact
                    where c.FirstName.StartsWith("S")
                    &#038;&#038; c.LastName.StartsWith("K")
                    orderby c.LastName
                    select new { c.FirstName, c.LastName, c.EmailAddress };
</pre>
<p>Drugą formą tego zapytania jest tzw. Method Syntax. Każde zapytanie zapisane w formie Query Syntax, przy uruchamianiu w środowisku .NET jest zawsze tłumaczone na Method Syntax. Do zapisu zapytań w tej postaci korzysta się z wyrażeń Lambda:</p>
<pre name="code" class="c-sharp">
IEnumerable<Contact> query = contact.Where(a => a.FirstName.StartsWith("S") &#038;&#038;
a.LastName.StartsWith("K")).OrderBy(a => a.LastName);
</pre>
Wyświetleń : 2085]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2010/10/10/linq-to-xml-wstep-cz-1-z-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ComponentOne Studio for ASP.NET Ajax</title>
		<link>http://gruch4.pl/2010/07/01/componentone-studio-for-asp-net-ajax/</link>
		<comments>http://gruch4.pl/2010/07/01/componentone-studio-for-asp-net-ajax/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 11:06:29 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=98</guid>
		<description><![CDATA[Podczas konferencji IT Academic Day odbywającej się pod koniec kwietnia na Uniwersytecie Przyrodniczym w Poznaniu miałem okazję &#8222;wygrać&#8221;, a właściwie odziedziczyć po znajomym zestaw kontrolek do Visual Studio. Jest to produkt firmy ComponentOne dodające nowe komponenty do obsługi technologii Ajax spod VS i ASP.NET. Jest to zestaw kilkudziesięciu kontrolek zarówno pod wersję .NET Framework 2.0 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://gruch4.pl/wp-content/uploads/2010/06/Studio_for_ASP_dot_NET_Ajax.png" alt="" title="Studio_for_ASP_dot_NET_Ajax" width="361" height="106" class="alignleft size-full wp-image-99" /><br />
Podczas konferencji <a href="http://www.up.poznan.pl/itad/">IT Academic Day</a> odbywającej się pod koniec kwietnia na Uniwersytecie Przyrodniczym w Poznaniu miałem okazję &#8222;wygrać&#8221;, a właściwie odziedziczyć po znajomym zestaw kontrolek do Visual Studio. Jest to produkt firmy <a href="http://www.componentone.com/">ComponentOne</a> dodające nowe komponenty do obsługi technologii Ajax spod VS i ASP.NET. Jest to zestaw kilkudziesięciu kontrolek zarówno pod wersję .NET Framework 2.0 jak i 3.5.<br />
<span id="more-98"></span><br />
W tym wpisie chciał bym przedstawić parę kontrolek właśnie z tej paczki, które wg mnie wydają się być interesujące. Niestety uprzedzam, że pakiet ten nie jest tani i kosztuje  około 800 dolarów.</p>
<p>Na początku chciałbym przedstawić <strong>Combobox&#8217;a</strong>. Ciekawa kontrolka imitująca comboboxa. Piszę imitująca, ponieważ &#8222;programowo&#8221; nie ma nic wspólnego z systemową listą rozwijaną, ale zachowuje się oczywiście tak samo. Kontrolka ta oprócz oczywistych funkcji posiada również wyświetlanie ikonki obok każdej pozycji, animowanie otwierania listy, lista wielokolumnowa i wiele innych.<br />
Osobiście jakoś wolę używać standardowych kontrolek tego typu, ale na pewno zdarzą się sytuacje kiedy taka &#8222;bajerancka&#8221; kontrolka się przyda. <a href="http://gruch4.pl/StudioForASP.NET_przyklady/ComboBox.aspx">Pod tym adresem</a> można się przekonać jak ten komponent sprawuje się w życiu.</p>
<p>Kolejny element to Editor służący do ułatwienia wprowadzania przez użytkownika tekstu. Jest to kontrolka przypominająca wstążkę z MS Office 2007. Jest to dość rozbudowany edytor z wieloma opcjami. <a href="http://gruch4.pl/StudioForASP.NET_przyklady/Editor.aspx">Pod tym adresem</a> można zobaczyć jak działa ten komponent. </p>
<p>Kolejnym, jak dla mnie chyba najbardziej użytecznym jest Menu. Dzięki temu narzędziu możemy stworzyć bardzo dobre zaawansowane menu na naszą stronę. Może ono występować w pozycji pionowej i poziomej, posiadać podmenu, ikonki przy poszczególnych pozycjach i wiele więcej opcji. Niestety niektóre motywy mają błędy i nie wyświetlają się poprawnie. <a href="http://gruch4.pl/StudioForASP.NET_przyklady/Menu.aspx">Pod tym adresem</a> można zobaczyć menu w akcji.</p>
<p>Kolejnym bardzo przydatnym narzędziem na naszą stronę może być ToolTip. ToolTip jest to podpowiedź wyskakująca obok danego obiektu po najechaniu na niego lub kliknięciu. Podpowiedź taka znika zaraz po opuszczeniu kursorem obszaru obiektu. Narzędzie takie jest bardzo przydatne na stronach web na przykład przy wypełnianiu przez użytkownika formularza, kiedy to po najechaniu na odpowiednie pole wyświetla się podpowiedź co ma do tego pola wpisać, albo jak wygląda maska dla takiego pola. <a href="http://gruch4.pl/StudioForASP.NET_przyklady/Tooltip.aspx">Pod tym adresem</a> jest prosty przykład prezentujący tą kontrolkę.</p>
<p>Jak pisałem kontrolek tych jest kilkanaście, dlatego nie będę opisywał tutaj wszystkich. Pełny spis można znaleźć <a href="http://www.componentone.com/SuperProducts/StudioASPNET/">pod tym adresem</a><br />
Jest to bardzo ciekawy produkt, niestety zbyt drogi i wydaję mi się, że jak za taką cenę oferujący trochę zbyt mało. Mi pozostaje się tylko cieszyć roczną licencją tego produktu a innych zachęcam do przetestowania wersji trial.</p>
Wyświetleń : 1070]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2010/07/01/componentone-studio-for-asp-net-ajax/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Przenosiny na nowy serwer</title>
		<link>http://gruch4.pl/2010/06/02/przenosiny-na-nowy-serwer/</link>
		<comments>http://gruch4.pl/2010/06/02/przenosiny-na-nowy-serwer/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 16:08:09 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=94</guid>
		<description><![CDATA[Wczoraj zakończyłem przenoszenie bloga na nowy hosting. Jako, że ostatnio trochę piszę w ASP.NET chciałem hosting z tą właśnie technologią. Po wielu pozytywnych opiniach na łamach internetu i stosunkowo niską, a nawet bardzo ceną za tego typu hosting skusiłem się na Webio.pl Wziąłem dwutygodniowy okres próbny, którego niestety nie miałem czasu próbować, więc poszedłem w [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="Webio" src="http://webio.pl/Content/logo_male.png" title="Webio.pl" class="alignleft" width="167" height="71" />Wczoraj zakończyłem przenoszenie bloga na nowy hosting. Jako, że ostatnio trochę piszę w ASP.NET chciałem hosting z tą właśnie technologią. Po wielu pozytywnych opiniach na łamach internetu i stosunkowo niską, a nawet bardzo ceną za tego typu hosting skusiłem się na <a href="http://webio.pl">Webio.pl</a> Wziąłem dwutygodniowy okres próbny, którego niestety nie miałem czasu próbować, więc poszedłem w ciemno. Na razie nie żałuje, ale pełne testy przeprowadzę w najbliższym czasie. Na razie mogę powiedzieć, że pomoc techniczna jest błyskawiczna. Po przeprowadzeniu małego testu zaktualizuję wpis i powiem coś więcej na temat tego dostawcy.</p>
Wyświetleń : 1613]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2010/06/02/przenosiny-na-nowy-serwer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Acer 5740G &#8211; opinia po dwóch tygodniach użytkowania</title>
		<link>http://gruch4.pl/2010/05/20/acer-5740g-opinia-po-dwoch-tygodniach-uzytkowania/</link>
		<comments>http://gruch4.pl/2010/05/20/acer-5740g-opinia-po-dwoch-tygodniach-uzytkowania/#comments</comments>
		<pubDate>Thu, 20 May 2010 23:52:02 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=71</guid>
		<description><![CDATA[Po ponad dwóch i pół roku używania mojego wysłużonego Asusa F5R przyszedł czas na zmiany. Po w sumie krótkich poszukiwaniach wpadł mi w oko model o którym dzisiaj napiszę krótki wpis. A mowa tutaj o notebooku Acer Aspire 5740G. Nie będę przeprowadzał na nim żadnych testów wydajnościowych, skupię się jedynie na aspektach ważnych dla przeciętnego [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://gruch4.pl/wp-content/uploads/2010/05/acer_logo.png" alt="" title="acer_logo" width="299" height="95" class="alignleft size-full wp-image-74" /><br />
Po ponad dwóch i pół roku używania mojego wysłużonego Asusa F5R przyszedł czas na zmiany. Po w sumie krótkich poszukiwaniach wpadł mi w oko model o którym dzisiaj napiszę krótki wpis. A mowa tutaj o notebooku Acer Aspire 5740G. Nie będę przeprowadzał na nim żadnych testów wydajnościowych, skupię się jedynie na aspektach ważnych dla przeciętnego użytkownika.<br />
<span id="more-71"></span><br />
Na początek zobaczmy z jakim sprzętem mamy do czynienia:</p>
<table>
<tr>
<td>Matryca:</td>
<td><strong>16:9 HD LED 15.6&#8243; (1366&#215;768)</strong></td>
</tr>
<tr>
<td>Procesor:</td>
<td><strong>Intel&reg; Core&trade; i5 (i5-430M, 2,27GHz 3MB cache, TurboBoost)</strong></td>
</tr>
<tr>
<td>RAM:</td>
<td><strong>4GB DDR3 (1066MHz)</strong></td>
</tr>
<tr>
<td>HDD:</td>
<td><strong>500GB</strong</td>
</tr>
<tr>
<td>Grafika:</td>
<td><strong>ATI Mobility Radeon HD5650 (DirectX11, SM 5.0, Avivo)</strong></td>
</tr>
<tr>
<td>Pojemność Akumulatora:</td>
<td><strong>4400.00 mAh</strong></td>
</tr>
<tr>
<td>Porty:</td>
<td><strong>4xUSB, 1xLAN 1Gbps, 1xHDMI, 1xD-Sub, 1xRJ11, 1xAudio Line Out, 1xHeadphones, 1xMic, Czytnk kart pamięci, DVD</strong></td>
</tr>
<tr>
<td>System:</td>
<td><strong>Microsoft Windows 7 Professional x64</strong></td>
</tr>
<tr>
<td>Wymiary (szer. x głęb. x wys.) [mm]</td>
<td><strong>383x250x37</strong></td>
</tr>
</table>
<p><a href="http://gruch4.pl/wp-content/uploads/2010/05/527881.jpg"><img src="http://gruch4.pl/wp-content/uploads/2010/05/527881-150x150.jpg" alt="Acer Aspire 5740G" title="Acer 5740G - front" width="150" height="150" class="alignleft size-thumbnail wp-image-83" /></a></p>
<h3>Obudowa</h3>
<p>Na pierwszy rzut oka całość się prezentuje bardzo dobrze i na szczęście tak zostaje przy bliższym przyjrzeniu. Całość jest wyposażona w klawiaturę, przy której się na chwilę zatrzymam, łącznie z klawiaturą numeryczną. Przy pierwszym kontakcie nie mogłem się do niej przyzwyczaić. Klawisze są zupełnie płaskie z odstępami pomiędzy nimi. Jednak po chwili oswojenia, klawiatura stała się całkiem wygodna. Rozmieszczenie klawiszy bardzo wygodne. Jedyny mankament, to źle wciskająca się literka &#8222;i&#8221; w moim egzemplarzu. Ponad klawiaturą a wyświetlaczem znajduje się znaczna przerwa, na której są głośniki i 7 przycisków dodatkowych (zasilanie, WiFi, Bluetooth, Backup Manager, 2 przyciski głośności i Lunch Manager). Przyciski rozmieszczone są w ergonomiczny sposób. Jedyna rzecz, która kuje mnie w oczy, to przycisk Bluetooth, w modelu który tego modułu nie posiada! Ostatnia sprawa to Touchpad. Jest on zlokalizowany w idealnym miejscu, przynajmniej dla mnie. Przyciski chodzą dość ciężko. Sam touchpad nie jest tak czuły jak być powinien. Czasami chwilę trzeba pojeździć po nim palcem żeby zareagował. Bardzo fajna jest funkcja multidotyku, której jednak na co dzień nie używam. Obok samego Touchpada znajduje się również przycisk do jego wyłączenia.<br />
<a href="http://gruch4.pl/wp-content/uploads/2010/05/52788_11.jpg"><img src="http://gruch4.pl/wp-content/uploads/2010/05/52788_11-150x150.jpg" alt="Acer 5740G" title="Acer 5740G - tył" width="150" height="150" class="alignright size-thumbnail wp-image-85" /></a><br />
Co do portów, wszystkie są zlokalizowane bardzo dobrze. Po dwa porty USB z prawej i lewej strony, port LAN, HDMI, D-Sub oraz audio znajdują się po lewej stronie, po prawej natomiast port modemu analogowego i Keningston Lock. po tej stronie znajduje się również tacka z napędem DVD. Od przodu laptopa oprócz przycisku przesuwnego od klapy wyświetlacza znajduje się czytnik kart pamięci.<br />
Ogólnie rzecz biorąc, muszę zaliczyć obudowę tego notebooka za udaną. Jest dobrze wykonana, sztywna i stabilna. Jedyna  rzecz, która może irytować to pokrywa wyświetlacza, która jest tzw. &#8222;palcująca&#8221;, czyli najmniejszy dotyk i zostają widoczne ślady.</p>
<h3>Wyświetlacz</h3>
<p>Wyświetlacz w moim odczuciu jest wykonany bardzo dobrze. Ma duże kąty widzenia i jest bardzo wyraźny. Podświetlanie diodami LED jest bardzo dobre. Na początku ciężko się przestawić na tryb panoramiczny.</p>
<h3>Środek</h3>
<p>W samym środku dostajemy całkiem niezły sprzęt jak za tą cenę. Dobra i wydajna grafika, duża pamięć ulotna, dość duży dysk oraz wydajny procesor powinny zadowolić większość graczy.<br />
Nie będę tutaj przeprowadzał żadnych testów, ponieważ są od tego lepsze portale i ludzie, którzy się na tym znają. Mogę jedynie przedstawić indeks wydajności systemu Windows.<br />
<a href="http://gruch4.pl/wp-content/uploads/2010/05/indeks_wydajnosci.png"><img src="http://gruch4.pl/wp-content/uploads/2010/05/indeks_wydajnosci-300x92.png" alt="Indeks wydajności systemu Windows" title="indeks_wydajnosci" width="300" height="92" class="aligncenter size-medium wp-image-86" /></a><br />
Na koniec omawiania sprzętu chciał bym jeszcze zwrócić na technologię jaka została wykorzystana w zamontowanym procesorze. Mowa tutaj o technologii <strong>TurboBoost</strong>. Polega ona na podniesieniu taktowania na jednym rdzeniu procesora dla aplikacji, która może wykorzystywać tylko jeden rdzeń lub jeden wątek. Oczywiście jest to technologia bardziej zaawansowana, która mogła by zająć cały wpis. Poniżej jeszcze dla zainteresowanych sposób działania tej technologii:<br />
<a href="http://gruch4.pl/wp-content/uploads/2010/05/Intel_TurboBoost.jpg"><img src="http://gruch4.pl/wp-content/uploads/2010/05/Intel_TurboBoost-300x222.jpg" alt="Intel TurboBoost" title="Intel TurboBoost" width="300" height="222" class="aligncenter size-medium wp-image-88" /></a><br />
A poniżej TurboBoost w akcji, czyli gadżet pulpitu systemu Windows do obrazowania tej technologii:<br />
<img src="http://gruch4.pl/wp-content/uploads/2010/05/turboboost.png" alt="Intel TurboBoost Gadżet" title="turboboost" width="117" height="124" class="aligncenter size-full wp-image-90" /></p>
<h3>Słowem zakończenia</h3>
<p>Podsumowując, na razie nie żałuję tego zakupu. Na początku miałem obawy przed marką Acer, jednak po zakupie i tym krótkim okresie użytkowania moje obawy trochę zmalały. Mam nadzieję, że z biegiem czasu znikną całkowicie.</p>
Wyświetleń : 4115]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2010/05/20/acer-5740g-opinia-po-dwoch-tygodniach-uzytkowania/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>ASP.NET + AJAX w rękach początkującego</title>
		<link>http://gruch4.pl/2010/04/19/asp-net-ajax-w-rekach-poczatkujacego/</link>
		<comments>http://gruch4.pl/2010/04/19/asp-net-ajax-w-rekach-poczatkujacego/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 19:24:31 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=43</guid>
		<description><![CDATA[Ostatnim czasy zainteresowałem się (przymusowo) technologią firmy Microsoft do tworzenia aplikacji internetowych ASP.NET. Jako, że amatorsko i hobbystycznie pisałem aplikacje internetowe z użyciem języka PHP, jednakże zawsze traktowałem języki po stronie klienta takie jak JavaScript po macoszemu, używając go wtedy kiedy nie było innego wyjścia. Co za tym idzie AJAX był dla mnie zupełnie nieznaną [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-45" title="Microsoft ASP.NET AJAX" src="http://gruch4.pl/wp-content/uploads/2010/04/asp-net-ajax.png" alt="" width="259" height="118" /><br />
Ostatnim czasy zainteresowałem się (przymusowo) technologią firmy Microsoft do tworzenia aplikacji internetowych <strong>ASP.NET</strong>. Jako, że amatorsko i hobbystycznie pisałem aplikacje internetowe z użyciem języka PHP, jednakże zawsze traktowałem języki po stronie klienta takie jak JavaScript po macoszemu, używając go wtedy kiedy nie było innego wyjścia. Co za tym idzie AJAX był dla mnie zupełnie nieznaną technologią. Moje zdanie się zmieniło, kiedy zacząłem poznawać ASP.NET w środowisku Microsoft Visual Studio&#8230;<br />
<span id="more-43"></span></p>
<h3>1. Co to jest AJAX i z czym to się je&#8230;</h3>
<p>Na początek może przytoczę co to właściwie jest AJAX:<br />
AJAX jest to akronim od <strong>A</strong>synchronous <strong>J</strong>avaScript <strong>a</strong>nd <strong>X</strong>ML czyli mówiąc po polsku asynchroniczny JavaScript i XML. AJAX jest nowym podejściem do tworzenia stron internetowych. W tradycyjnym podejściu, użytkownik (a dokładniej przeglądarka) wysyła zapytanie do serwera, a serwer w odpowiedzi zwrotnej wysyła stronę do przeglądarki gdzie jest interpretowana. W technologii AJAX jest wysyłane zapytanie, ale serwer nie musi zwracać całej strony, tylko jej część, dzięki czemu strona nie musi być w całości przeładowywana. Zaletą tej technologi jest m.in. szybkość działania, zwłaszcza przy dużych stronach, gdzie tylko mały fragment strony jest aktualizowany.<br />
Jednak, jak to w większości przypadków bywa, są pewne wady, które w AJAX&#8217;e niestety występują, a są to:</p>
<ul>
<li>jest to język skryptowy, a jak wiemy niektórzy użytkownicy blokują skrypty wykonywane po stronie klienta. Wtedy taka strona staje się bezużyteczna. Jest to znikoma część użytkowników, jednak taka sytuacja występuje;</li>
<li>brak tradycyjnej nawigacji &#8211; ze względu, że nie jest to normalne zapytanie, nie możemy się poruszać w przód i w tył. Dla przeglądarki cały czas przeglądamy jedną stronę;</li>
<li>utrudnienie indeksowania stron.</li>
</ul>
<h3>2. Visual Studio + ASP.NET + AJAX</h3>
<p>Doszliśmy do sedna sprawy, czyli do biblioteki AJAX napisanej przez Microsoft dla potrzeb swojej technologii ASP.NET. Napisanie prostej asynchronicznej aplikacji w środowisku Visual Studio jest dziecinie proste, głównie za sprawą technologi Drag-and-Drop czyli Przeciągnij i Upuść.</p>
<p>Podstawowym komponentem jaki musi się znaleźć na każdej stronie, aby mógł być zastosowany AJAX jest <strong>ScriptManager</strong> służącym do zarządzania skryptami i bibliotekami AJAX&#8217;a oraz do zarządzania częściową aktualizacją strony.<br />
<small><em>Oczywiście, jeśli ktoś chce sam się zajmować i samodzielnie pisać skrypty, nic nie stoi na przeszkodzie, jednakże ja w tym artykule zajmuje się tylko narzędziami dostarczanymi prze MS.</em> </small><br />
Drugim komponentem jest <strong>UpdatePanel</strong>, który jest kontenerem na którym znajdują się kontrolki ASP.NET i HTML, które mają być uaktualniane bez pełnego przeładowywania strony.<br />
Praktycznie te dwa komponenty wystarczą aby zbudować aplikację korzystającą z technologii AJAX.</p>
<h3>3. Jak to wszytko połączyć?</h3>
<p>W tym podpunkcie pokażę jak to wszytko razem ze sobą połączyć aby zbudować prostą aplikację.</p>
<p>1. Uruchamiamy Visual Studio lub Visual Web Developer i tworzymy nową stronę, wybieramy język C# i nadajemy odpowiednią nazwę.<br />
2. Na obszar roboczy wrzucamy kontrolkę <em>ScriptManager</em> znajdującą się w Przyborniku w zakładce AJAX Extensions.<br />
3. Na obszar wrzucamy Label i Button. Następnie z kontrolek AJAX Extensions dodajemy UpdatePanel i do wnętrza UpdatePanel wrzucamy Label i Button. Całość wygląda mniej więcej tak:<br />
<a href="http://gruch4.pl/wp-content/uploads/2010/04/vs1.png"><img src="http://gruch4.pl/wp-content/uploads/2010/04/vs1-300x187.png" alt="" title="vs1" width="300" height="187" class="aligncenter size-medium wp-image-57" /></a><br />
4. Klikamy dwa razy na przycisk z normalnym Postbackiem i przechodzimy do pliku kodu. Zdarzenie uzupełniamy następująco (drugi przycisk analogicznie):</p>
<pre name="code" class="c-sharp">
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToString();
    }
    protected void Button2_Click(object sender, EventArgs e)
    {
        Label2.Text = DateTime.Now.ToString();
    }
</pre>
<p>5. W tym punkcie możemy już uruchomić nasza aplikację i cieszyć się użyciem AJAX&#8217;a.<br />
Jak widzimy kiedy klikniemy na przycisk &#8222;Aktualizuj (Normalny Postback)&#8221; strona cała się przeładuje i na etykiecie pokaże się aktualna data. Kiedy natomiast klikniemy na przycisk &#8222;Aktualizuj (AJAX Postback)&#8221; zaktualizuje się tylko część strony w której znajduje się druga etykieta.</p>
<p>Jak widzimy z przykładu powyżej, wystarczy kilka kliknięć myszą i możemy cieszyć się aplikacją z użyciem technologii AJAX.</p>
<h3>4. Tradycyjny model przeglądania stron czyli AJAX History</h3>
<p>Na samym początku pisałem, że AJAX ma pewną wadę, mianowicie uniemożliwia standardowe przeglądanie stron z możliwością nawigacji wstecz i w przód. Programiści Microsoftu rozwiązali jednak ten problem i w wersji ASP.NET 3.5 z ServicePack 1 dodali AJAX History czyli możliwość aby użytkownik mógł nawigować pomiędzy stronami nawet jeśli to były zapytania AJAX.<br />
Poniżej prezentuję prosty przykład użycia historii:<br />
1. Tworzymy nową stronę internetową i nadajemy jej odpowiednią nazwę.<br />
2. Na obszar roboczy wrzucamy ScriptManager. We właściwościach zaznaczamy właściwość <em>EnableHistory</em> na <em>True</em><br />
3. Teraz wrzucamy UpdatePanel, a w jego wnętrz dodajemy RadioButtonList z 4 opcjami do wyboru, Label oraz Button.<br />
W kodzie wygląda to mniej więcej tak:</p>
<pre name="code" class="xhtml">
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnableHistory="True"
            onnavigate="ScriptManager1_Navigate">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True"
                    onselectedindexchanged="RadioButtonList1_SelectedIndexChanged">
                    <asp:ListItem>Opcja1</asp:ListItem>
                    <asp:ListItem>Opcja2</asp:ListItem>
                    <asp:ListItem>Opcja3</asp:ListItem>
                    <asp:ListItem>Opcja4</asp:ListItem>
                </asp:RadioButtonList>
                <asp:Label ID="Label1" runat="server"></asp:Label>
                
                <asp:Button ID="Button1" runat="server" onclick="Button1_Click"
                    Text="Wykonaj" />
                
            </ContentTemplate>
        </asp:UpdatePanel>
</pre>
<p>4. Dla RadioButtonList generujemy zdarzenie <em>SelectedIndexChanged</em> i uzupełniamy je następująco (Upewniamy się, że RadioButtonList ma zaznaczoną właściwość <em>AutoPostback</em> na <em>True</em>):</p>
<pre name="code" class="c-sharp">
    protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        Label1.Text = RadioButtonList1.SelectedValue;
    }
</pre>
<p>5. Dla przycisku generujemy zdarzenie:</p>
<pre name="code" class="c-sharp">
    protected void Button1_Click(object sender, EventArgs e)
    {
        string historia = "Zaznaczony element to " + RadioButtonList1.SelectedValue;
        ScriptManager1.AddHistoryPoint("rb", RadioButtonList1.SelectedValue, historia);
    }
</pre>
<p>Warto przyjrzeć się tutaj metodzie <em>AddHistoryPoint()</em> obiektu ScriptManager. Przyjmuje ona 3 argumenty: pierwszy, jest to unikatowy klucz dla danego punktu historii, drugi jest to wartość jaka ma być przechowana w danym punkcie historii, a 3 jest to tytuł jaki będzie widoczny w przeglądarce pod danym punktem historii. Metoda ta występuję w kilku przeciążeniach.<br />
6. Ostatnim krokiem będzie kontrolowanie historii. Niestety środowisko nie zrobi wszystkiego za nas, dlatego dodanie nowego punktu historii musi być odpowiednio obsłużone, dlatego dodajemy zdarzenie <em>Navigate</em> obiektu ScriptManager. Zdarzenie to jest wykonywane w czasie asynchronicznego Postbacku, kiedy historia po stronie serwera zostaje zmieniona.<br />
A tak wygląda jego obsługa:</p>
<pre name="code" class="c-sharp">
    protected void ScriptManager1_Navigate(object sender, HistoryEventArgs e)
    {
        string str = String.Empty;
        if (e.State["rb"] != null)
        {
            str = e.State["rb"];
        }
        if (str.Length > 0)
        {
            RadioButtonList1.SelectedValue = str;
        }
        else
        {
            RadioButtonList1.SelectedIndex = -1;
        }
        Label1.Text = str;
    }
</pre>
<p>W tym przypadku właściwość <em>State</em> klasy <em>HistoryEventArgs</em> służy do wyciągania informacji/danych dla określonego stanu aplikacji, czyli w naszym przypadku dla określonego stanu w historii przeglądania. Jak widzimy w powyższym kodzie, stan aplikacji w danym punkcie musi być dokładnie obsłużony!</p>
<h3>5. Słowem zakończenia&#8230;</h3>
<p>Jak widzimy obsługa technologii AJAX w ASP.NET nie jest trudna i nie powinna przysporzyć problemów w prostych aplikacjach. Istnieje jeszcze dużo bibliotek rozszerzających możliwości tych standardowych kontrolek do obsługi AJAX&#8217;a <del datetime="2010-05-11T14:10:27+00:00">dostarczonych</del> nie dostarczonych przez Microsoft. Z tego co się zdążyłem zorientować godna uwagi jest paczka <a href="http://ajaxcontroltoolkit.codeplex.com/">Ajax Control Toolkit</a>, która rozszerza znacznie te możliwości.<br />
Jednak cała ta technologia ma jedną poważną wadę: hosting aplikacji napisanych w ASP.NET jest drogi, dość trudno znaleźć odpowiedni hosting. Co ważniejsze na danym hostingu musi być zainstalowana biblioteka do obsługi AJAX, ponieważ inaczej nasze aplikacje napisane z użyciem tej technologii nie będą po prostu działać.</p>
<p>Projekty do artykułu (wykonane w Visual Studio 2010): <a href="http://gruch4.pl/download/download.php?id=3"> KLIK!</a></p>
Wyświetleń : 1872]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2010/04/19/asp-net-ajax-w-rekach-poczatkujacego/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows PowerShell</title>
		<link>http://gruch4.pl/2010/04/02/windows-powershell/</link>
		<comments>http://gruch4.pl/2010/04/02/windows-powershell/#comments</comments>
		<pubDate>Fri, 02 Apr 2010 00:38:44 +0000</pubDate>
		<dc:creator>gruch4</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[PowerShell]]></category>
		<category><![CDATA[Winoows]]></category>

		<guid isPermaLink="false">http://gruch4.pl/?p=32</guid>
		<description><![CDATA[Jakiś czas temu na Kole Naukowym Informatyków prowadzonym na mojej uczelni miałem przyjemność wygłosić prezentację na temat narzędzia do zarządzania systemem Windows jakim jest Windows PowerShell Może krótko co to jest Windows PowerShell: Windows PowerShell to interpreter poleceń opracowany przez firmę Microsoft. Jest znacznie rozbudowanym następcą dotychczasowych interpreterów command.com i cmd.exe, stosowanych w systemach operacyjnych [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://gruch4.pl/wp-content/uploads/2010/04/Windows_PowerShell_icon.png"><img src="http://gruch4.pl/wp-content/uploads/2010/04/Windows_PowerShell_icon.png" alt="WPS" title="Windows_PowerShell_icon" width="256" height="256" class="alignleft size-full wp-image-38" /></a><br />
Jakiś czas temu na Kole Naukowym Informatyków prowadzonym na mojej uczelni miałem przyjemność wygłosić prezentację na temat narzędzia do zarządzania systemem Windows jakim jest <strong>Windows PowerShell</strong><br />
<span id="more-32"></span></p>
<p>Może krótko co to jest Windows PowerShell:</p>
<blockquote><p><strong>Windows PowerShell</strong>  to interpreter poleceń opracowany przez firmę Microsoft. Jest znacznie rozbudowanym następcą dotychczasowych interpreterów command.com i cmd.exe, stosowanych w systemach operacyjnych MS-DOS i MS Windows. [...] PowerShell jest zintegrowany z .NET Framework i dostarcza środowisko do wykonywania zadań administracyjnych wykonywanych poleceniami cmdlets.<br />
[za Wikipedia]
</p></blockquote>
<p>Jest to bardzo przydatne narzędzie dla administratorów systemów, serwerów, serwerów bazodanowych i wielu innych zastosowań. Bez problemu możemy zarządzać systemem zdalnie właśnie przez WPS. Jest to również bardzo dobre narzędzie do automatyzacji pracy przez zastosowanie skryptów. Twórcy chcieli zrobić coś na wzór konsoli pod systemy Uniksowe dla Windows i moim zdaniem im się to bardzo dobrze udało. Wreszcie jest coś co nie jest tak toporne jak standardowy cmd czy command. Na dodatek możemy korzystać z całego bogactwa platformy .NET, WMI czy ActiveX. Zapraszam do ściągnięcia mojej prezentacji &#8222;Wprowadzenie do Windows PowerShell&#8221;.</p>
<p>Link: <a href="http://gruch4.pl/download/download.php?id=2">WindowsPowerShell.zip</a></p>
Wyświetleń : 1519]]></content:encoded>
			<wfw:commentRss>http://gruch4.pl/2010/04/02/windows-powershell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

