DataList veya Repeater Denetiminde Verileri Sıralama (VB)

tarafından Scott Mitchell

PDF’yi İndir

Bu öğreticide DataList ve Repeater'a sıralama desteğinin yanı sıra verileri sayfalandırılıp sıralanabilir bir DataList veya Repeater oluşturma işlemini inceleyeceğiz.

Giriş

Önceki öğreticide DataList'e disk belleği desteği eklemeyi inceledik. sınıfında (GetProductsAsPagedDataSource) bir nesne döndüren yeni bir PagedDataSource yöntem ProductsBLL oluşturduk. DataList veya Repeater'a bağlıyken DataList veya Repeater yalnızca istenen veri sayfasını görüntüler. Bu teknik, yerleşik varsayılan disk belleği işlevlerini sağlamak için GridView, DetailsView ve FormView denetimleri tarafından dahili olarak kullanılana benzer.

GridView, disk belleği desteği sunmanın yanı sıra hazır sıralama desteği de içerir. DataList veya Repeater yerleşik sıralama işlevi sağlamaz; ancak sıralama özellikleri biraz kodla eklenebilir. Bu öğreticide DataList ve Repeater'a sıralama desteğinin yanı sıra verileri sayfalandırılıp sıralanabilir bir DataList veya Repeater oluşturma işlemini inceleyeceğiz.

Sıralama İncelemesi

Rapor Verilerini Sayfalama ve Sıralama öğreticisinde gördüğümüz gibi, GridView denetimi kullanıma hazır sıralama desteği sağlar. Her GridView alanı, verilerin hangi veri alanına göre sıralanacağını gösteren ilişkili SortExpressionbir öğesine sahip olabilir. GridView özelliği AllowSorting olarak trueayarlandığında, özellik SortExpression değerine sahip her GridView alanının üst bilgisi LinkButton olarak işlenir. Kullanıcı belirli bir GridView alanının üst bilgisine tıkladığında bir geri gönderme gerçekleşir ve veriler tıklanan alanın değerine SortExpressiongöre sıralanır.

GridView denetiminin, verilerin sıralandığı GridView alanının depolandığı SortExpression bir SortExpression özelliği de vardır. Ayrıca, bir SortDirection özellik verilerin artan veya azalan düzende sıralanıp sıralanmayacağını gösterir (kullanıcı belirli bir GridView alanının üst bilgi bağlantısına art arda iki kez tıklarsa sıralama düzeni değiştirilir).

GridView veri kaynağı denetimine bağlı olduğunda ve SortDirection özelliklerini veri kaynağı denetimine devrederSortExpression. Veri kaynağı denetimi verileri alır ve sağlanan SortExpression ve SortDirection özelliklere göre sıralar. Verileri sıraladıktan sonra, veri kaynağı denetimi gridview'a döndürür.

Bu işlevi DataList veya Repeater denetimleriyle çoğaltmak için şunları yapmamız gerekir:

  • Sıralama arabirimi oluşturma
  • Sıralama ölçütü olarak ve artan veya azalan düzende sıralanacak veri alanını unutmayın
  • ObjectDataSource'a verileri belirli bir veri alanına göre sıralamasını yönerge verme

Bu üç görevi 3. ve 4. adımlarda ele alacağız. Bundan sonra, DataList veya Repeater'a hem disk belleği hem de sıralama desteği eklemeyi inceleyeceğiz.

2. Adım: Ürünleri Yineleyicide Görüntüleme

Sıralamayla ilgili işlevlerden herhangi birini uygulama konusunda endişelenmeden önce ürünleri Repeater denetiminde listeleyerek başlayalım. Klasördeki PagingSortingDataListRepeater sayfayı Sorting.aspx açarak başlayın. Web sayfasına bir Repeater denetimi ekleyerek özelliğini olarak SortableProductsayarlayınID. Repeater'ın akıllı etiketinden adlı ProductsDataSource yeni bir ObjectDataSource oluşturun ve sınıfın ProductsBLLGetProducts() yönteminden veri alacak şekilde yapılandırın. INSERT, UPDATE ve DELETE sekmelerindeki açılan listelerden (Hiçbiri) seçeneğini belirleyin.

ObjectDataSource Oluşturma ve GetProductsAsPagedDataSource() Yöntemini Kullanacak Şekilde Yapılandırma

Şekil 1: ObjectDataSource Oluşturma ve Yöntemi Kullanacak GetProductsAsPagedDataSource() Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

UPDATE, INSERT ve DELETE sekmelerindeki Drop-Down Listeler (Yok) olarak ayarlayın

Şekil 2: UPDATE, INSERT ve DELETE sekmelerindeki Drop-Down Listeler (Yok) olarak ayarlayın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DataList'in aksine, Visual Studio bir veri kaynağına bağlandıktan sonra Repeater denetimi için otomatik olarak bir oluşturmaz ItemTemplate . Ayrıca, Repeater denetiminin akıllı etiketinde DataList'lerde bulunan Şablonları Düzenle seçeneği bulunmadığından bunu bildirim temelli olarak eklemeliyiz ItemTemplate . Önceki öğreticide ürünün adını, tedarikçisini ve kategorisini görüntüleyen aynısını ItemTemplate kullanalım.

eklendikten ItemTemplatesonra Repeater ve ObjectDataSource bildirim temelli işaretleme aşağıdakine benzer görünmelidir:

<asp:Repeater ID="SortableProducts" DataSourceID="ProductsDataSource"
    EnableViewState="False" runat="server">
    <ItemTemplate>
        <h4><asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Eval("ProductName") %>'></asp:Label></h4>
        Category:
        <asp:Label ID="CategoryNameLabel" runat="server"
            Text='<%# Eval("CategoryName") %>'></asp:Label><br />
        Supplier:
        <asp:Label ID="SupplierNameLabel" runat="server"
            Text='<%# Eval("SupplierName") %>'></asp:Label><br />
        <br />
        <br />
    </ItemTemplate>
</asp:Repeater>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProducts">
</asp:ObjectDataSource>

Şekil 3'te tarayıcı üzerinden görüntülendiğinde bu sayfa gösterilmektedir.

Her Ürünün Adı, Sağlayıcısı ve Kategorisi Görüntülenir

Şekil 3: Her Ürünün Adı, Sağlayıcısı ve Kategorisi Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

3. Adım: ObjectDataSource'a Verileri Sıralama Talimatı Verme

Repeater'da görüntülenen verileri sıralamak için ObjectDataSource'a verilerin sıralanması gereken sıralama ifadesini bildirmemiz gerekir. ObjectDataSource verilerini almadan önce olayını başlatır Selectingve bu da sıralama ifadesi belirtmemize olanak sağlar. Olay Selecting işleyicisi, türünde ObjectDataSourceSelectingEventArgsadlı bir özelliğe Arguments sahip olan türünde DataSourceSelectArgumentsbir nesnesi geçirilir. DataSourceSelectArguments sınıfı, veri tüketicisinden veri kaynağı denetimine veriyle ilgili istekleri geçirmek için tasarlanmıştır ve bir SortExpression özellik içerir.

Sıralama bilgilerini ASP.NET sayfasından ObjectDataSource'a geçirmek için olay için Selecting bir olay işleyicisi oluşturun ve aşağıdaki kodu kullanın:

Protected Sub ProductsDataSource_Selecting(ByVal sender As Object, _
    ByVal e As ObjectDataSourceSelectingEventArgs) _
    Handles ProductsDataSource.Selecting
    e.Arguments.SortExpression = sortExpression
End Sub

sortExpression değerine, verileri sıralamak için veri alanının adı (ProductName gibi) atanmalıdır. Sıralama yönüyle ilgili bir özellik yoktur, bu nedenle verileri azalan düzende sıralamak istiyorsanız, DESC dizesini sortExpression değerine (ProductName DESC gibi) ekleyin.

SortExpression için bazı farklı sabit kodlanmış değerleri deneyin ve sonuçları bir tarayıcıda test edin. Şekil 4'te gösterildiği gibi, sortExpression olarak ProductName DESC kullanılırken, ürünler adlarına göre ters alfabetik düzende sıralanır.

Ürünler, Adlarına Göre Ters Alfabetik Düzende Sıralanır

Şekil 4: Ürünler Adlarına Göre Alfabetik Sıralanmış (Tam boyutlu resmi görüntülemek için tıklayın)

4. Adım: Sıralama ArabirimiNi Oluşturma ve Sıralama İfadesini ve Yönünü Anımsama

GridView'da sıralama desteğinin etkinleştirilmesi, sıralanabilir her alanın üst bilgi metnini tıklandığında verileri uygun şekilde sıralayan bir LinkButton'a dönüştürür. Böyle bir sıralama arabirimi, verilerinin sütunlar halinde düzgün bir şekilde yerleştirildiği GridView için anlamlıdır. Ancak DataList ve Repeater denetimleri için farklı bir sıralama arabirimi gerekir. Veri listesi (veri kılavuzunun aksine) için yaygın bir sıralama arabirimi, verilerin sıralanabileceği alanları sağlayan bir açılan listedir. Bu öğretici için böyle bir arabirim uygulayalım.

Repeater'ın üzerine SortableProducts bir DropDownList Web denetimi ekleyin ve özelliğini olarak SortByayarlayınID. Özellikler penceresi özelliğindeki Items üç noktaya tıklayarak ListItem Collection Düzenleyici açın. Verileri , ve alanlarına göre sıralamak ProductNameiçin s ekleyinListItem.SupplierNameCategoryName Ayrıca ürünleri adına göre ters alfabetik düzende sıralamak için bir ListItem ekleyin.

Özellikler ListItemText herhangi bir değere (Ad gibi) ayarlanabilir, ancak özelliklerin Value veri alanının adına (ProductName gibi) ayarlanması gerekir. Sonuçları azalan düzende sıralamak için, DESC dizesini ProductName DESC gibi veri alanı adına ekleyin.

Sıralanabilir Veri Alanlarının Her Biri için ListItem Ekleme

Şekil 5: Sıralanabilir Veri Alanlarının Her Biri için Bir ListItem Ekleme

Son olarak, DropDownList öğesinin sağ tarafındaki Button Web denetimini ekleyin. öğesini ID ve RefreshRepeaterText özelliğini Refresh olarak ayarlayın.

s oluşturup ListItem Yenile düğmesini ekledikten sonra DropDownList ve Button bildirim temelli söz dizimi aşağıdakine benzer olmalıdır:

<asp:DropDownList ID="SortBy" runat="server">
    <asp:ListItem Value="ProductName">Name</asp:ListItem>
    <asp:ListItem Value="ProductName DESC">Name (Reverse Order)
        </asp:ListItem>
    <asp:ListItem Value="CategoryName">Category</asp:ListItem>
    <asp:ListItem Value="SupplierName">Supplier</asp:ListItem>
</asp:DropDownList>
<asp:Button runat="server" ID="RefreshRepeater" Text="Refresh" />

DropDownList sıralama işlemi tamamlandıktan sonra ObjectDataSource olay Selecting işleyicisini sabit kodlanmış sıralama ifadesinin aksine seçili SortBy``ListItem s Value özelliğini kullanabilecek şekilde güncelleştirmemiz gerekir.

Protected Sub ProductsDataSource_Selecting _
    (ByVal sender As Object, ByVal e As ObjectDataSourceSelectingEventArgs) _
    Handles ProductsDataSource.Selecting
    ' Have the ObjectDataSource sort the results by the
    ' selected sort expression
    e.Arguments.SortExpression = SortBy.SelectedValue
End Sub

Bu noktada, sayfayı ilk ziyaret ettiğinizde, varsayılan olarak seçili olduğu için SortByListItem ürünler başlangıçta veri alanına göre ProductName sıralanır (bkz. Şekil 6). Kategori gibi farklı bir sıralama seçeneği belirleyip Yenile'ye tıklamak geri göndermeye neden olur ve Şekil 7'de gösterildiği gibi verileri kategori adına göre yeniden sıralar.

Ürünler Başlangıçta Adlarına Göre Sıralanır

Şekil 6: Ürünler Başlangıçta Adlarına Göre Sıralanır (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ürünler Artık Kategoriye Göre Sıralandı

Şekil 7: Ürünler Artık Kategoriye Göre Sıralandı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Yineleyici görünüm durumu devre dışı bırakıldığından Yenile düğmesine tıklandığında veriler otomatik olarak yeniden sıralanır ve bu da Repeater'ın her geri göndermede veri kaynağına yeniden bağlanmasını sağlar. Repeater'ın görünüm durumunu etkin bıraktıysanız, sıralama açılan listesini değiştirmek sıralama düzenini etkilemez. Bunu düzeltmek için Yenileme Düğmesi olayı için bir olay işleyicisi oluşturun ve Repeater'ı Click veri kaynağına (Repeater yöntemini DataBind() çağırarak) yeniden birleştirin.

Sıralama İfadesini ve Yönünü Anımsama

Sıralamayla ilgili olmayan geri göndermelerin gerçekleşebileceği bir sayfada sıralanabilir bir DataList veya Repeater oluştururken, sıralama ifadesinin ve yönünün geri göndermelerde hatırlanması zorunlu olur. Örneğin, bu öğreticideki Repeater'ı her ürüne bir Sil düğmesi içerecek şekilde güncelleştirdiğimizi düşünün. Kullanıcı Sil düğmesine tıkladığında, seçilen ürünü silmek için bazı kodlar çalıştırdık ve ardından verileri Yineleyici'ye yeniden birleştirdik. Sıralama ayrıntıları geri göndermede kalıcı olmazsa, ekranda görüntülenen veriler özgün sıralama düzenine geri döner.

Bu öğretici için DropDownList, sıralama ifadesini ve yönünü bizim için görünüm durumuna örtük olarak kaydeder. Geri göndermeler arasında sıralama düzenini anımsamak için dikkat etmemiz gereken çeşitli sıralama seçeneklerini sağlayan LinkButtons gibi farklı bir sıralama arabirimi kullansaydık. Bu, sıralama parametrelerini sayfanın görünüm durumunda depolayarak, querystring'e sıralama parametresini ekleyerek veya başka bir durum kalıcılığı tekniği aracılığıyla gerçekleştirilebilir.

Bu öğreticideki gelecekteki örnekler, sıralama ayrıntılarının sayfanın görünüm durumunda nasıl kalıcı hale geleceğini keşfeder.

5. Adım: Varsayılan Sayfalama Kullanan Bir DataList'e Sıralama Desteği Ekleme

Önceki öğreticide, DataList ile varsayılan disk belleğinin nasıl uygulanıp uygulanmayacağımızı inceledik. Bu önceki örneği, sayfalanan verileri sıralama özelliğini içerecek şekilde genişletelim. İlk olarak klasördeki SortingWithDefaultPaging.aspxPagingSortingDataListRepeater ve Paging.aspx sayfalarını açın. Paging.aspx Sayfadan Kaynak düğmesine tıklayarak sayfanın bildirim temelli işaretlemesini görüntüleyin. Seçili metni kopyalayın (bkz. Şekil 8) ve etiketler arasındaki bildirim temelli işaretlemeye SortingWithDefaultPaging.aspx<asp:Content> yapıştırın.

asp:Content> Tags içindeki <Bildirim İşaretlemeyi Paging.aspx'den SortingWithDefaultPaging.aspx'ye çoğaltma

Şekil 8: Etiketlerdeki <asp:Content> Bildirim İşaretlemeyi 'den'e Paging.aspxSortingWithDefaultPaging.aspx çoğaltma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Bildirim temelli işaretlemeyi kopyaladıktan sonra, sayfanın code-behind sınıfındaki Paging.aspx yöntemleri ve özellikleri için SortingWithDefaultPaging.aspxcode-behind sınıfına kopyalayın. Ardından, bir dakika ayırarak sayfayı SortingWithDefaultPaging.aspx tarayıcıda görüntüleyin. ile aynı işlevselliği ve görünümü Paging.aspxsergilemelidir.

ProductsBLL'yi Varsayılan Sayfalama ve Sıralama Yöntemi Içerecek Şekilde Geliştirme

Önceki öğreticide ProductsBLL sınıfında nesne döndüren bir GetProductsAsPagedDataSource(pageIndex, pageSize)PagedDataSource yöntem oluşturduk. Bu PagedDataSource nesne tüm ürünlerle (BLL GetProducts() yöntemi aracılığıyla) dolduruldu, ancak DataList'e bağlı olduğunda yalnızca belirtilen pageIndex ve pageSize giriş parametrelerine karşılık gelen kayıtlar görüntülendi.

Bu öğreticinin önceki bölümlerinde ObjectDataSource Selecting olay işleyicisinden sıralama ifadesini belirterek sıralama desteği ekledik. ObjectDataSource, yöntemi tarafından döndürülen gibi sıralanabilir bir nesne döndürdüğünüzde ProductsDataTableGetProducts() bu iyi çalışır. Ancak, PagedDataSource yöntemi tarafından GetProductsAsPagedDataSource döndürülen nesnesi, iç veri kaynağının sıralanmasını desteklemez. Bunun yerine yöntemine koymadanPagedDataSourceönce yönteminden GetProducts() döndürülen sonuçları sıralamamız gerekir.

Bunu başarmak için sınıfında GetProductsSortedAsPagedDataSource(sortExpression, pageIndex, pageSize)yeni bir yöntem ProductsBLL oluşturun. Yöntemine ProductsDataTable göre GetProducts() döndürüleni sıralamak için varsayılan DataTableViewözelliğini belirtinSort:

<System.ComponentModel.DataObjectMethodAttribute _
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsSortedAsPagedDataSource _
    (sortExpression As String, pageIndex As Integer, pageSize As Integer) _
    As PagedDataSource
    ' Get ALL of the products
    Dim products As Northwind.ProductsDataTable = GetProducts()
    'Sort the products
    products.DefaultView.Sort = sortExpression
    ' Limit the results through a PagedDataSource
    Dim pagedData As New PagedDataSource()
    pagedData.DataSource = products.DefaultView
    pagedData.AllowPaging = True
    pagedData.CurrentPageIndex = pageIndex
    pagedData.PageSize = pageSize
    Return pagedData
End Function

yöntemi, GetProductsSortedAsPagedDataSource önceki öğreticide GetProductsAsPagedDataSource oluşturulan yöntemden yalnızca biraz farklıdır. Özellikle, GetProductsSortedAsPagedDataSource ek bir giriş parametresi sortExpression kabul eder ve bu değeri s DefaultViewözelliğine SortProductDataTable atar. Birkaç kod satırı daha sonra, PagedDataSource s DataSource nesnesine ProductDataTable s DefaultViewatanır.

GetProductsSortedAsPagedDataSource Yöntemini Çağırma ve SortExpression Giriş Parametresinin Değerini Belirtme

GetProductsSortedAsPagedDataSource yöntemi tamamlandığında, bir sonraki adım bu parametrenin değerini sağlamaktır. içindeki SortingWithDefaultPaging.aspx ObjectDataSource şu anda yöntemini çağıracak GetProductsAsPagedDataSource şekilde yapılandırılmıştır ve iki giriş parametresini koleksiyonunda SelectParameters belirtilen iki QueryStringParametersparametresi aracılığıyla geçirir. Bu ikisiQueryStringParameters, s pageIndex ve pageSize parametrelerinin GetProductsAsPagedDataSource kaynağının querystring alanlarından pageIndex ve pageSizekaynaklarından geldiğini gösterir.

ObjectDataSource s SelectMethod özelliğini yeni GetProductsSortedAsPagedDataSource yöntemi çağırabilecek şekilde güncelleştirin. Ardından sortExpression giriş parametresine querystring alanından sortExpressionerişilmesi için yeni QueryStringParameter bir ekleyin. s DefaultValue değerini QueryStringParameter ProductName olarak ayarlayın.

Bu değişikliklerden sonra ObjectDataSource bildirim temelli işaretleme aşağıdaki gibi görünmelidir:

<asp:ObjectDataSource ID="ProductsDefaultPagingDataSource"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsSortedAsPagedDataSource"
    OnSelected="ProductsDefaultPagingDataSource_Selected" runat="server">
    <SelectParameters>
        <asp:QueryStringParameter DefaultValue="ProductName"
            Name="sortExpression" QueryStringField="sortExpression"
            Type="String" />
        <asp:QueryStringParameter DefaultValue="0" Name="pageIndex"
            QueryStringField="pageIndex" Type="Int32" />
        <asp:QueryStringParameter DefaultValue="4" Name="pageSize"
            QueryStringField="pageSize" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Bu noktada, SortingWithDefaultPaging.aspx sayfa sonuçlarını ürün adına göre alfabetik olarak sıralar (bkz. Şekil 9). Bunun nedeni, varsayılan olarak productName değerinin s sortExpression yöntemi parametresi olarak GetProductsSortedAsPagedDataSource geçirilmesidir.

Varsayılan olarak, Sonuçlar ProductName'e Göre Sıralanır

Şekil 9: Varsayılan olarak, Sonuçlar Sıralama ölçütü ProductName (tam boyutlu görüntüyü görüntülemek için tıklayın)

El ile bir sortExpression querystring alanı eklerseniz, SortingWithDefaultPaging.aspx?sortExpression=CategoryName sonuçlar belirtilen sortExpressiondeğerine göre sıralanır. Ancak, bu sortExpression parametre farklı bir veri sayfasına taşınırken querystring'e dahil değildir. Aslında, Sonraki veya Son sayfa düğmelerine tıklamak bizi !Paging.aspx Ayrıca, şu anda sıralama arabirimi yoktur. Kullanıcının disk belleği verilerinin sıralama düzenini değiştirmesinin tek yolu, querystring'i doğrudan düzenlemektir.

Sıralama Arabirimi Oluşturma

İlk olarak kullanıcıyı adresine (yerinePaging.aspx) göndermek SortingWithDefaultPaging.aspx ve değerini querystring'e eklemek sortExpression için yöntemini güncelleştirmemiz RedirectUser gerekir. Ayrıca salt okunur, sayfa düzeyinde adlandırılmış SortExpression bir özellik de eklemeliyiz. Bu özellik, önceki öğreticide oluşturulan ve özelliklerine PageIndex benzer şekilde, varsa querystring alanının değerini sortExpression ve aksi takdirde varsayılan değeri ( ProductName ) PageSize döndürür.

RedirectUser Şu anda yöntemi, görüntülenecek sayfanın dizini için yalnızca tek bir giriş parametresi kabul eder. Ancak, sorgu dizesinde belirtilenler dışında bir sıralama ifadesi kullanarak kullanıcıyı belirli bir veri sayfasına yönlendirmek istediğimiz zamanlar olabilir. Birazdan bu sayfa için verileri belirli bir sütuna göre sıralamaya yönelik bir dizi Düğme Web denetimi içeren sıralama arabirimini oluşturacağız. Bu Düğmelerden birine tıklandığında, uygun sıralama ifadesi değerini geçiren kullanıcıyı yeniden yönlendirmek istiyoruz. Bu işlevi sağlamak için yönteminin RedirectUser iki sürümünü oluşturun. İlki yalnızca görüntülenecek sayfa dizinini kabul ederken, ikincisi sayfa dizini ve sıralama ifadesini kabul etmelidir.

Private ReadOnly Property SortExpression() As String
    Get
        If Not String.IsNullOrEmpty(Request.QueryString("sortExpression")) Then
            Return Request.QueryString("sortExpression")
        Else
            Return "ProductName"
        End If
    End Get
End Property
Private Sub RedirectUser(ByVal sendUserToPageIndex As Integer)
    ' Use the SortExpression property to get the sort expression
    ' from the querystring
    RedirectUser(sendUserToPageIndex, SortExpression)
End Sub
Private Sub RedirectUser(ByVal sendUserToPageIndex As Integer,
    ByVal sendUserSortingBy As String)
    ' Send the user to the requested page with the
    ' requested sort expression
    Response.Redirect(String.Format("SortingWithDefaultPaging.aspx?" & _
        "pageIndex={0}&pageSize={1}&sortExpression={2}", _
        sendUserToPageIndex, PageSize, sendUserSortingBy))
End Sub

Bu öğreticideki ilk örnekte DropDownList kullanarak bir sıralama arabirimi oluşturduk. Bu örnekte, DataList'in üzerine yerleştirilmiş üç Düğme Web denetimi kullanarak sıralama ölçütü ProductNameolarak , için ve CategoryNameiçin bir denetim SupplierNamekullanalım. Ve özelliklerini uygun şekilde ayarlayarak IDText üç Düğme Web denetimini ekleyin:

<p>
    <asp:Button runat="server" id="SortByProductName"
        Text="Sort by Product Name" />
    <asp:Button runat="server" id="SortByCategoryName"
        Text="Sort by Category" />
    <asp:Button runat="server" id="SortBySupplierName"
        Text="Sort by Supplier" />
</p>

Ardından, her biri için bir Click olay işleyicisi oluşturun. Olay işleyicileri, uygun sıralama ifadesini kullanarak kullanıcıyı ilk sayfaya döndürerek yöntemini çağırmalıdır RedirectUser .

Protected Sub SortByProductName_Click(sender As Object, e As EventArgs) _
    Handles SortByProductName.Click
    'Sort by ProductName
    RedirectUser(0, "ProductName")
End Sub
Protected Sub SortByCategoryName_Click(sender As Object, e As EventArgs) _
    Handles SortByCategoryName.Click
    'Sort by CategoryName
    RedirectUser(0, "CategoryName")
End Sub
Protected Sub SortBySupplierName_Click(sender As Object, e As EventArgs) _
    Handles SortBySupplierName.Click
    'Sort by SupplierName
    RedirectUser(0, "SupplierName")
End Sub

Sayfayı ilk kez ziyaret ettiğinizde, veriler ürün adına göre alfabetik olarak sıralanır (Şekil 9'a geri bakın). verilerin ikinci sayfasına ilerlemek için İleri düğmesine tıklayın ve ardından Kategoriye Göre Sırala düğmesine tıklayın. Bu, bizi kategori adına göre sıralanmış ilk veri sayfasına döndürür (bkz. Şekil 10). Benzer şekilde, Sağlayıcıya Göre Sırala düğmesine tıklandığında, verilerin ilk sayfasından başlayarak verileri sağlayıcıya göre sıralar. Veriler sayfalandığında sıralama seçimi hatırlanır. Şekil 11'de, kategoriye göre sıraladıktan sonra verilerin on üçüncü sayfasına ilerledikten sonra sayfa gösterilir.

Ürünler Kategoriye Göre Sıralandı

Şekil 10: Ürünler Kategoriye Göre Sıralanır (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Veriler Arasında Sayfalama Yapılırken Sıralama İfadesi Anımsanıyor

Şekil 11: Verilerde Sayfalama Yaparken Sıralama İfadesi Anımsanıyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

6. Adım: Repeater'da Kayıtlar Aracılığıyla Özel Sayfalama

DataList örneği, verimsiz varsayılan disk belleği tekniği kullanılarak verileri aracılığıyla 5. adımda incelendi. Yeterince büyük miktarda veride disk belleği yaparken, özel disk belleğinin kullanılması zorunludur. Büyük Miktarlarda Veri Aracılığıyla Verimli Sayfalama ve Özel Sayfalanmış Verileri Sıralama öğreticilerine geri dönerek, BLL'de özel sayfalama ve özel disk belleği verilerini sıralamak için varsayılan ve özel disk belleği yöntemleri arasındaki farkları inceledik. Özellikle, önceki iki öğreticide sınıfına aşağıdaki üç yöntemi ProductsBLL ekledik:

  • GetProductsPaged(startRowIndex, maximumRows)startRowIndex'te başlayan ve maximumRows'u aşmayan kayıtların belirli bir alt kümesini döndürür.
  • GetProductsPagedAndSorted(sortExpression, startRowIndex, maximumRows) belirtilen sortExpression giriş parametresine göre sıralanmış kayıtların belirli bir alt kümesini döndürür.
  • TotalNumberOfProducts() veritabanı tablosundaki kayıtların Products toplam sayısını sağlar.

Bu yöntemler, DataList veya Repeater denetimi kullanarak verileri verimli bir şekilde sayfalandırmak ve sıralamak için kullanılabilir. Bunu göstermek için özel disk belleği desteğine sahip bir Repeater denetimi oluşturarak başlayalım; Ardından sıralama özellikleri ekleyeceğiz.

Klasöründeki sayfayı SortingWithCustomPaging.aspxPagingSortingDataListRepeater açın ve özelliği Productsolarak ayarlayarak ID sayfaya bir Repeater ekleyin. Repeater'ın akıllı etiketinden adlı ProductsDataSourceyeni bir ObjectDataSource oluşturun. Sınıfın GetProductsPaged yönteminden ProductsBLL verilerini seçmek için yapılandırın.

ObjectDataSource'ı ProductsBLL Sınıfının GetProductsPaged Yöntemini Kullanacak Şekilde Yapılandırma

Şekil 12: ObjectDataSource'ı GetProductsPaged Sınıf Yöntemini Kullanacak ProductsBLL Şekilde Yapılandırma (Tam boyutlu görüntüyü görüntülemek için tıklayın)

UPDATE, INSERT ve DELETE sekmelerindeki açılan listeleri (Yok) olarak ayarlayın ve İleri düğmesine tıklayın. Veri Kaynağını Yapılandırma sihirbazı şimdi yöntemin GetProductsPagedstartRowIndex ve maximumRows giriş parametrelerinin kaynaklarını ister. Aslında, bu giriş parametreleri yoksayılır. Bunun yerine startRowIndex ve maximumRows değerleri, bu öğreticinin Arguments ilk tanıtımında sortExpression'ı belirttiğimiz gibi ObjectDataSource Selecting olay işleyicisindeki özelliği aracılığıyla geçirilir. Bu nedenle, parametre kaynağı açılan listelerini sihirbazda Yok olarak bırakın.

Parametre Kaynakları'nı Yok Olarak Bırakın

Şekil 13: Parametre Kaynaklarını Yok Olarak Bırakın (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

ObjectDataSource özelliğini EnablePaging olarak trueayarlamayın. Bu, ObjectDataSource'un otomatik olarak kendi startRowIndex ve maximumRows parametrelerini mevcut parametre listesine eklemesine SelectMethod neden olur. Özel EnablePaging disk belleği verilerini GridView, DetailsView veya FormView denetimine bağlarken özellik yararlıdır çünkü bu denetimler ObjectDataSource'tan yalnızca özelliği trueolduğunda EnablePaging kullanılabilen belirli davranışları bekler. DataList ve Repeater için disk belleği desteğini el ile eklememiz gerektiğinden, gerekli işlevleri doğrudan ASP.NET sayfamızda pişireceğimiz için bu özelliği (varsayılan) olarak bırakın false .

Son olarak Repeater'ı ItemTemplate tanımlayın; böylece ürün adı, kategorisi ve tedarikçi gösterilir. Bu değişikliklerden sonra Repeater ve ObjectDataSource bildirim temelli söz dizimi aşağıdakine benzer olmalıdır:

<asp:Repeater ID="Products" runat="server" DataSourceID="ProductsDataSource"
    EnableViewState="False">
    <ItemTemplate>
        <h4><asp:Label ID="ProductNameLabel" runat="server"
            Text='<%# Eval("ProductName") %>'></asp:Label></h4>
        Category:
        <asp:Label ID="CategoryNameLabel" runat="server"
            Text='<%# Eval("CategoryName") %>'></asp:Label><br />
        Supplier:
        <asp:Label ID="SupplierNameLabel" runat="server"
            Text='<%# Eval("SupplierName") %>'></asp:Label><br />
        <br />
        <br />
    </ItemTemplate>
</asp:Repeater>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductsPaged" TypeName="ProductsBLL">
    <SelectParameters>
        <asp:Parameter Name="startRowIndex" Type="Int32" />
        <asp:Parameter Name="maximumRows" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Bir tarayıcı üzerinden sayfayı ziyaret etmek için biraz zaman ayırın ve hiçbir kaydın döndürüldüğünü unutmayın. Bunun nedeni startRowIndex ve maximumRows parametre değerlerini belirtmemizdir; bu nedenle, her ikisi için de 0 değerleri geçiriliyor. Bu değerleri belirtmek için ObjectDataSource Selecting olayı için bir olay işleyicisi oluşturun ve bu parametre değerlerini program aracılığıyla sırasıyla sabit kodlanmış 0 ve 5 değerlerine ayarlayın:

Protected Sub ProductsDataSource_Selecting(sender As Object, _
    e As ObjectDataSourceSelectingEventArgs) _
    Handles ProductsDataSource.Selecting
    e.InputParameters("startRowIndex") = 0
    e.InputParameters("maximumRows") = 5
End Sub

Bu değişiklikle, bir tarayıcı üzerinden görüntülendiğinde sayfada ilk beş ürün gösterilir.

İlk Beş Kayıt Görüntülenir

Şekil 14: İlk Beş Kayıt Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Şekil 14'te listelenen ürünler, verimli özel disk belleği sorgusunu GetProductsPaged gerçekleştiren saklı yordam sonuçları ölçütüne göre sıraladığı için ürün adına göre ProductNamesıralanmış olabilir.

Kullanıcının sayfalarda adım adım ilerleyebilmesi için başlangıç satırı dizinini ve en yüksek satırları izlememiz ve bu değerleri geri göndermeler arasında hatırlamamız gerekir. Varsayılan sayfalama örneğinde bu değerleri kalıcı hale getirmek için querystring alanlarını kullandık; bu tanıtım için bu bilgileri sayfanın görünüm durumunda kalıcı hale alalım. Aşağıdaki iki özelliği oluşturun:

Private Property StartRowIndex() As Integer
    Get
        Dim o As Object = ViewState("StartRowIndex")
        If o Is Nothing Then
            Return 0
        Else
            Return CType(o, Integer)
        End If
    End Get
    Set(ByVal value As Integer)
        ViewState("StartRowIndex") = value
    End Set
End Property
Private Property MaximumRows() As Integer
    Get
        Dim o As Object = ViewState("MaximumRows")
        If o Is Nothing Then
            Return 5
        Else
            Return CType(o, Integer)
        End If
    End Get
    Set(ByVal value As Integer)
        ViewState("MaximumRows") = value
    End Set
End Property

Ardından, 0 ve 5 sabit kodlanmış değerleri yerine ve MaximumRows özelliklerini kullanması StartRowIndex için Selecting olay işleyicisindeki kodu güncelleştirin:

e.InputParameters("startRowIndex") = 0
e.InputParameters("maximumRows") = 5

Bu noktada sayfamız hala yalnızca ilk beş kaydı gösterir. Ancak, bu özellikler kullanıma hazır durumdayken disk belleği arabirimimizi oluşturmaya hazırız.

Disk Belleği Arabirimini Ekleme

Hangi veri sayfasının görüntülendiğini ve toplam sayfa sayısını görüntüleyen Etiket Web denetimi de dahil olmak üzere varsayılan sayfalama örneğinde kullanılan aynı İlk, Önceki, Sonraki, Son sayfalama arabirimini kullanalım. Repeater'ın altına dört Düğme Web denetimi ve Etiket ekleyin.

<p>
    <asp:Button runat="server" ID="FirstPage" Text="<< First" />
    <asp:Button runat="server" ID="PrevPage" Text="< Prev" />
    <asp:Button runat="server" ID="NextPage" Text="Next >" />
    <asp:Button runat="server" ID="LastPage" Text="Last >>" />
</p>
<p>
    <asp:Label runat="server" ID="CurrentPageNumber"></asp:Label>
</p>

Ardından, dört Düğme için olay işleyicileri oluşturun Click . Bu Düğmelerden birine tıklandığında, verilerini güncelleştirip StartRowIndex Repeater'a yeniden bağlamamız gerekir. İlk, Önceki ve Sonraki düğmelerinin kodu yeterince basittir, ancak Son düğmesi için son veri sayfasının başlangıç satırı dizinini nasıl belirleriz? Bu dizini hesaplamanın yanı sıra Sonraki ve Son düğmelerinin etkinleştirilip etkinleştirilmeyeceğini belirleyebilmek için toplam kaç kaydın sayfalandığını bilmemiz gerekir. Sınıfın ProductsBLLTotalNumberOfProducts() yöntemini çağırarak bunu belirleyebiliriz. Yönteminin sonuçlarını TotalNumberOfProducts() döndüren adlı TotalRowCount salt okunur, sayfa düzeyinde bir özellik oluşturalım:

Private ReadOnly Property TotalRowCount() As Integer
    Get
        'Return the value from the TotalNumberOfProducts() method
        Dim productsAPI As New ProductsBLL()
        Return productsAPI.TotalNumberOfProducts()
    End Get
End Property

Bu özellik sayesinde artık son sayfanın başlangıç satırı dizinini belirleyebiliriz. Özellikle, eksi 1 değerinin TotalRowCount ile çarpılarak bölündüğü MaximumRowsMaximumRowstamsayı sonucu olur. Artık dört disk belleği arabirimi düğmesi için olay işleyicilerini yazabiliriz Click :

Protected Sub FirstPage_Click(sender As Object, e As EventArgs) _
    Handles FirstPage.Click
    'Return to StartRowIndex of 0 and rebind data
    StartRowIndex = 0
    Products.DataBind()
End Sub
Protected Sub PrevPage_Click(sender As Object, e As EventArgs) _
    Handles PrevPage.Click
    'Subtract MaximumRows from StartRowIndex and rebind data
    StartRowIndex -= MaximumRows
    Products.DataBind()
End Sub
Protected Sub NextPage_Click(sender As Object, e As EventArgs) _
    Handles NextPage.Click
    'Add MaximumRows to StartRowIndex and rebind data
    StartRowIndex += MaximumRows
    Products.DataBind()
End Sub
Protected Sub LastPage_Click(sender As Object, e As EventArgs) _
    Handles LastPage.Click
    'Set StartRowIndex = to last page's starting row index and rebind data
    StartRowIndex = ((TotalRowCount - 1) \ MaximumRows) * MaximumRows
    Products.DataBind()
End Sub

Son olarak, verilerin ilk sayfasını görüntülerken disk belleği arabirimindeki İlk ve Önceki düğmelerini, son sayfayı görüntülerken de İleri ve Son düğmelerini devre dışı bırakmamız gerekir. Bunu yapmak için ObjectDataSource Selecting olay işleyicisine aşağıdaki kodu ekleyin:

' Disable the paging interface buttons, if needed
FirstPage.Enabled = StartRowIndex <> 0
PrevPage.Enabled = StartRowIndex <> 0
Dim LastPageStartRowIndex As Integer = _
    ((TotalRowCount - 1) \ MaximumRows) * MaximumRows
NextPage.Enabled = (StartRowIndex < LastPageStartRowIndex)
LastPage.Enabled = (StartRowIndex < LastPageStartRowIndex)

Bu Click olay işleyicilerini ve geçerli başlangıç satırı dizinine göre disk belleği arabirimi öğelerini etkinleştirmek veya devre dışı bırakmak için kodu ekledikten sonra, sayfayı tarayıcıda test edin. Şekil 15'te gösterildiği gibi, sayfayı ilk ziyaret ettiğinizde İlk ve Önceki düğmeleri devre dışı bırakılır. İleri'ye tıklanması ikinci veri sayfasını gösterirken Son seçeneğine tıklanması son sayfayı görüntüler (bkz. Şekil 16 ve 17). Verilerin son sayfasını görüntülerken hem sonraki hem de son düğmeleri devre dışı bırakılır.

Ürünlerin İlk Sayfası Görüntülenirken Önceki ve Son Düğmeler Devre Dışı Bırakılıyor

Şekil 15: Ürünlerin İlk Sayfasını Görüntülerken Önceki ve Son Düğmeler Devre Dışı Bırakılıyor (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Ürünlerin İkinci Sayfası Görüntülenir

Şekil 16: Ürünlerin İkinci Sayfası Görüntüleniyor (Tam boyutlu resmi görüntülemek için tıklayın)

Son seçeneğine tıklanması Verilerin Son Sayfasını Görüntüler

Şekil 17: Son'a Tıklanması Verinin Son Sayfasını Görüntüler (Tam boyutlu görüntüyü görüntülemek için tıklayın)

7. Adım: Özel Disk Belleği Yineleyicisi ile Sıralama Desteği Ekleme

Artık özel disk belleği uygulandığına göre sıralama desteği eklemeye hazırız. sınıfının ProductsBLLGetProductsPagedAndSorted yöntemi ile aynı startRowIndex ve maximumRows giriş parametrelerine GetProductsPagedsahiptir, ancak ek sortExpression giriş parametresine izin verir. yöntemini SortingWithCustomPaging.aspxkullanmak GetProductsPagedAndSorted için aşağıdaki adımları gerçekleştirmemiz gerekir:

  1. ObjectDataSource'un SelectMethod özelliğini olarak GetProductsPagedGetProductsPagedAndSorteddeğiştirin.
  2. ObjectDataSource SelectParameters koleksiyonuna sortExpressionParameter nesnesi ekleyin.
  3. Değerini sayfanın görünüm durumu aracılığıyla geri göndermeler arasında kalıcı hale getiren özel, sayfa düzeyinde SortExpression bir özellik oluşturun.
  4. ObjectDataSource'un SelectingsortExpression parametresine sayfa düzeyi SortExpression özelliğinin değerini atamak için ObjectDataSource olay işleyicisini güncelleştirin.
  5. Sıralama arabirimini oluşturun.

ObjectDataSource özelliğini SelectMethod güncelleştirerek ve sortExpressionParameter ekleyerek başlayın. sortExpressionParameter s Type özelliğinin olarak Stringayarlandığından emin olun. Bu ilk iki görevi tamamladıktan sonra ObjectDataSource bildirim temelli işaretlemesi aşağıdaki gibi görünmelidir:

<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsPagedAndSorted"
    OnSelecting="ProductsDataSource_Selecting">
    <SelectParameters>
        <asp:Parameter Name="sortExpression" Type="String" />
        <asp:Parameter Name="startRowIndex" Type="Int32" />
        <asp:Parameter Name="maximumRows" Type="Int32" />
    </SelectParameters>
</asp:ObjectDataSource>

Ardından, değeri durumu görüntülemek için seri hale getirilmiş bir sayfa düzeyi SortExpression özelliğine ihtiyacımız var. Hiçbir sıralama ifadesi değeri ayarlanmamışsa, varsayılan olarak ProductName kullanın:

Private Property SortExpression() As String
    Get
        Dim o As Object = ViewState("SortExpression")
        If o Is Nothing Then
            Return "ProductName"
        Else
            Return o.ToString()
        End If
    End Get
    Set(ByVal value As String)
        ViewState("SortExpression") = value
    End Set
End Property

ObjectDataSource yöntemini çağırmadan GetProductsPagedAndSorted önce sortExpressionParameter değerini özelliğinin SortExpression değerine ayarlamamız gerekir. Olay işleyicisine Selecting aşağıdaki kod satırını ekleyin:

e.InputParameters("sortExpression") = SortExpression

Geriye kalan tek şey sıralama arabirimini uygulamaktır. Son örnekte yaptığımız gibi, kullanıcının sonuçları ürün adına, kategoriye veya sağlayıcıya göre sıralamasını sağlayan üç Düğme Web denetimi kullanılarak sıralama arabirimini uygulayalım.

<asp:Button runat="server" id="SortByProductName"
    Text="Sort by Product Name" />
<asp:Button runat="server" id="SortByCategoryName"
    Text="Sort by Category" />
<asp:Button runat="server" id="SortBySupplierName"
    Text="Sort by Supplier" />

Bu üç Düğme denetimi için olay işleyicileri oluşturun Click . Olay işleyicisinde değerini 0 olarak sıfırlayın StartRowIndex , değerini uygun değere ayarlayın SortExpression ve verileri Repeater ile yeniden birleştirin:

Protected Sub SortByProductName_Click(sender As Object, e As EventArgs) _
    Handles SortByProductName.Click
    StartRowIndex = 0
    SortExpression = "ProductName"
    Products.DataBind()
End Sub
Protected Sub SortByCategoryName_Click(sender As Object, e As EventArgs) _
    Handles SortByCategoryName.Click
    StartRowIndex = 0
    SortExpression = "CategoryName"
    Products.DataBind()
End Sub
Protected Sub SortBySupplierName_Click(sender As Object, e As EventArgs) _
    Handles SortBySupplierName.Click
    StartRowIndex = 0
    SortExpression = "CompanyName"
    Products.DataBind()
End Sub

Hepsi bu kadar! Özel disk belleği ve sıralamanın uygulanması için birkaç adım olsa da, adımlar varsayılan disk belleği için gereken adımlara çok benzerdi. Şekil 18'de, kategoriye göre sıralandığında verilerin son sayfası görüntülenirken ürünler gösterilir.

Kategoriye Göre Sıralanmış Son Veri Sayfası Görüntülenir

Şekil 18: Kategoriye Göre Sıralanmış Verilerin Son Sayfası Görüntülenir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

Not

Önceki örneklerde, supplierName sağlayıcısına göre sıralama yaparken sıralama ifadesi olarak kullanılmıştır. Ancak, özel disk belleği uygulaması için CompanyName'i kullanmamız gerekir. Bunun nedeni, özel disk belleği GetProductsPagedAndSorted uygulamaktan sorumlu saklı yordamın sıralama ifadesini anahtar sözcüğüne ROW_NUMBER() geçirmesidir. Anahtar ROW_NUMBER() sözcük için diğer ad yerine gerçek sütun adı gerekir. Bu nedenle, sıralama ifadesi için sorguda Suppliers () kullanılan diğer ad yerine (SupplierNametablodaki sütunun SELECT adı) kullanmalıyız CompanyName .

Özet

DataList veya Repeater yerleşik sıralama desteği sunmaz, ancak biraz kod ve özel sıralama arabirimi ile bu tür işlevler eklenebilir. Sıralama uygulanırken ancak sayfalama uygulanmazken, sıralama ifadesi ObjectDataSource Select yöntemine geçirilen nesne aracılığıyla DataSourceSelectArguments belirtilebilir. Bu DataSourceSelectArguments nesnenin SortExpression özelliği ObjectDataSource olay Selecting işleyicisinde atanabilir.

Zaten disk belleği desteği sağlayan bir DataList veya Repeater'a sıralama özellikleri eklemek için en kolay yaklaşım, İş Mantığı Katmanı'nı sıralama ifadesi kabul eden bir yöntem içerecek şekilde özelleştirmektir. Bu bilgiler daha sonra ObjectDataSource'un SelectParametersiçindeki bir parametre aracılığıyla geçirilebilir.

Bu öğretici, DataList ve Repeater denetimleriyle disk belleği ve sıralama incelememizi tamamlar. Sonraki ve son öğreticimizde, öğe başına özel, kullanıcı tarafından başlatılan bazı işlevler sağlamak için DataList ve Repeater şablonlarına Button Web denetimleri eklemeyi inceleyeceğiz.

Mutlu Programlama!

Yazar hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçireni David Suru'ydu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana adresinden bir satır mitchell@4GuysFromRolla.combırakın.