DataList veya Repeater Denetiminde Verileri Sıralama (VB)
tarafından Scott Mitchell
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 SortExpression
bir öğesine sahip olabilir. GridView özelliği AllowSorting
olarak true
ayarlandığı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 SortExpression
gö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 SortableProducts
ayarlayınID
. Repeater'ın akıllı etiketinden adlı ProductsDataSource
yeni bir ObjectDataSource oluşturun ve sınıfın ProductsBLL
GetProducts()
yönteminden veri alacak şekilde yapılandırın. INSERT, UPDATE ve DELETE sekmelerindeki açılan listelerden (Hiçbiri) seçeneğini belirleyin.
Ş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)
Ş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 ItemTemplate
sonra 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.
Ş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 Selecting
ve bu da sıralama ifadesi belirtmemize olanak sağlar. Olay Selecting
işleyicisi, türünde ObjectDataSourceSelectingEventArgs
adlı bir özelliğe Arguments
sahip olan türünde DataSourceSelectArguments
bir 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.
Ş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 SortBy
ayarlayınID
. Özellikler penceresi özelliğindeki Items
üç noktaya tıklayarak ListItem Collection Düzenleyici açın. Verileri , ve alanlarına göre sıralamak ProductName
için s ekleyinListItem
.SupplierName
CategoryName
Ayrıca ürünleri adına göre ters alfabetik düzende sıralamak için bir ListItem
ekleyin.
Özellikler ListItem
Text
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.
Ş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 RefreshRepeater
Text
ö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 SortBy
ListItem
ü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.
Ş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)
Ş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.aspx
PagingSortingDataListRepeater
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.
Şekil 8: Etiketlerdeki <asp:Content>
Bildirim İşaretlemeyi 'den'e Paging.aspx
SortingWithDefaultPaging.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.aspx
code-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.aspx
sergilemelidir.
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 ProductsDataTable
GetProducts()
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 Sort
ProductDataTable
atar. Birkaç kod satırı daha sonra, PagedDataSource
s DataSource nesnesine ProductDataTable
s DefaultView
atanı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 QueryStringParameters
parametresi aracılığıyla geçirir. Bu ikisiQueryStringParameters
, s pageIndex ve pageSize parametrelerinin GetProductsAsPagedDataSource
kaynağının querystring alanlarından pageIndex
ve pageSize
kaynakları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 sortExpression
eriş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.
Ş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 sortExpression
değ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ü ProductName
olarak , için ve CategoryName
için bir denetim SupplierName
kullanalım. Ve özelliklerini uygun şekilde ayarlayarak ID
Text
üç 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.
Ş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)
Ş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ınProducts
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.aspx
PagingSortingDataListRepeater
açın ve özelliği Products
olarak ayarlayarak ID
sayfaya bir Repeater ekleyin. Repeater'ın akıllı etiketinden adlı ProductsDataSource
yeni bir ObjectDataSource oluşturun. Sınıfın GetProductsPaged
yönteminden ProductsBLL
verilerini seçmek için yapılandırın.
Ş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 GetProductsPaged
startRowIndex 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.
Ş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 true
ayarlamayı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 true
olduğ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.
Ş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 ProductName
sı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 ProductsBLL
TotalNumberOfProducts()
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üğü MaximumRows
MaximumRows
tamsayı 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.
Ş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)
Şekil 16: Ürünlerin İkinci Sayfası Görüntüleniyor (Tam boyutlu resmi görüntülemek için tıklayın)
Ş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 ProductsBLL
GetProductsPagedAndSorted
yöntemi ile aynı startRowIndex ve maximumRows giriş parametrelerine GetProductsPaged
sahiptir, ancak ek sortExpression giriş parametresine izin verir. yöntemini SortingWithCustomPaging.aspx
kullanmak GetProductsPagedAndSorted
için aşağıdaki adımları gerçekleştirmemiz gerekir:
- ObjectDataSource'un
SelectMethod
özelliğini olarakGetProductsPaged
GetProductsPagedAndSorted
değiştirin. - ObjectDataSource
SelectParameters
koleksiyonuna sortExpressionParameter
nesnesi ekleyin. - 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. - ObjectDataSource'un
Selecting
sortExpression parametresine sayfa düzeyiSortExpression
özelliğinin değerini atamak için ObjectDataSource olay işleyicisini güncelleştirin. - Sıralama arabirimini oluşturun.
ObjectDataSource özelliğini SelectMethod
güncelleştirerek ve sortExpressionParameter
ekleyerek başlayın. sortExpressionParameter
s Type
özelliğinin olarak String
ayarlandığı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.
Ş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 (SupplierName
tablodaki 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 SelectParameters
iç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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin