Érték szerinti csoportosítás ListView vezérlővel

Gyakran van szükség arra, hogy a ListView vezérlőben megjelenő rekordokat valamilyen szempont szerint csoportosítsuk. A ListView támogat is csoportosítást, azonban ez a funkció csak arra jó (?), hogy megadott számú elemet tegyünk egy csoportba, azt sajnos nem támogatja, hogy megadott érték szerint csoportosítsuk a rekordokat. Persze hagyományos módon meg lehet oldani ezt is.

Ezt tudja a ListView csoportosítás címén: a LayoutTemplate-et GroupTemplate-ekkel tölti fel, közéjük pedig GroupSeparatorTemplate-et rak. Minden egyes GroupTemplate-be a GroupItemCount tulajdonságban megadott számú ItemTemplate kerül. Ha egy csoportban (tipikusan az utolsóban) nincs elég elem, akkor azokat a helyeket EmptyItemTemplate-tel tölti fel. Ez szerintem arra van kitalálva, hogy az ember táblázatba rendezze a rekordokat, ott számít ugyanis, hogy minden sorba ugyanannyi elem kerüljön.

De mi van akkor, ha nem darabszám, hanem érték szerint akarjuk csoportosítani a sorokat? Ez esetben kénytelenek leszünk lemondani a beépített csoportosításról és az ASP.NET 1.0-ban megszokott módon megoldani a feladatot.

Először is rendezzük a csoportképző mező szerint az adatokat, például ha a Northwind adatbázis Customer táblájának sorait ország szerint csoportosítva, azon belül pedig cégnév szerint rendezve akarjuk megjeleníteni, akkor így:

  SELECT CompanyName, ContactName, Country FROM Customers ORDER BY Country, CompanyName

Az eredmény (részlete):

Northwind Customers ország szerint

Már csak annyi dolgunk maradt, hogy a Country mezőváltozásai esetén kell megjelenítenünk egy csoportfejlécet. A trükk az, hogy nem használjuk a beépített csoportosítást, hanem (például) egy sima h2 elemre rácuppanunk szerver oldalon (runat=server), majd a Visible tulajdonságát egy szerver oldali metódussal állítjuk be:

    <asp:ListView runat="server" DataSourceID="sdsCustomers">
        <LayoutTemplate>
            <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
        </LayoutTemplate>
        
        <ItemTemplate>
            <h2 runat="server" visible='<%# IsGroupHeaderVisible( Eval( "Country" ) ) %>'>
                <%# Eval( "Country" ) %>
            </h2>
        
            <%# Eval( "CompanyName" ) %>
            -
            <%# Eval( "ContactName" ) %>
        </ItemTemplate>
        
        <ItemSeparatorTemplate>
            <br />
        </ItemSeparatorTemplate>            
    </asp:ListView>

Ezek után a code behindban kell egy privát mező az előző érték tárolására és a függvény, ami az aktuális értéket összehasonlítja az előzővel:

  private string _lastValue;

  protected bool IsGroupHeaderVisible( object value )
  {
    string currentValue = value.ToString();

    if( currentValue.Equals( this._lastValue, StringComparison.OrdinalIgnoreCase ) )
    {
        return false;
    }
    else
    {
        this._lastValue = currentValue;
        return true;
    }
  }

Az eredmény pedig:

Northwind Customers ország szerint ListView-val

Látható, hogy az egész azon alapul, hogy a rekordok jó sorrendben legyenek, de egyébként teljesen a mi kezünkben van az irányítás, olyan szempont szerint csoportosítunk, ahogy kedvünk tartja.

A cikkhez tartozó forráskód letölthető itt.


zip ListViewGroupingSample.zip (4 kB)


Balássy György (MS RD, ASP.NET MVP, MCTS)

Balássy György (MS RD, ASP.NET MVP, MCTS) Villamosmérnök, a BME Automatizálási és Alkalmazott Informatikai Tanszékén webportálok fejlesztését oktatja. 2000 óta foglalkozik a Microsoft .NET platformjával, melynek meghonosításában jelentős szerepet vállalt előadóként, konzulensként és A .NET Framework és programozása című könyv társszerzőjeként. Az MSDN Kompetencia Központon belül a Portál Technológiák Csoport vezetője, szakterülete web alapú rendszerek fejlesztése és üzemeltetése. 2004-ben Magyarországon elsőként kapta meg a Most Valuable Professional címet, majd 2005 óta a Microsoft magyarországi regionális igazgatója. Publikációi a Technet Magazinban, az MSDN Kompetencia Központ honlapján és szakmai blogjában olvashatóak.

2009.07.03. 7:37:52 | Permalink | Hozzászólások: 0 | Tárgyszavak: ,


  • AJAX JavaScriptek összefűzése

    Gincsai Gábor Talán kevesen tudják, hogy az AJAXos JavaSriptek összefűzésésére nem csak az ASP.NET 4.0 lesz képes, hanem már jelenleg is, van beépített támogatás rá. Egészen pontosan az ASP.NET 3.5 SP1 óta létezik ez a megoldás. Tovább »
  • Unable to cast

    Dávid Zoltán Szomorú, de igaz, néha a stack trace és a részletes magyarázat is kevés a hiba megértéséhez. Tovább »


Írja meg Ön is véleményét!


Hozzászólásokat csak regisztrált, bejelentkezett felhasználóktól tudunk elfogadni!

Hozzászólások