BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











GridView w ASP.NET 2.0 cz.5

19-12-2005 11:05 | User 111549
Przykłady stosowania kontrolki GridView w ASP.NET 2.0 - Stronicowanie i sortowanie danych w kontrolce GridView. Tłumaczenie artykułu z MSDN - autor Scott Mitchell

Przykłady stosowania kontrolki GridView w ASP.NET 2.0
Stronicowanie i sortowanie danych w kontrolce GridView

Wyświetlając duże ilości danych często lepiej jest wyświetlać je porcjami, umożliwiając użytkownikowi przeglądanie danych na przykład po 10 rekordów na raz. Użytkownicy strony będą jeszcze bardziej zadowoleni, jeśli umożliwimy sortowanie danych według poszczególnych kolumn. W ASP.NET 1.x możliwe było utworzenie stronicowanej, dwukierunkowo sortowanej kontrolki DataGrid, jednak wymagało to utworzenia dwóch funkcji obsługi zdarzeń i napisania przynajmniej pół tuzina linii kodu. W ASP.NET stronicowaną, sortowaną w dwu kierunkach kontrolkę DataGrid można utworzyć nie pisząc ani jednej linii kodu!

Uwaga — sortowana dwukierunkowo kontrolka DataGrid umożliwia sortowanie danych w porządku malejącym oraz rosnącym. Gdy w kontrolce GridView ustawimy możliwość sortowania, nagłówki kolumn kontrolki wyświetlane będą jako odnośniki. Gdy odnośnik zostanie kliknięty po raz pierwszy, dane zostaną posortowane w porządku rosnącym. Ponowne kliknięcie odnośnika spowoduje posortowanie danych w porządku malejącym.

Podobnie jak miało to miejsce przy wyświetlaniu danych szczegółowych i ogólnych, przy tworzeniu stronicowanej i sortowanej kontrolki GridView, której dane pochodzą ze źródła ObjectDataSource, warstwa dostępu do danych musi zawierać metody przyjmujące parametry wejściowe określające, w jaki sposób należy sortować dane oraz określające szczegóły stronicowania. Dlatego przyjrzymy się dwóm grupom przykładów stronicowania i sortowania — w jednej dane będą pobierane bezpośrednio z bazy danych przy użyciu kontrolki SqlDataSource, a w drugiej dane będą pobierane z warstwy dostępu do danych (DAL) przy użyciu kontrolki ObjectDataSource.

W ASP.NET 1.x kontrolka DataGrid posiada dwa tryby stronicowania danych — domyślny i niestandardowy. W przypadku obydwu trybów stronicowania, programista tworzący stronę musi określić liczbę rekordów wyświetlanych na stronie oraz indeks pierwszego elementu, który ma być na danej stronie wyświetlony. W domyślnym stronicowaniu za każdym razem przeglądane były wszystkie dane przypisane we właściwości DataSource kontrolki DataGrid. Następnie wybierany był podzbiór rekordów do wyświetlenia, a pozostała część danych była odrzucana. Domyślne stronicowanie można było zaimplementować w bardzo prosty sposób, jednak związana z tym była duża strata wydajności — z bazy danych za każdym razem były zwracane wszystkie rekordy. Gdy w kontrolce DataGrid na jednej stronie miało być wyświetlonych 10 rekordów z 1000, to przy każdym żądaniu wyświetlenia strony, z bazy danych było zwracanych 1000 rekordów, a na stronie było wyświetlanych tylko odpowiednich 10.

Problem ten nie występował w stronicowaniu niestandardowym — programista musiał podać liczbę wszystkich przeglądanych rekordów i zwrócić właściwy podzbiór rekordów do wyświetlenia na stronie. Przy stronicowaniu niestandardowym, nawet jeśli liczba wszystkich rekordów do przejrzenia wynosiła 1000, ale na jednej stronie miało być wyświetlonych 10 rekordów, to z bazy danych przy każdym wyświetleniu strony było pobieranych tylko 10 właściwych rekordów. Niestandardowe stronicowanie cechowało się lepszą wydajnością, jednak wymagało od programisty większego wysiłku i napisania większej ilości kodu.

Kontrolka GridView w ASP.NET 2.0 obsługuje obydwa typy stronicowania, jednak nie posiada właściwości AllowCustomPaging, dostępnej w kontrolce DataGrid w ASP.NET 1.x. W kolejnych dwóch podrozdziałach dowiemy się, w jaki sposób można zdefiniować tryb stronicowania w kontrolce GridView połączonej ze źródłem danych SqlDataSource lub ObjectDataSource.

Stronicowanie i sortowanie danych pobieranych ze źródła SqlDataSource

Ustawienie w ASP.NET 2.0 w kontrolce GridView stronicowania i sortowania danych, pochodzących ze źródła SqlDataSource, to drobnostka. Tak jak we wcześniejszych przykładach, najpierw należy do strony dodać źródło danych SqlDataSource, które będzie z bazy danych pobierać odpowiednie dane. Następnie dodajemy kontrolkę GridView. W inteligentnym tagu, wyświetlanym przy kontrolce GridView, widoczne są dwa pola wyboru opisane Enable Paging oraz Enable Sorting. Aby włączyć stronicowanie, należy zaznaczyć pierwsze z nich; włączenie sortowania wymaga zaznaczenia drugiego pola (ilustracja 21).

Uwaga — źródło SqlDataSource posiada właściwość DataSourceMode, dzięki której można określić, czy źródło SqlDataSource zwraca obiekt DataReader czy DataSet (domyślnie). Stronicowana kontrolka GridView wymaga, by źródło zwracało obiekt typu DataSet. Sortowanie w kontrolce GridView działa poprawnie zarówno z obiektami typu DataSet, jak i DataReader. Jeśli jednak sortujemy dane przekazywane za pośrednictwem obiektu DataReader, to dane z bazy muszą być pobierane przy użyciu procedury przechowywanej. Procedura ta musi przyjmować parametr określający porządek sortowania. Nazwę parametru wejściowego należy zdefiniować we właściwości SortParameterName źródła SqlDataSource.

rys21.JPG

Ilustracja 21.

Kod strony ASP.NET widoczny jest poniżej. Jak widać w przykładzie, do utworzenia stronicowanej, dwukierunkowo sortowanej kontrolki GridView nie jest potrzebna ani jedna linia kodu źródłowego.

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:SqlDataSource ID="productDataSource" Runat="server"

         SelectCommand="SELECT [ProductName], [UnitPrice],

         [UnitsInStock], [QuantityPerUnit] FROM [Products]"

            ConnectionString=

            "<%$ ConnectionStrings:NWConnectionString %>">

        </asp:SqlDataSource>

        <asp:GridView ID=" productsGridView" Runat="server"

         DataSourceID="productDataSource" AutoGenerateColumns="False"

            AllowSorting="True" BorderWidth="2px" BackColor="White"

            GridLines="None" CellPadding="3"

            CellSpacing="1" BorderStyle="Ridge" BorderColor="White"

            AllowPaging="True">

            <FooterStyle ForeColor="Black"

               BackColor="#C6C3C6"></FooterStyle>

            <PagerStyle ForeColor="Black" HorizontalAlign="Right"

               BackColor="#C6C3C6"></PagerStyle>

            <HeaderStyle ForeColor="#E7E7FF" Font-Bold="True"

               BackColor="#4A3C8C"></HeaderStyle>

            <Columns>

                <asp:BoundField HeaderText="Product"

                  DataField="ProductName" SortExpression="ProductName">

                </asp:BoundField>

                <asp:BoundField HeaderText="Unit Price"

                  DataField="UnitPrice" SortExpression="UnitPrice"

                    DataFormatString="{0:c}">

                    <ItemStyle HorizontalAlign="Right"></ItemStyle>

                </asp:BoundField>

                <asp:BoundField HeaderText="Units In Stock"

                  DataField="UnitsInStock"

                  SortExpression="UnitsInStock"

                    DataFormatString="{0:d}">

                    <ItemStyle HorizontalAlign="Right"></ItemStyle>

                </asp:BoundField>

                <asp:BoundField HeaderText="Quantity Per Unit"

                  DataField="QuantityPerUnit"></asp:BoundField>

            </Columns>

            <SelectedRowStyle ForeColor="White" Font-Bold="True"

                 BackColor="#9471DE"></SelectedRowStyle>

            <RowStyle ForeColor="Black" BackColor="#DEDFDE"></RowStyle>

        </asp:GridView>

        <i>You are viewing page

        <%=productsGridView.PageIndex + 1%>

        of

        <%=productsGridView.PageCount%>

        </i>

    </div>

    </form>

</body>

</html>

Na ilustracjach 22, 23 i 24 pokazano działanie stronicowanej, sortowanej w dwu kierunkach kontrolki GridView. Ilustracja 22 przedstawia pierwszą stronę danych uporządkowanych rosnąco według kolumny „Product Name”. Na ilustracji 23 widoczna jest pierwsza strona danych uporządkowanych także według kolumny „Product Name”, ale w porządku malejącym. Natomiast na ilustracji 24 przedstawiono 4 stronę danych uporządkowanych według kolumny „Unit Price” w porządku rosnącym.

Kolumna „Quantity Per Unit” wyróżnia się spośród pozostałych kolumn, ponieważ jej nagłówek nie jest odnośnikiem. Oznacza to, że danych nie można posortować według kolumny „Quantity Per Unit”. Sortowanie według danej kolumny można włączyć poprzez określenie wartości dla właściwości SortExpression tej kolumny. W zamieszczonym wyżej kodzie strony ASP.NET, w ostatnim elemencie typu BoundField (kolumna „Quantity Per Unit”), atrybut SortExpression nie jest zdefiniowany, a jest on obecny we wszystkich pozostałych obiektach BoundField.

rys22.JPG

Ilustracja 22.

rys23.JPG

Ilustracja 23.

rys24.JPG

Ilustracja 24.

Pod kontrolką GridView widoczny jest tekst, informujący użytkownika o tym, którą stronę danych aktualnie ogląda oraz informacja o całkowitej liczbie stron. Kontrolka GridView udostępnia także indeksowaną od zera właściwość PageIndex, której wartość to numer wyświetlanej aktualnie strony danych, oraz właściwość PageCount, informującej o całkowitej liczbie dostępnych stron danych. Aby wyświetlić te zapisane po stronie serwera wartości właściwości, odwołania do nich wystarczy umieścić pomiędzy ogranicznikami <%=…%>.

<i>You are viewing page

<%=productsGridView.PageIndex + 1%>

of

<%=productsGridView.PageCount%>

</i>

Wadą stosowania obiektu SqlDataSource jako źródła danych dla stronicowanej kontrolki GridView jest to, że wykorzystywany jest wtedy domyślny tryb stronicowania. Czyli przy każdym żądaniu strony, kontrolka SqlDataSource zwraca wszystkie rekordy, które mają być przeglądane. Dopiero kontrolka GridView wybiera odpowiedni podzbiór rekordów, bazując na danych takich jak liczba rekordów wyświetlanych na stronie i numer strony. Aby móc zaimplementować niestandardowy tryb stronicowania, trzeba zastosować źródło ObjectDataSource.

Stronicowanie i sortowanie danych pobieranych ze źródła ObjectDataSource

Z punktu widzenia programisty ASP.NET utworzenie stronicowanej, dwukierunkowo sortowanej kontrolki GridView podłączonej do źródła danych ObjectDataSource odbywa się prawie tak samo, jak tworzenie kontrolki podłączonej do źródła SqlDataSource. Źródło ObjectDataSource umożliwia stosowania zarówno domyślnego, jak i niestandardowego trybu stronicowania. Jeśli źródło ObjectDataSource zwraca wszystkie dane, użyty zostanie domyślny tryb stronicowania. Aby wykorzystać tryb niestandardowy, należy zwrócić wyłącznie odpowiedni podzbiór rekordów oraz określić całkowitą liczbę wszystkich przeglądanych rekordów. Korzystanie z niestandardowego trybu stronicowania omówimy za chwilę, najpierw zajmijmy się przykładem domyślnego stronicowania danych pochodzących z kontrolki ObjectDataSource.

Aby obsłużyć stronicowanie i sortowanie, klasy warstwy dostępu do danych muszą zawierać dodatkową funkcjonalność. W przypadku stronicowanej kontrolki GridView, pobierającej dane ze źródła ObjectDataSource, metoda SELECT klasy DAL musi przyjmować dwa parametry wejściowe będące liczbami całkowitymi. Pierwsza liczba określa maksymalną liczbę rekordów, jaką może zwrócić metoda, a druga określa indeks pierwszego zwracanego rekordu. Poniżej znajduje się rozbudowana wersja klasy ProductDAL, zawierająca przeciążoną metodę GetProducts() umożliwiającą stronicowanie danych. Oryginalna wersja metody, nieprzyjmująca parametrów wejściowych, po prostu zwraca wynik nowej, przeciążonej metody, wywołanej z dwoma odpowiednimi parametrami.

Klasa ProductDAL (Visual Basic)

Imports Microsoft.VisualBasic

Imports System.Configuration

Imports System.Data

Imports System.Data.SqlClient

Imports System.Collections.Generic

Public Class ProductDAL

    Public Shared Function GetProducts() As List(Of Product)

        ' zwraca listę obiektów typu Product, utworzonych na podstawie

        ' danych w tabeli Products bazy Northwind.

        Return GetProducts(Integer.MaxValue, 0)

    End Function

    Public Shared Function GetProducts(ByVal maximumRows As Integer, _

      ByVal startRowIndex As Integer) As List(Of Product)

        ' zwraca listę obiektów typu Product, utworzonych na podstawie

        ' danych w tabeli Products bazy Northwind.

        Dim sql As String = "SELECT ProductID, ProductName, " & _

          QuantityPerUnit, UnitPrice, UnitsInStock FROM Products"

        Using myConnection As New _

          SqlConnection(ConfigurationManager.ConnectionStrings( _

         "NWConnectionString").ConnectionString)

            ' Umieść dane w obiekcie DataTable

            Dim myCommand As New SqlCommand(sql, myConnection)

            Dim myAdapter As New SqlDataAdapter(myCommand)

            myConnection.Open()

            Dim dt As New DataTable

            myAdapter.Fill(dt)

            Dim results As New List(Of Product)()

            Dim currentIndex As Integer = startRowIndex

            Dim itemsRead As Integer = 0

            Dim totalRecords As Integer = dt.Rows.Count

            While itemsRead < maximumRows AndAlso _

              currentIndex < totalRecords

                Dim product As New Product()

                product.ProductID = _

                 Convert.ToInt32(dt.Rows(currentIndex)("ProductID"))

                product.ProductName = _

                 dt.Rows(currentIndex)("ProductName").ToString()

                product.QuantityPerUnit = _

                 dt.Rows(currentIndex)("QuantityPerUnit").ToString()

                If dt.Rows(currentIndex) _

                  ("UnitPrice").Equals(DBNull.Value) Then

                    product.UnitPrice = 0

                Else

                    product.UnitPrice = _

                 Convert.ToDecimal(dt.Rows(currentIndex)("UnitPrice"))

                End If

                If dt.Rows(currentIndex) _

                 ("UnitsInStock").Equals(DBNull.Value) Then

                    product.UnitsInStock = 0

                Else

                    product.UnitsInStock = _

                Convert.ToInt32(dt.Rows(currentIndex)("UnitsInStock"))

                End If

                results.Add(product)

                itemsRead += 1

                currentIndex += 1

            End While

            myConnection.Close()

            Return results

        End Using

    End Function   

End Class

Klasa ProductDAL (C#)

using System;

using System.Configuration;

using System.Data;

using System.Data.SqlClient;

using System.Collections.Generic;

/// <summary>

/// Summary description for ProductDAL

/// </summary>

public class ProductDAL

{

    public static List<Product> GetProducts()

    {

        return GetProducts(int.MaxValue, 0);

    }

    public static List<Product> GetProducts(int maximumRows,

      int startRowIndex)

    {

        // zwraca listę obiektów typu Product, utworzonych na podstawie

        // danych w tabeli Products bazy Northwind.

        string sql = @"SELECT ProductID, ProductName, QuantityPerUnit,

          UnitPrice, UnitsInStock

          FROM Products";

        using (SqlConnection myConnection = new

          SqlConnection(ConfigurationManager.ConnectionStrings[

          "NWConnectionString"].ConnectionString))

        {

            // Umieść dane w obiekcie DataTable

            SqlCommand myCommand = new SqlCommand(sql, myConnection);

            SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand);

            myConnection.Open();

            DataTable dt = new DataTable();

            myAdapter.Fill(dt);

            List<Product> results = new List<Product>();

            int currentIndex = startRowIndex;

            int itemsRead = 0;

            int totalRecords = dt.Rows.Count;

            while (itemsRead < maximumRows &&

             currentIndex < totalRecords)

            {

                Product product = new Product();

                product.ProductID =

                  Convert.ToInt32(dt.Rows[currentIndex]["ProductID"]);

                product.ProductName =

                  dt.Rows[currentIndex]["ProductName"].ToString();

                product.QuantityPerUnit =

                  dt.Rows[currentIndex]["QuantityPerUnit"].ToString();

                if (dt.Rows[currentIndex]

                 ["UnitPrice"].Equals(DBNull.Value))

                    product.UnitPrice = 0;

                else

                    product.UnitPrice =

                 Convert.ToDecimal(dt.Rows[currentIndex]["UnitPrice"]);

                if (dt.Rows[currentIndex]

                  ["UnitsInStock"].Equals(DBNull.Value))

                    product.UnitsInStock = 0;

                else

                    product.UnitsInStock =

                Convert.ToInt32(dt.Rows[currentIndex]["UnitsInStock"]);

                results.Add(product);

                itemsRead++;

                currentIndex++;

            }

            myConnection.Close();

            return results;

        }

    }   

}

Logika metody GetProducts(maximumRows, startRowIndex), zwracającej odpowiedni podzbiór produktów, nie jest zaawansowana — metoda pobiera wszystkie produkty z bazy danych i wybiera z nich prawidłową listę List instancji klasy Product. Metodę tę można porównać z domyślnym stronicowaniem, ponieważ z magazynu danych pobierane są wszystkie przeglądane rekordy, nawet jeśli wyświetlony ma być tylko mały podzbiór wszystkich pobranych rekordów.

Uwaga — rozsądniej byłoby zastosować buforowanie lub pobierać z bazy danych tylko właściwy podzbiór rekordów (więcej informacji na ten temat można znaleźć w 2. wskazówce Roba Howarda w artykule 10 wskazówek dotyczących pisania wysokowydajnych aplikacji internetowych). Aby uzyskać niestandardowe stronicowanie korzystając z kontrolki źródła danych ObjectDataSource, potrzebna jest metoda zwracająca liczbę wszystkich przeglądanych rekordów. Metoda ta nie przyjmuje żadnych parametrów wejściowych i powinna zwracać liczbę całkowitą (typ integer). Metoda ta jest wywoływana przez kontrolkę GridView, aby ustalić jak wiele rekordów jest przeglądanych. Informacja ta jest wykorzystywana przy wyświetlaniu stronicowanej kontrolki i musi być jawnie zdefiniowana w kontrolce ObjectDataSource — całkowita liczba rekordów nie może być ustalana na podstawie danych, ponieważ kontrolka źródła zwraca wyłącznie konkretny podzbiór danych do wyświetlenia.

Aby możliwe było włączenie sortowania w kontrolce GridView korzystającej ze źródła danych ObjectDataSource, metoda wykonująca zapytanie SELECT odpowiedniej klasy DAL musi przyjmować parametr wejściowy określający porządek sortowania. W tym celu utworzyłem kolejne dwie przeciążone metody GetProducts(): GetProducts(SortExpression) — zwracającą wszystkie rekordy uporządkowane zgodnie z parametrem wejściowym oraz GetProducts(maximumRows, startRowIndex, SortExpression) — zwracającą wskazany podzbiór odpowiednio uporządkowanych rekordów.

Klasa ProductDAL (Visual Basic)

Public Class ProductDAL

    Public Shared Function GetProducts() As List(Of Product)

        ' zwraca listę obiektów typu Product, utworzonych na podstawie

        ' danych w tabeli Products bazy Northwind.

        Return GetProducts(Integer.MaxValue, 0, String.Empty)

    End Function

    Public Shared Function GetProducts(ByVal maximumRows As Integer, _

      ByVal startRowIndex As Integer) As List(Of Product)

        ' zwraca listę obiektów typu Product, utworzonych na podstawie

        ' danych w tabeli Products bazy Northwind.

        Return GetProducts(maximumRows, startRowIndex, String.Empty)

    End Function

    Public Shared Function GetProducts(ByVal SortExpression As String) _

      As List(Of Product)

        Return GetProducts(Integer.MaxValue, 0, SortExpression)

    End Function

    Public Shared Function GetProducts(ByVal maximumRows As Integer, _

      ByVal startRowIndex As Integer, _

      ByVal SortExpression As String) As List(Of Product)

        ' zwraca listę obiektów typu Product, utworzonych na podstawie

        ' danych w tabeli Products bazy Northwind

        ' zwraca odpowiedni podzbiór danych,

        ' posortowany według wskazanego pola

        Dim sql As String = "SELECT ProductID, ProductName, " & _

          "QuantityPerUnit, UnitPrice, UnitsInStock FROM Products"

        If SortExpression <> String.Empty Then sql &= _

          " ORDER BY " & SortExpression

        ' pozostała część kodu jest identyczna z kodem

        ' przedstawionej wcześniej metody

        ' GetProducts(maximumRows, startRowIndex)

    End Function

End Class

Klasa ProductDAL (C#)

public class ProductDAL

{

    public static List<Product> GetProducts()

    {

        return GetProducts(int.MaxValue, 0, string.Empty);

    }

    public static List<Product> GetProducts(int maximumRows,

      int startRowIndex)

    {

        return GetProducts(maximumRows, startRowIndex, string.Empty);

    }

    public static List<Product> GetProducts(string SortExpression)

    {

        return GetProducts(int.MaxValue, 0, SortExpression);

    }

    public static List<Product> GetProducts(int maximumRows,

      int startRowIndex, string SortExpression)

    {

        // zwraca listę obiektów typu Product, utworzonych na podstawie

        // danych w tabeli Products bazy Northwind

        string sql = @"SELECT ProductID, ProductName,

          QuantityPerUnit, UnitPrice, UnitsInStock

                        FROM Products";

        if (SortExpression != string.Empty)

            sql += " ORDER BY " + SortExpression;

        // pozostała część kodu jest identyczna z kodem

        // przedstawionej wcześniej metody

        // GetProducts(maximumRows, startRowIndex)

    }

}

Aby dane były prawidłowo stronicowane na stronie ASP.NET, źródło danych ObjectDataSource wymaga dodatkowej konfiguracji:

  • EnablePaging — właściwości tej należy przypisać wartość True;
  • MaximumRowsParameterName — we właściwości tej zapisywana jest nazwa pierwszego parametru typu int metody stronicującej wyniki. Wartość domyślna tej właściwości wynosi maximumRows. Jeśli w metodach użyjemy innej nazwy parametru niż maximumRows, musimy tę nazwę zdefiniować w tej właściwości;
  • StartRowIndexParameterName — właściwość podobna do MaximumRowsParameterName; zapisywana jest w niej nazwa drugiego całkowitoliczbowego parametru metody stronicującej. Wartość domyślna tej właściwości to startRowIndex, dlatego wartość tej właściwości musimy jawnie definiować tylko wtedy, gdy w kodzie używamy innej nazwy dla tego parametru;
  • SelectCountMethod — nazwa metody zwracającej liczbę wszystkich przeglądanych rekordów (w moim przykładzie metodę tę nazwałem TotalNumberOfProducts).

Natomiast by sortowanie działało poprawnie, należy ustawić odpowiednią wartość dla właściwości:

  • SortParameterName — nazwa parametru typu string, określającego sposób sortowania danych. W moim przykładzie parametr ten ma wartość SortExpression.

W zamieszczonym poniżej kodzie strony ASP.NET dokładnie widać, jak wszystko jest ze sobą powiązane. Utworzenie stronicowanej, sortowanej w dwu kierunkach kontrolki GridView, korzystającej ze źródła ObjectDataSource — tak samo jak utworzenie takiej kontrolki korzystającej ze źródła SqlDataSource — nie wymaga pisania dodatkowego kodu w stronie ASP.NET. Główna różnica pomiędzy tymi dwoma przykładami polega na zastosowaniu różnych kontrolek źródła danych (SqlDataSource konta ObjectDataSource) oraz konieczności ustawienia właściwości stronicowania i sortowania w przypadku zastosowania źródła ObjectDataSource.

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"

  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <asp:ObjectDataSource ID="productsDataSource"

          Runat="server" TypeName="ProductDAL"

          SortParameterName="SortExpression"

            SelectMethod="GetProducts" EnablePaging="True"

            SelectCountMethod="TotalNumberOfProducts">

        </asp:ObjectDataSource>

        <asp:GridView ID="productsGridView" AllowPaging="True"

         BorderColor="White" BorderStyle="Ridge"

            CellSpacing="1" CellPadding="3" GridLines="None"

            BackColor="White" BorderWidth="2px"

            AutoGenerateColumns="False"

            DataSourceID="productsDataSource"

            Runat="server" AllowSorting="True">

            <FooterStyle ForeColor="Black" BackColor="#C6C3C6"></FooterStyle>

            <PagerStyle ForeColor="Black" HorizontalAlign="Right"

             BackColor="#C6C3C6"></PagerStyle>

            <HeaderStyle ForeColor="#E7E7FF" Font-Bold="True"

             BackColor="#4A3C8C"></HeaderStyle>

            <Columns>

                <asp:BoundField HeaderText="Product"

                  DataField="ProductName"

                  SortExpression="ProductName"></asp:BoundField>

                <asp:BoundField HeaderText="Unit Price"

                  DataField="UnitPrice" SortExpression="UnitPrice"

                    DataFormatString="{0:c}">

                    <ItemStyle HorizontalAlign="Right"></ItemStyle>

                </asp:BoundField>

                <asp:BoundField HeaderText="Units In Stock"

                    DataField="UnitsInStock"

                    SortExpression="UnitsInStock"

                    DataFormatString="{0:d}">

                    <ItemStyle HorizontalAlign="Right"></ItemStyle>

                </asp:BoundField>

                <asp:BoundField HeaderText="Quantity Per Unit"

                   DataField="QuantityPerUnit"></asp:BoundField>

            </Columns>

            <SelectedRowStyle ForeColor="White"

               Font-Bold="True"

               BackColor="#9471DE"></SelectedRowStyle>

            <RowStyle ForeColor="Black" BackColor="#DEDFDE"></RowStyle>

        </asp:GridView>

        <i>You are viewing page

        <%=productsGridView.PageIndex + 1%>

        of

        <%=productsGridView.PageCount%>

        </i>

   

    </div>

    </form>

</body>

</html>

Wynik jest identyczny jak we wcześniejszym przykładzie. Zrzuty ekranowe, przedstawiające stronicowaną, sortowaną dwukierunkowo kontrolkę GridView, widoczne są na ilustracjach 22, 23 i 24.

Następna część: Wyświetlanie obrazów w kolumnie kontrolki GridView

 

tagi: ASP.NET

Komentarze 0

pkt.

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.