január, 2008 havi archívum

AJAX Control Toolkit –
ListSearchExtender

Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:
http://www.devportal.hu/portal/Detailed.aspx?NewsId=c6a29adc-a3dd-4412-9b59-1b9ea45002a6 vagy

http://cid-8dcaf3b0da4fb828.skydrive.live.com/embedrowdetail.aspx/ACTsorozat/ACT|_XVI|_ListSearchExtender.zip

Ezen a héten a ListSearchExtender-rel ismerkedünk meg, illetve belekukkantuk egy kicsit az Ajaxcontroltoolkit szerelvénybe is.
 
ListSearchExtender alapok
A ListSearch egy olyan okos kis extender, mely arra szolgál, hogy egy DropDownList-ben vagy ListBox-ban megkönnyítsük a felhasználónak a megfelelő elem kiválasztását. A segítség olyan formában érkezik, hogy amint belekattint a kliens valamelyik vezérlőbe (vagy a DDL-be, vagy az LB-be), akkor megjelenik egy címke, amibe gépelhet. Utána automatikusan ahhoz az elemhez fog ugrani a vezérlő, amelyiknek az elejére ráillik az eddig begépelt pattern.
Gondolom ilyennel már mindenki találkozott, winform-os környezetben biztosan.
Az egyetlen dolog, amit ennél az extender-nél testreszabhatunk az a megjelenítendő szöveg (amiben megkérjük, hogy gépelje be a keresendő elem elejét), illetve annak kinézete, és elhelyezkedése.

ListSearchExtender használata
Most egy olyan webalkalmazást fogunk elkészíteni, mely az ajaxcontroltoolkit.dll bizonyos részeit fogja visszafejteni IL kódból, számunkra is érthető formába. Lesz egy DropDownList-ünk, melyet a szerelvényen belüli osztályok, illetve enumerátorok neveivel töltünk fel (az osztályok közül is csak azokkal, amelyek nem nested-ek, vagyis nincsen(ek) alosztálya(i)).
Ezen kívül az oldalon található lesz még egy ListBox is, amelyből majd azt lehet kiválasztani, hogy milyen típusú member-jeit (tagjait) listázzuk ki az adott osztálynak (Mehtods, Events, Propreties, Fields). Enumerátor esetén figyelmen kívül fogjuk hagyni a ListBox-ot, és mindig a lehetséges értékeket fogjuk felsorolni. Az eredményt egy label-be fogjuk kiíratni.
Ha autopostback-re állítanánk a listavezérlőket, akkor nem lenne túl sok értelme az LSE-nek, ezért egy ImageButton-t is beveszünk a buliba.

Az alkalmazásunk markup kódja most valahogy így néz ki:

<asp:DropDownList ID="DDL_Classes" runat="server">
</asp:DropDownList><br/><br/>
<asp:ListBox ID="LB_members" runat="server" Width="100px" Height="50px">
    <asp:ListItem Text="Methods" Selected="True" />
    <asp:ListItem Text="Events" />
    <asp:ListItem Text="Properties" />
    <asp:ListItem Text="Fields" />
</asp:ListBox>&nbsp;
<asp:ImageButton ID="IB" runat="server" ImageUrl="~/filter.gif" OnClick="reflect_act" /><br/><br /><br />
<asp:UpdatePanel ID="UP" runat="server">
    <ContentTemplate>
        <asp:Label ID="lbl_result" runat="server" Text=""></asp:Label>
    </ContentTemplate>
    <Triggers><asp:AsyncPostBackTrigger ControlID="IB" EventName="Click" /></Triggers>
</asp:UpdatePanel>

Ezek után irány a code-behind fájl! Ahhoz, hogy egy szerelvényen belüli típusokat (osztályokat) el tudjunk érni, szükségünk lesz a reflection-re (reflexióra), vagyis a System.Reflection névtérre. Ezen kívül a kódban még fogunk használni generikus listákat is, ezért a System.Collections.Gerenic namespace-t is using-oljuk.
Page_Load-ból dinamikusan töltjük fel a DDL_Classes listavezérlőnket (természetesen csak az első oldalkérésnél, hiszen postback esetén, ha újra feltöltenénk, akkor mindig az első elem lenne a kiválasztott!) Nézzük is meg a Page_Load-hoz rendelt kódot:

if (!IsPostBack)
{
    act = Assembly.LoadFrom(Server.MapPath("Bin/AjaxControlToolkit.dll"));
    Type[] classes = act.GetTypes();

    List<string> classnames = new List<string>();

    foreach (Type myclass in classes)
    {
        if (!myclass.IsNested && myclass.Namespace == "AjaxControlToolkit")
        {
            classnames.Add(myclass.Name);
        }
    }
    classnames.Sort();
    classnames.ToArray();
    DDL_Classes.DataSource = classnames;
    DDL_Classes.DataBind();
}

Az act egy privát Assembly típusú adattag (private Assembly act;).
A GetTypes() metódussal elkérjük a szerelvényen belüli típusokat (az enumerátor is típus!), majd utána csak azok neveit tároljuk a classnames listában, amelyek nem tartalmaznak alosztályokat, illetve az AjaxControlToolkit névtéren belül helyezkednek el. (Az AjaxControlToolkit.dll ezen kívül még két névteret tartalmaz, de azokban csak segédobjektumok vannak!). Azért foglalkozunk csak a nem nested osztályokkal, mert az alosztályokat tartalmazóaknál, a GetType() metódus (lsd. lentebb) null értéket ad vissza, így viszont eléggé nehézkes belőle kinyerni bármilyen információt is . (természetesen nem megoldhatatlan probléma ez, de most a példaalkalmazásban bőven elegendő az a 196 típus, amely megfelel a fentebb leírt elvárásoknak).
Végül pedig a kódunkban, abc szerint rendezzük a típusok neveit.

Ha ezzel megvagyunk, akkor már csak két dolog van hátra, megírni a reflect_act metódust és berántani a markup kódba két LSE-t és bekonfigolni. Folytassuk a munkánkat a code-behind írásával, íme az ImageButton click eseményéhez rendelt kód:

act = Assembly.LoadFrom(Server.MapPath("Bin/AjaxControlToolkit.dll"));
Type myclass = act.GetType(String.Format("AjaxControlToolkit.{0}",DDL_Classes.SelectedValue.ToString()));

MemberInfo[] details = null;
if (myclass.IsEnum)
{
    details = myclass.GetFields();
    lbl_result.Text = String.Format("<u><i>Enum – </i>{0}</u></br>", myclass.Name);
}
else
{
    lbl_result.Text = String.Format("<u><i>Class/Requested Memberslist – </i><b>{0}/{1}</b></u><br><br/>", myclass.Name,LB_members.SelectedItem );
    switch (LB_members.SelectedItem.Text)
    {
        case "Methods":
            details = myclass.GetMethods();
            break;
        case "Events":
            details = myclass.GetEvents();
            break;
        case "Properties":
            details = myclass.GetProperties();
            break;
        case "Fields":
            details = myclass.GetFields();
            break;
    }
}

foreach (MemberInfo met in details)
{
    lbl_result.Text += String.Format("<b>{0}</b>-<i>{1}</i><br/>", met.DeclaringType, met.Name);   
}
if (details.Length < 1)
{
    lbl_result.Text += "<font color=’red’><b>No member found!</b></font>";
}

Először betöltjük az ACT szerelvényt. (Éles alkalmazás esetén érdemes ezt a Page_Load-nál Cache-ben eltárolni!).
Ezek után elkérjük azt a típust, melyet kiválasztott a felhasználó, a GetType() metódus segítéségével. Fontos, hogy ilyenkor a teljes nevét meg kell adnunk a típusnak (, vagyis névterekkel együtt)!
A Type osztálynak van egy csomó GetXXX metódusa, melyek mind egy MemberInfo tömböt adnak vissza, így létrehozunk egy ilyen típusú változót (details).
Ezek után leellenőrizzük, hogy a típus enumerátor-e, ha igen, akkor a GetFields metódus segítségével elkérjük az értékeit! Ha nem enum, akkor pedig a ListBox kiválasztott elemétől függően hívjuk meg valamelyik GetXXX metódust.
Végül pedig végigiterálunk a member-ökön, és kiíratjuk a member nevét, illetve, hogy mely osztályon belül lett deklarálva. Ha az adott osztálynak nincsen ilyen típusú tagja, akkor kiírjuk, hogy nem találtunk (mivel a details egy tömb, ezért a length tulajdonsággal ezt egyszerűen le tudjuk kérdezni).

Most, hogy már a dolog lényegi részével kész vagyunk, ideje egy kicsit fokoznunk a felhasználói élményt. Húzzunk egy LSE-t a DDL alá, illetve egy másikat a LB alá. Az elsőt az alábbi módon állítsuk be:

<ajaxToolkit:ListSearchExtender ID="LSE_1" runat="server"
            TargetControlID="DDL_Classes"
            PromptText="<i>Pls, type class or enum name!</i>" >
            <Animations>
                <OnShow>
                   <Sequence>
                    <HideAction Visible="true" />
                    <FadeIn duration="1" Fps="25"/>
                   </Sequence>
                </OnShow>
            </Animations>
</ajaxToolkit:ListSearchExtender>

Alapértelmezés szerint, ha a PromtText tulajdonságban nem szabunk meg valamilyen egyedi szöveget, akkor az alábbi mondat fog automatikusan megjelenni a DDL felett, amikor a kliens belekattint: Type to search. Értelemszerűen amennyiben a felhasználó leüt egy billentyűt, ez a szöveg eltűnik, és helyette megjelenik a begépelt betű. (ez viszont már nem lesz dőlt, mint a promttext, megoldást lsd. lentebb).
Ehhez az extender-hez is rendelhető ugyanúgy animáció, mint pl.: HoverMenuExtender-hez vagy DropDownExtender-hez. A különbség az, hogy nekem sehogy sem sikerült elérnem azt, hogy az OnHide eseményhez rendelt animáció legalább egyszer lefusson, mindig csak a „normál” villan egyet és eltűnik az „animáció” fogadott.

A másik ListSearch extender-ün konfig után, valahogy így nézzen ki:

<ajaxToolkit:ListSearchExtender ID="LSE_2" runat="server"
            TargetControlID="LB_members"
            PromptPosition="Bottom"
            PromptCssClass="promt_text">
</ajaxToolkit:ListSearchExtender>

.promt_text
{
   background-color: yellow;
   font-style: italic;
}

A PromtPosition tulajdonságnál azt állíthatjuk be, hogy a PromtText-es címke, amelybe a kliens majd gépelhet, az adott vezérlő fölött (Top, ez az alapértelmezett), vagy alatt (Bottom) helyezkedjen el. (DDL-nél értelemszerűn érdemes fölé tenni, hiszen lefelé nyílik a legördülő-lista).
A PromtCssClass tulajdonsággal értelemszerűen a promttext, illetve a begépelt pattern kinézete formázható!

Végre elkészült az alkalmazásunk, teszteljük!

Zárásképpen, két bug:
– Ha az LB magasságát markup-ból vagy css-ből korlátozzuk, akkor néha villogni fog a vezérlő, illetve a dinamikus címke is!
– Safari esetén, ha pattern gépelés közben backspace-t üt le a felhasználó, akkor az előző oldalon fogja magát találni
Erre egy megoldást az alábbi oldalon a ListSearchExtender Know Issues résznél találhattok:
http://www.asp.net/AJAX/AjaxControlToolkit/Samples/ListSearch/ListSearch.aspx
 

AJAX Control Toolkit –
HoverMenuExtender

Ez egy példaalkalmazáshoz tartozó leírás! Az alkalmazás erről a címről tölthető el:
http://www.devportal.hu/portal/Detailed.aspx?NewsId=89bbc338-6ab0-48a7-96f2-ca9a1f417e4a vagy

http://cid-8dcaf3b0da4fb828.skydrive.live.com/embedrowdetail.aspx/ACTsorozat/ACT|_XV|_HoverMenuExtender.zip

Az év első cikkében a HoverMenuExtender-rel ismerkedünk meg, illetve megnézzük még azt is, miként tudunk például animációt hozzáadni bizonyos kontrolokhoz script kódból.
 
HoverMenuExtender alapok
A HME, mint ahogy a nevéből is következik, arra használható, hogy ha a kliens az egeret egy adott vezérlő fölé viszi, akkor jelenjen meg egy másik vezérlő, és az adott vezérlő kinézete pedig megváltoztatható.
(Ez az extender hasonlít a PopupExtender-hez, a különbség köztük az, hogy más esemény hatására jelenítenek meg egy popup panelt. Részletesebben a PopupExtender-es cikkben!)
Mint ahogyan a fenti leírásban is próbáltam rá utalni, ez az extender bármely ASP.NET-es control-hoz hozzárendelhető, kivéve értelemszerűen a non-visual megjelenésűekhez (pl.: DataSource vezérlők, DataSet, stb.). Sőt, a megjelenítendő popup-vezérlőnek sem kell egy konténervezérlőn belül elhelyezkednie ahhoz, hogy beállíthassuk  PopupControlID tulajdonságként, hanem egyszerűen önmagában is megadható!
Ezzel így már eléggé nagy szabadságot kapunk, hiszen a DropDownExtender-nél, illetve a DynamicExtender-nél is voltak megszorítások, hogy mihez és hogyan lehet kapcsolni őket!
Mint ahogy arról már fentebb is volt szó, az „eredeti” vezérlő „hover” megjelenése is teljes mértékben testreszabható. Aki kicsit is jártasabb a CSS világában, az tudja, hogy létre lehet hozni, olyan css pseudo-class-t, amely akkor jut érvényre, ha az adott vezérlő fölé visszük az egeret. Az ilyen pseudo-osztályokat így definiálhatjuk: .class :hover /gondolom így már mindenkinek ismerős (pl.: <a class="red" …>; a.red:visited{…}, a.red:hover{…})/. Nos a HME ettől a 6 betűtől kímél meg minket azáltal, hogy az eredeti vezérlő hover kinézetért felelős css osztályt beállíthatjuk a HoverCssClass tulajdonságon keresztül.
A megjelenítendő vezérlő megfelelő poziciójának beállítására is nagy hangsúlyt fektettek az ACT fejlesztői (PopupPosition, OffsetX, OffsetY), lentebb bővebben..

A HoverMenuExtender használata

Az 5let-től a HME-ig
Ebben a cikkben egy olyan példaalkalmazást fogunk elkészíteni, mely annyit tud, hogy ha egy kép fölé visszük az egeret, akkor fölötte megjelenik egy Hide gomb, ami szépen fadeout-olja a képet. Utána ha a nem látható kép fölé bóklászunk az egérrel, akkor pedig egy Show gomb fog megjelenni, ami majd fadein-eli az eltűntetett képet. Azért, hogy adjunk egy kis esélyt a felhasználónak, hogy megtalálhassa a képet, a láthatóságot csak 10%-ra visszük le (90%-ban átlátszó).
Először szedjük össze mire is van szükségünk. Mindenféleképpen szükségünk lesz egy képre (ezzel a feladattal, talán egyedül is meg lehet bírkózni). Szükségünk lesz még egy Panel-re, illetve benne két html button vezérlőre (emlékezzünk vissza, az előző cikkben már volt erről szó, hogy miért nem jók nekünk az automatikusan postback-et generáló gombok!).
Mindezeken felül, még szükségünk lenne 2db AnimationExtender-re is, de hogy valami érdekes is legyen a cikkben, ezért az animációkat most java scriptből fogjuk meghívni!

Dobjunk fel az oldalunkra egy képet, illetve egy panelt, bele pedig két html gombot és az alábbi módon állítsuk be őket:

<body onload="Load()">

<asp:Panel ID="pnl_buttons" runat="server" CssClass="Panel">
    <input id="btn_hide" type="button" value="Hide" onclick="Hide()" />
    <input id="btn_show" type="button" value="Show" onclick="Show()" />
</asp:Panel>
<br/>
<asp:Image ID="img_target" runat="server" ImageUrl="~/earth.jpeg" Width="200" Height="200" />

A Panel CSS osztályban mindössze annyit állítsunk be mindenképp: visibility: hidden; (korábban már részletezett okok miatt…). A javascirpt kódokról kicsit később!
Most adjunk a formunkhoz egy HME vezérlőt, és így állítsuk be:

<ajaxToolkit:HoverMenuExtender ID="HME_1" runat="server"
            PopupControlID="pnl_buttons"
            TargetControlID="img_target"
            PopupPosition="Top"
            OffsetX="5"
            OffsetY="-5"
            PopDelay="1200">
</ajaxToolkit:HoverMenuExtender>

A PopupControlID-val a megjelenítendő vezérlőt szabhatjuk meg.
A PopupPosition segítségével azt állíthatjuk be, hogy az eredeti vezérlőhöz képest hol jelenjen meg a popup vezérlő. A HoverMenuPopupPosition enumátor értékei közül vehet fel értéket, vagyis Center, Top, Right, Bottom, Left (ez a default).
Az OffsetX az eredeti vezérlő megfelelő oldaltól (PopupPosition-től függően) X irányban eltolja a popup-vezérlőt, a tulajdonságnak értékül adott pixelnyivel. Természtesen az érték lehet negatív is, így lehet jobbra és balra is mozgatni vízszintesen a popup control-t.
Az OffsetY az OffsetX horizontális párja.
A PopDelay tulajdonság segítségével azt az időt szabhatjuk meg, hogy hány milliszekundumig jelenjen még meg a „HoverMenu” azuán, hogy az egér már nincs a TargetControl fölött. Alapértelmezett érték 100!

Megjegyzés: Mint ahogy a DropDownExtender-nél is volt már szó a dinamikus content generálásról, itt is van erre lehetőség. (A Webmetódusnak szintén egy string-et kell visszaadnia, az opcionális bemenő paramétere pedig a contentKey).
Ezen felül még említést érdemel az Animations tulajdonsága is a HME-nek, amelynél a megjelenítendő vezérlő OnShow és OnHide eseményeihez tudunk animációkat rendelni. Ezzel a lehetőséggel mi most nem élünk.

Java kódok
Végül nézzük meg a java script kódokat! (a kényelmesebb fejlesztés érdekében olvassuk el a következő bekezdést, és csak utána álljunk neki ezen blokkban leírtak kipróbálásának / megvalósításának!)
Összességében három javascript függvényt kell megírnunk, kettőt a gombokhoz (Hide, Show), illetve egyet az oldal betöltéséhez (body onload eseményéhez rendelt Load függvény). Kezdjük először a load implementálásával. Amikor az oldal betöltődik, akkor azt szeretnénk, hogy, ha a kép fölé visszük az egeret, ne jelenjen meg a Show gomb. Ezt egy egyszerű visibilty hidden-nel is meg lehetne oldani, de mivel az aninációk alapból párhuzamosan futnak le, és mivel a gombokhoz is rendelni fogunk anim-eket, ezért csak az animáció felénél váltana át a visibility hidden-ről visible-re. Ezért ezt a problémát úgy küszöböljük ki, hogy a Load eseményben egy nulla másodperc alatt lefutó FadeOut animációt hívunk meg. Nézzük is meg minként:

<script type="text/javascript" language="javascript">
 Sys.Application.initialize();
 
function Load()
{
    var anim_s = new AjaxControlToolkit.Animation.FadeAnimation( $get(‘btn_show’),0,25, AjaxControlToolkit.Animation.FadeEffect.FadeOut, 0, 0, true);
    anim_s.play();
 }

Először létrehozunk a kódban egy új FadeAnimation példányt, melyet az anim_s-ben mentünk el, majd pedig lejátsszuk az animációt a play metódus segítségével.
A FadeAnimation konstruktorában a következőket kell megadnunk:
Sys.UI.DomElement Target: a cél vezérlő, melyen végre szeretnénk hajtatni az animációt. Jelen esetben mi ezt a $get() függvény segítségével oldjuk meg, de később látni fogunk példát a document.getElementById() használatára is!
Number Duration: Az animáció hosssza másodpercben megadva. Alapértelmezés szerint ez mindenhol 1.
Number Fps: itt az fps (frames per second) számot kell megadnunk, ami alapból 25.
AjaxControlToolkit.Animation.FadeEffect Effect: A fade animáció típusát állítjuk be, a FadeEffect enumerátor segítségével, ami lehet FadeIn, illetve FadeOut (ez az alapértelmezett).
Number minimumOpacity: A láthatóság alsó küszöbe, a szokásos [0,1] intervallumban. (Vagyis pl.: FadeIn esetén az animáció végére ennek az értéknek a százszorosára állítja a láthatóságot százalékban.)
Number maximumOpacity: A láthatóság felső küszöbe.
Boolean ForceLayoutInIE: Ezzel egy IE hibát (ClearType-tal is kapcsolatos..) lehet „kikapcsolni” azáltal, hogy az értékét true-ra állítjuk (ez az alapértelmezett is). A többi böngészőnél ezt a paramétert nem veszi figyelembe a java script.

Most készítsük el a Hide függvényt! Először nézzük meg a kódot, majd utána a magyarázatot:

function Hide()
{
   var anim_img = new AjaxControlToolkit.Animation.FadeAnimation($get(‘img_target’),1, 25, AjaxControlToolkit.Animation.FadeEffect.FadeOut, 0.1, 1, true);
   anim_img.play();
  
   var anim_hide = new AjaxControlToolkit.Animation.FadeOutAnimation(document.getElementById(‘btn_hide’),0,25,0,1,true);
   anim_hide.play();
  
   var anim_show = new AjaxControlToolkit.Animation.FadeInAnimation(document.getElementById(‘btn_show’),0,25,0,1,true);
   anim_show.play();
  
   var anim_pnl = new AjaxControlToolkit.Animation.HideAction(document.getElementById(‘pnl_buttons’),0,25,false);
   anim_pnl.play();
 }

Amennyiben nem FadeAnimation példányt hozunk létre, hanem FadeInAnimation-t vagy FadeOutAnimation-t, akkor a konstruktorukban értelemszerűen nem kell megadni a Fade típusát. A többi paraméter természetesen megegyezik.
A másik dolog, amire felhívnám a figyelmet az az, hogy FireFox esetén, ha CSS-ből beállítjuk a Panel láthatóságát rejtettre, akkor a HME nem képes normálisan kezelni a visibility tulajdonságát, ezért ezt nekünk kézzel kell beállítani! Erre használjuk a HideAction-t. A konstruktorának utolsó paramétere bármennyire is logikusnak tűnne, hogy a rejtettségre vonatkozik, sajnos nem. A láthatóságra vonatkozik tehát, ha el akarjuk rejteni a panel-t, akkor false-ra kell állítanunk! 
Zárójelek között jegyzem meg, hogy ha például a kép köré keretet szeretnénk beállítani, hogy 0 láthatáság mellett is megtalálhassa a felhasználó a képet, akkor sajnos ez a tervünk nem fog beválni, mivel a border a képpel együtt el fog tűnni! (kivéve értelemszerűen, ha a kép köré egy div-vel tesszük a keretet!) 

A Show animáció a Hide-tól össszesen annyiban tér el, hogy ahol FadeOut volt ott FadeIn lesz, illetve fordítva!

És el is készültünk az alkalmazással, teszteljük! FireFox-os tesztelés során egy olyan érdekes „bug”-ot sikerült felfedeznem, hogy a popup vezérlő csak akkor hajlandó megjelenni, ha a kép mellett kattintunk egyet (tehát elveszíti a fókuszt), és utána visszamegyünk a kép fölé! (ezt minden hide, illetve show után el kell játszani!)
Sajnos annyira nem értek java-scripthez, hogy ezt a problémát tudjam orvosolni, ezért szívesen fogadnék erre szép megoldásokat!

Hogyan tegyük kényelmesebbé a fejlesztést?
Ebben a bekezdésben kifejezetten a java kódban történő fejlesztéshez szeretnék adni egy-két hasznos tanácsot. Mint már gondolom mindenki hallott róla, és a szerencsésebbek már rendelkeznek is vele, tavaly novemberben megjelent a Visual Studio legújabb verziója, a 2008-as. Ennek egy új feature-je a a java script kódbeli IntelliSence támogatás. Ez sokszor tényleg nagyos hasznos tud lenni, gondoljunk csak a paraméterlistákra!
Nos, ahhoz hogy az AjaxControlToolkit névteret el tudjuk érni java script-ből és megjelenjen az IntelliSence-ben is, az alábbi dolgokat kell elvégeznünk:
Kézzel kell megadnunk, mely js fájlokat töltse be a Visual Studio. Nekünk most az alábbi kettőre lesz mindeféleképpen szükségünk: MicrosoftAjax.js, illetve Animations.js (az első a MicrosoftAjaxLibrary része, míg a második a AjaxControlToolkit-é). Az alábbi módon regisztrálhatjuk be őket (header-ön belül):

<script src="Scripts/MicrosoftAjax.js" type="text/jscript" />
<script src="Scripts/Animations.js" type="text/jscript" />

Build-eljük a projektet és máris meg fog jelenni az IntelliSence-en belül is az AjaxControlToolkit névtér. Ne feledjük el kivenni ezt a két sort futtatáskor, mert különben java script error-t kapunk, hogy ezek a js-ek már be vannak töltve!
Régebben, amikor még nem volt teljesen kész az ACT, az alábbi pár js fájlt kellett importálnunk, hogy tudjuk használni például az animációkat (ha nem ajax enabled projektben szeretnénk használni, akkor is ezeket a js-eket kell betöltetni, kivéve az utolsót!):

– AnimationBehavior.js
– Animations.js
– BaseScripts.js
– Common.js
– MicrosoftAjax.js
– Timer.js
– Microsoft.Web.Preview.js

A MicrosftAjax illetve a Microsoft.Web.Preview kívül mind megtalálható az ACT csomagban (természetesen csak a SourceCode-os verziókban)!
/A devportal-ról letölthető példaalkalmazás Scripts mappába összegyűjtem a script fájlokat…/

Van egy másik fajta lehetőségünk is arra, hogy ezeket a js állományokat betöltsük, még pedig menedzselt kódból! Íme egy példa:

protected void Page_Load(object sender, EventArgs e)
{
    HtmlGenericControl mainAjaxScript = new HtmlGenericControl("script");
    mainAjaxScript.Attributes.Add("type", "text/javascipt");
    mainAjaxScript.Attributes.Add("src", "MicrosoftAjax.js");
    Page.Header.Controls.Add(mainAjaxScript);
}

Ezzel az egyetlen egy probléma az, hogy IntelliSence-ben nem fog megjelenni az Ajaxcontroltoolkit névtér. (ezért inkább csak alternatívaképpen mutattam a js regisztrálásra…)

 

Bill Gates + CES = Guitar Hero

Posted: 2008. január 8. in Egyéb
Az idei évet egy rendhagyó blogjegyzéssel kezdeném, amelynek témája mi más lehetne, mint az MS…

Nem tudom ki mennyire mozog otthonosan az elektronkiai/számítástechnikai kiállítások témakörben, ezért elmondom, hogy ezen a héten zajlik a CES (Consumer Electronics Show) kiállítás, amelyen Bill Gates egy érdekes bejelentést tett. Még pedig azt, hogy végelesen ott hagyja a Microsoft-ot, hogy hobbianak szentelje a további életét. Ez nem egy teljesen új keletű gondolat Bill Gates-től, hogy kiszáll a MS-ből, hiszen már 2 éve, nem Ő az MS fönöke (hanem Steve Ballmer). Gates bácsi, azzal hogy kiszáll a MS-ből, a pénze nagy részétől is megválik ( laza 55 milliárd dollártól), amelyet a családi alapítványnak (Bill and Melinda Gates Foundation) és pár kisebb-nagyobb alapítványnak oszt szét!

Mellesleg jegyzem meg, hogy Bill Gates 14 évig volt a világ gazdagabb embere! Ja és megemlíteném még azt is, hogy bár sokan a Vistát bukásként könyveltél el, (többen ezt Bill Gates-nek tulajdonítják, mivel nem Ő felügyelte), ettől függetlenül azért nem rég adták el a 100 milliómodik Vista licenset…
 
Végül de nem utolsó sorban megosztanék most veletek két videót is, melyek a CES-en készültek. Az elsőn Bill Gates (Kapuk Vilmos) a hobbiairól mutat egy viccesnek szánt videót, majd utána Guitar Hero-znak egyet egy másik MS taggal. (Guitar Hero egy XBOX-os játék…)
 
 

  

  

(Jövő hét elején egy szerintem eléggé érdekesre sikerült ACT-s cikkel fogom a devportalon kezdeni az évet, amelyet mindenkinek ajánlok a figyelmébe!)