<?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>.NET/C# development blog &#187; web parts</title>
	<atom:link href="http://blog.milosierny.net/tag/web-parts/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.milosierny.net</link>
	<description>blog o technologiach okołodotnetowych</description>
	<lastBuildDate>Sat, 24 Apr 2010 20:17:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Łączenie kontrolek Web Parts w ASP.NET 2.0</title>
		<link>http://blog.milosierny.net/2009/11/30/laczenie-webpartow-w-asp-net-2-0/</link>
		<comments>http://blog.milosierny.net/2009/11/30/laczenie-webpartow-w-asp-net-2-0/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 22:52:21 +0000</pubDate>
		<dc:creator>Bartosz</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[web 2.0]]></category>
		<category><![CDATA[web parts]]></category>

		<guid isPermaLink="false">http://blog.milosierny.net/?p=54</guid>
		<description><![CDATA[W ASP.NET 2.0 wprowadzono interesującą i wydajną funkcjonalność &#8211; Web Parts. Czym są Web Parts? W skrócie: są to pewne zamknięte komponenty aplikacji internetowej, które są tworzone i zarządzane w jednolity sposób. Jedną z najbardziej użytecznych cech web partów (czasami będę odmieniać przez przypadki, ponieważ nie udało mi się znaleźć żadnego dobrego polskiego odpowiednika) jest [...]]]></description>
			<content:encoded><![CDATA[<p>W ASP.NET 2.0 wprowadzono interesującą i wydajną funkcjonalność &#8211; <strong>Web Parts</strong>. Czym są Web Parts? W skrócie: są to pewne zamknięte komponenty aplikacji internetowej, które są tworzone i zarządzane w jednolity sposób. Jedną z najbardziej użytecznych cech web partów (czasami będę odmieniać przez przypadki, ponieważ nie udało mi się znaleźć żadnego dobrego polskiego odpowiednika) jest to, że mogą być one dodawane, usuwane i edytowane nie tylko przez programistów, ale też przez użytkowników Twojej aplikacji internetowej. Web parts w akcji możesz zobaczyć np. na stronie: <a href="http://igoogle.com">igoogle.com</a>.</p>
<p>Ten wpis nie będzie o tworzeniu web partów &#8211; chcę skupić się na pewnym małym wycinku tematu &#8211; mianowicie na tworzeniu połączeń między web partami.</p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-0055460474580388";
/* 468x60, utworzono 09-11-27 */
google_ad_slot = "0413534588";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
<h1>Po co łączyć web parts</h1>
<p>Przypuśćmy, że tworzysz aplikację webową, która wyświetla szczegóły na temat europejskich miast. Chciałbyś zorganizować te stroną w taki sposób, żeby korzystała z web parts. W ten sposób umożliwiłbyś użytkownikowi samodzielne zarządzanie wyglądem strony. Załóżmy, że w jednym web parcie użytkownik będzie wpisywał (bądź wybierał z listy) nazwę miasta. W innych web partach pojawią się wówczas informacje takie jak:</p>
<ul>
<li>liczba ludności miasta,</li>
<li>slideshow ze zdjęciami z miasta,</li>
<li>aktualna prognoza pogody, itd.</li>
</ul>
<p>Aby uzyskać opisaną funkcjonalność, jako programista, musisz ustalić połączenie między web partami. Można to zrobić na dwa sposoby &#8211; 1) ustalić statyczne połączenie lub 2) umożliwić użytkownikom tworzenie dynamicznych powiązań. Omówię pierwszy z nich.</p>
<h1>Statyczne powiązanie web partów</h1>
<p>Statyczne powiązanie polega na wskazaniu jednego web parta jako dostawcy (<strong>provider</strong>) i jednego bądź więcej odbiorców (<strong>consumer</strong>).</p>
<p>Uwaga: dla ułatwienia jako web partów będziemy używać własnych kontrolek (<strong>user controls</strong>).</p>
<p>Stworzenie dostawcy polega na dodaniu do gotowej kontrolki metody, która będzie zwracała pewną wartość. W naszym przykładzie chcemy, aby była to nazwa miasta pochodząca z rozwijalnej listy. Oto, jak mógłby wyglądać przykładowy kod takiej kontrolki:</p>
<pre class="brush: csharp;">
public partial class CityChooser : System.Web.UI.UserControl
{

    string _cityName = CityData.GetData().First().Name;

    [ConnectionProvider(&quot;My web parts connection&quot;, &quot;GetCityName&quot;)]
    public string GetCityName()
    {
        return _cityName;
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack)
        {
            string userCity = DropDownList1.SelectedValue;
            _cityName = CityData.GetData().First(city =&gt; city.Name == userCity).Name;
        }

    }
}
</pre>
<p>Obiekt <span class="myPre">CityData</span> zawiera po prostu listę miast w postaci struktur zawierających wszystkie potrzebne dane (np. pole <span class="myPre">Name</span> czy <span class="myPre">Population</span>). Dokładny wygląd tej klasy nie jest w tej chwili istotny. Najistotniejsza jest metoda:</p>
<pre class="brush: csharp;">
[ConnectionProvider(&quot;My web parts connection&quot;)]
public string GetCityName()
{
    return _cityName;
}
</pre>
<p>Metoda ta (<strong>ważne &#8211; publiczna!</strong>) zwraca po prostu nazwę miasta wybranego z listy rozwijalnej. Atrybut <span class="myPre">ConnectionProvider</span> określa, że jest to nasz dostawca danych dla innych web partów (konsumentów). Tu używamy z jednym parametrem (&#8221;przyjazną&#8221; nazwą połączenia), ale jest też przeciążona wersja z dwoma typu <span class="myPre">string</span>. Wówczas pierwszy określa &#8220;przyjazną&#8221; nazwę naszego połączenia, a drugi definiuje <strong>unikalną</strong> nazwę naszego punktu połączenia. Można pominąć drugi parametr &#8211; wówczas nasz punkt będzie się nazywał <span class="myPre">default</span> (oczywiście, gdybyśmy chcieli zdefiniować drugi <span class="myPre">ConnectionProvider</span>, to wówczas trzeba już użyć drugiego parametru &#8211; nazwa <span class="myPre">default</span> byłaby już zajęta).</p>
<p>Mamy zatem zdefiniowanego dostawcę naszych danych. Czas na konsumentów.</p>
<p>Stworzenie konsumenta polega na dodaniu do kontrolki będącej web partem metody (znów publicznej), która będzie przyjmować parametr &#8211; tego samego typu, jaki jest zwracany przez naszą metodę-dostawcę. Metodą tą należy opatrzyć atrybutem <span class="myPre">ConnectionConsumer</span>. Całość mogłaby wyglądać następująco:</p>
<pre class="brush: csharp;">
public partial class PopulationDisplayer : System.Web.UI.UserControl
{
    [ConnectionConsumer(&quot;My consumer&quot;)]
    public void ShowPopulation(string city)
    {
        lblCityPop.Text = CityData.GetData().First(c =&gt; c.Name == city).Population.ToString();
    }
}
</pre>
<p>I znów najważniejszy jest atrybut <span class="myPre">ConnectionConsumer</span>. Parametry mają takie samo znaczenie jak w poprzednim przypadku.</p>
<p>Teraz, gdy mamy już zdefiniowanego dostawcę i co najmniej jednego odbiorcę, możemy ustalić połączenie. W tym celu musimy stworzyć stronę, na której będą działać nasze web party. Dodajemy oczywiście kontrolkę <span class="myPre">WebPartManager</span> oraz <span class="myPre">WebPartZone</span>, w której w <span class="myPre">ZoneTemplate</span> umieszczamy nasze web party. Kod kontrolki <span class="myPre">WebPartZone</span> może wyglądać następująco:</p>
<pre class="brush: xml;">
&lt;asp:WebPartZone ID=&quot;WebPartZone3&quot; runat=&quot;server&quot; Style=&quot;width: 650px; height: auto;&quot;&gt;
    &lt;ZoneTemplate&gt;
        &lt;uc2:CityChooser ID=&quot;Provider&quot; runat=&quot;server&quot; /&gt;
        &lt;uc3:PopulationDisplayer ID=&quot;Consumer&quot; runat=&quot;server&quot; /&gt;
    &lt;/ZoneTemplate&gt;
&lt;/asp:WebPartZone&gt;
</pre>
<p>Samo powiązanie definiujemy natomiast w kontrolce <span class="myPre">WebPartManager</span> w części <span class="myPre">StaticConnections</span>:</p>
<pre class="brush: xml;">
&lt;asp:WebPartManager ID=&quot;WebPartManager1&quot; runat=&quot;server&quot;&gt;
    &lt;StaticConnections&gt;
        &lt;asp:WebPartConnection
            ID=&quot;CityToPopulation&quot;
            ProviderID=&quot;Provider&quot;
            ConsumerID=&quot;Consumer&quot;&gt;
        &lt;/asp:WebPartConnection&gt;
    &lt;/StaticConnections&gt;
&lt;/asp:WebPartManager&gt;
</pre>
<p>I tak oto, gdy w jednym web parcie z listy wybierzemy miasto, to w drugim zobaczymy liczbę ludności tego miasta:</p>
<div id="attachment_71" class="wp-caption alignnone" style="width: 488px"><img class="size-full wp-image-71" title="Powiązanie Web Parts " src="http://blog.milosierny.net/wp-content/uploads/2009/11/web-parts.PNG" alt="Powiązanie Web Parts " width="478" height="371" /><p class="wp-caption-text">Powiązanie Web Parts </p></div>
<p>Gdybyśmy w atrybutach definiujących naszego dostawcę i konsumenta podali unikalne nazwy dla naszych punktów, np:</p>
<pre class="brush: csharp;">
[ConnectionProvider(&quot;My web parts connection&quot;, &quot;ProvideData&quot;)]
</pre>
<pre class="brush: csharp;">
[ConnectionConsumer(&quot;My consumer&quot;, &quot;ConsumeData&quot;)]
</pre>
<p>wówczas kod kontrolki <span class="myPre">WebPartManager</span> wyglądałby nieco inaczej:</p>
<pre class="brush: csharp;">
    &lt;asp:WebPartManager ID=&quot;WebPartManager1&quot; runat=&quot;server&quot;&gt;
        &lt;StaticConnections&gt;
            &lt;asp:WebPartConnection
            ID=&quot;CityToPopulation&quot;
            ProviderID=&quot;Provider&quot;
            ProviderConnectionPointID=&quot;ProvideData&quot;
            ConsumerID=&quot;Consumer&quot;
            ConsumerConnectionPointID=&quot;ConsumeData&quot;&gt;
            &lt;/asp:WebPartConnection&gt;
        &lt;/StaticConnections&gt;
    &lt;/asp:WebPartManager&gt;
</pre>
<p>Musielibyśmy wówczas określić, że chodzi nam o konkretne metody za pomocą właściwości: <span class="myPre">ProviderConnectionPointID</span> i <span class="myPre">ConsumerConnectionPointID</span>.</p>
<p>Gdybyśmy chcieli użyć większej ilości konsumentów, musielibyśmy zdefiniować odpowiednie <span class="myPre">WebPartConnection</span> dla każdej pary web partów.</p>
<p>W taki sposób można łatwo definiować statyczne połączenia. O tym, jak umożliwić użytkownikom strony tworzenie dynamicznych połączeń, będzie następny (krótki) wpis.</p>
<p>Tym razem załączam kod źródłowy przykładowego rozwiązania &#8211; wersja dla Visual Studio 2008. Żeby korzystać z web partów, trzeba mieć SQL Server wersję Express, ponieważ web parts korzystają z bazy danych (<span class="myPre">App_Data/ASPNETDB.MDF</span>), żeby zapamiętywać preferencje użytkownika. Paczka z kodem nie zawiera tego pliku &#8211; trzeba go sobie stworzyć samemu (np. przy pomocy narzędzia ASP.NET Configuration).</p>
<p><span class="myPre"><img class="alignnone size-full wp-image-74" style="vertical-align: middle; margin-right: 10px;" title="vssolution" src="http://blog.milosierny.net/wp-content/uploads/2009/11/vssolution.gif" alt="vssolution" width="30" height="28" /><a href="http://blog.milosierny.net/wp-content/uploads/2009/11/WebParts-static-connections-blog.milosierny.zip">WebParts static connections &#8211; kod C#</a> (6,29 KB)</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.milosierny.net/2009/11/30/laczenie-webpartow-w-asp-net-2-0/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

