Özel Sayfalanmış Verileri Sıralama (C#)Sorting Custom Paged Data (C#)

Scott Mitchell tarafındanby Scott Mitchell

Örnek uygulamayı indirin veya PDF 'yi indirinDownload Sample App or Download PDF

Önceki öğreticide, verileri bir Web sayfasında sunarken özel sayfalama uygulamayı öğrendiniz.In the previous tutorial we learned how to implement custom paging when presenting data on a web page. Bu öğreticide, önceki örneği özel sayfalama sıralama desteğini dahil etmek için nasıl genişletebileceğinizi görüyoruz.In this tutorial we see how to extend the preceding example to include support for sorting custom paging.

GirişIntroduction

Özel sayfalama, varsayılan sayfalama ile karşılaştırıldığında, çok sayıda boyuta göre verileri kullanarak sayfalama performansını iyileştirebilir, bu da büyük miktarlarda veri aracılığıyla sayfalandığında, özel sayfalama uygulama seçimini bir şekilde gerçekleştirebilir.Compared to default paging, custom paging can improve the performance of paging through data by several orders of magnitude, making custom paging the de facto paging implementation choice when paging through large amounts of data. Özel sayfalama uygulamak, varsayılan sayfalama uygulamaktan daha karmaşıktır, ancak özellikle de karışıma sıralama ekliyoruz.Implementing custom paging is more involved than implementing default paging, however, especially when adding sorting to the mix. Bu öğreticide, sıralama ve özel sayfalama desteği dahil olmak üzere önceki bir örnekten örnek genişleteceğiz.In this tutorial we'll extend the example from the preceding one to include support for sorting and custom paging.

Note

Bu öğretici önceki bir üzerinde oluşturulduğundan, önceki öğretici s Web sayfasından (EfficientPaging.aspx) <asp:Content> öğesi içinde bildirime dayalı sözdizimini kopyalamak ve SortParameter.aspx sayfasındaki <asp:Content> öğesi arasına yapıştırmak için biraz zaman ayırın.Since this tutorial builds upon the preceding one, before beginning take a moment to copy the declarative syntax within the <asp:Content> element from the preceding tutorial s web page (EfficientPaging.aspx) and paste it between the <asp:Content> element in the SortParameter.aspx page. Bir ASP.NET sayfasının işlevselliğini başka bir şekilde çoğaltmaya yönelik daha ayrıntılı bir tartışma için, oluşturma ve arabirim ekleme öğreticisine doğrulama denetimlerini ekleme adım 1 ' e geri bakın.Refer back to Step 1 of the Adding Validation Controls to the Editing and Inserting Interfaces tutorial for a more detailed discussion on replicating the functionality of one ASP.NET page to another.

1. Adım: özel sayfalama tekniğini yeniden IncelemeStep 1: Reexamining the Custom Paging Technique

Özel sayfalama işleminin düzgün çalışması için, başlangıç satırı dizini ve en fazla satır parametreleri verilen belirli bir kayıt alt kümesini verimli bir şekilde alan bir teknik uygulamamız gerekir.For custom paging to work properly, we must implement some technique that can efficiently grab a particular subset of records given the Start Row Index and Maximum Rows parameters. Bu amacı elde etmek için kullanılabilecek birkaç teknik vardır.There are a handful of techniques that can be used to achieve this aim. Önceki öğreticide, Microsoft SQL Server 2005 s yeni ROW_NUMBER() derecelendirme işlevini kullanarak bunu gerçekleştirmeye baktık.In the preceding tutorial we looked at accomplishing this using Microsoft SQL Server 2005 s new ROW_NUMBER() ranking function. Kısacası ROW_NUMBER() derecelendirme işlevi, belirtilen sıralama düzeni tarafından derecelendirilen bir sorgu tarafından döndürülen her satıra bir satır numarası atar.In short, the ROW_NUMBER() ranking function assigns a row number to each row returned by a query that is ranked by a specified sort order. İlgili kayıtların alt kümesi daha sonra numaralandırılmış sonuçların belirli bir bölümü döndürülerek elde edilir.The appropriate subset of records is then obtained by returning a particular section of the numbered results. Aşağıdaki sorgu, ProductNamealfabetik olarak sıralanan sonuçları derecelendirerek 11 ' den 20 ' ye kadar numaralandırılmış ürünleri döndürmek için bu tekniği nasıl kullanacağınızı gösterir:The following query illustrates how to use this technique to return those products numbered 11 through 20 when ranking the results ordered alphabetically by the ProductName:

SELECT ProductID, ProductName, ...
FROM
   (SELECT ProductID, ProductName, ..., ROW_NUMBER() OVER
        (ORDER BY ProductName) AS RowRank
    FROM Products) AS ProductsWithRowNumbers
WHERE RowRank > 10 AND RowRank <= 20

Bu teknik, belirli bir sıralama düzeni (Bu örnekte alfabetik olarak sıralanmışProductName) kullanılarak sayfalama için iyi bir sonuç verir, ancak sorgunun farklı bir sıralama ifadesine göre sıralanmış sonuçları gösterecek şekilde değiştirilmesi gerekir.This technique works well for paging using a specific sort order (ProductName sorted alphabetically, in this case), but the query needs to be modified to show the results sorted by a different sort expression. İdeal olarak, yukarıdaki sorgu OVER yan tümcesinde bir parametre kullanmak için yeniden yazılabilir, örneğin:Ideally, the above query could be rewritten to use a parameter in the OVER clause, like so:

SELECT ProductID, ProductName, ...
FROM
   (SELECT ProductID, ProductName, ..., ROW_NUMBER() OVER
        (ORDER BY @sortExpression) AS RowRank
    FROM Products) AS ProductsWithRowNumbers
WHERE RowRank > 10 AND RowRank <= 20

Ne yazık ki parametreli ORDER BY yan tümcelerlerine izin verilmez.Unfortunately, parameterized ORDER BY clauses are not allowed. Bunun yerine, @sortExpression giriş parametresini kabul eden bir saklı yordam oluşturuyoruz, ancak aşağıdaki geçici çözümlerden birini kullanır:Instead, we must create a stored procedure that accepts a @sortExpression input parameter, but uses one of the following workarounds:

  • Kullanılabilecek sıralama ifadelerinin her biri için sabit kodlanmış sorgular yazın; ardından, hangi sorgunun çalıştırılacağını öğrenmek için IF/ELSE T-SQL deyimlerini kullanın.Write hard-coded queries for each of the sort expressions that may be used; then, use IF/ELSE T-SQL statements to determine which query to execute.
  • @sortExpressio n giriş parametresine göre dinamik ORDER BY ifadeleri sağlamak için bir CASE deyimi kullanın; daha fazla bilgi için SQL CASE deyimlerinin gücüyle sorgu sonuçlarını dinamik olarak sıralamak için kullanılan bölümüne bakın.Use a CASE statement to provide dynamic ORDER BY expressions based on the @sortExpressio n input parameter; see the Used to Dynamically Sort Query Results section in The Power of SQL CASE Statements for more information.
  • Saklı yordamda uygun sorguyu bir dize olarak oluşturun ve ardından dinamik sorguyu yürütmek için sp_executesql sistem saklı yordamını kullanın.Craft the appropriate query as a string in the stored procedure and then use the sp_executesql system stored procedure to execute the dynamic query.

Bu geçici çözümlerin her biri bir dezavantaja sahiptir.Each of these workarounds has some drawbacks. İlk seçenek, olası her bir sıralama ifadesi için bir sorgu oluşturmanızı gerektirdiğinden diğer iki ikisi için de sürdürülebilir değildir.The first option is not as maintainable as the other two as it requires that you create a query for each possible sort expression. Bu nedenle, daha sonra GridView 'a yeni, sıralanabilir alanlar eklemeye karar verirseniz, geri dönüp saklı yordamı güncelleştirmeniz gerekir.Therefore, if later you decide to add new, sortable fields to the GridView you will also need to go back and update the stored procedure. İkinci yaklaşım, dize olmayan veritabanı sütunlarına göre sıralama yaparken performans sorunlarını ortaya çıkaracak ve ayrıca ilk olarak aynı bakım sorunlarından de sahip olan bazı alt tlelikler vardır.The second approach has some subtleties that introduce performance concerns when sorting by non-string database columns and also suffers from the same maintainability issues as the first. Ve dinamik SQL kullanan üçüncü seçenek, bir saldırgan kendi seçtikleri giriş parametresi değerlerini geçen saklı yordamı yürütebilise, bir SQL ekleme saldırılarına karşı riski ortaya çıkarır.And the third choice, which uses dynamic SQL, introduces the risk for a SQL injection attack if an attacker is able to execute the stored procedure passing in the input parameter values of their choosing.

Bu yaklaşımlardan hiçbiri kusursuz olsa da, üçüncü seçeneği üçünün en iyisi olduğunu düşünüyorum.While none of these approaches is perfect, I think the third option is the best of the three. Dinamik SQL kullanımıyla, diğer iki ikisi de olmadığı bir esneklik düzeyi sağlar.With its use of dynamic SQL, it offers a level of flexibility the other two do not. Ayrıca, bir SQL ekleme saldırısına yalnızca, bir saldırgan tercih ettiği giriş parametrelerinde geçen saklı yordamı yürütebilmesi durumunda kullanılabilir.Furthermore, a SQL injection attack can only be exploited if an attacker is able to execute the stored procedure passing in the input parameters of his choice. DAL parametreli sorgular kullandığından, ADO.NET veritabanına gönderilen bu parametreleri mimari üzerinden korur, yani SQL ekleme saldırısı güvenlik açığının yalnızca saldırgan, saklı yordamı doğrudan yürütebileceği durumlarda vardır.Since the DAL uses parameterized queries, ADO.NET will protect those parameters that are sent to the database through the architecture, meaning that the SQL injection attack vulnerability only exists if the attacker can directly execute the stored procedure.

Bu işlevi uygulamak için GetProductsPagedAndSortedadlı Northwind veritabanında yeni bir saklı yordam oluşturun.To implement this functionality, create a new stored procedure in the Northwind database named GetProductsPagedAndSorted. Bu saklı yordam üç giriş parametresini kabul etmelidir: @sortExpression, sonuçların nasıl sıralanması gerektiğini belirten ve OVER yan tümcesindeki ORDER BY metinden sonra doğrudan nasıl ekleneceğini belirten, nvarchar(100türünde bir giriş parametresi. ve @startRowIndex ve @maximumRowsönceki öğreticide incelenen GetProductsPaged saklı yordamından aynı iki tamsayı giriş parametresini.This stored procedure should accept three input parameters: @sortExpression, an input parameter of type nvarchar(100) that specifies how the results should be sorted and is injected directly after the ORDER BY text in the OVER clause; and @startRowIndex and @maximumRows, the same two integer input parameters from the GetProductsPaged stored procedure examined in the preceding tutorial. Aşağıdaki betiği kullanarak GetProductsPagedAndSorted saklı yordamını oluşturun:Create the GetProductsPagedAndSorted stored procedure using the following script:

CREATE PROCEDURE dbo.GetProductsPagedAndSorted
(
    @sortExpression nvarchar(100),
    @startRowIndex int,
    @maximumRows int
)
AS
-- Make sure a @sortExpression is specified
IF LEN(@sortExpression) = 0
    SET @sortExpression = 'ProductID'
-- Issue query
DECLARE @sql nvarchar(4000)
SET @sql = 'SELECT ProductID, ProductName, SupplierID, CategoryID, QuantityPerUnit,
            UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
            CategoryName, SupplierName
            FROM (SELECT ProductID, ProductName, p.SupplierID, p.CategoryID,
                    QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
                    ReorderLevel, Discontinued,
                  c.CategoryName, s.CompanyName AS SupplierName,
                   ROW_NUMBER() OVER (ORDER BY ' + @sortExpression + ') AS RowRank
            FROM Products AS p
                    INNER JOIN Categories AS c ON
                        c.CategoryID = p.CategoryID
                    INNER JOIN Suppliers AS s ON
                        s.SupplierID = p.SupplierID) AS ProductsWithRowNumbers
            WHERE     RowRank > ' + CONVERT(nvarchar(10), @startRowIndex) +
                ' AND RowRank <= (' + CONVERT(nvarchar(10), @startRowIndex) + ' + '
                + CONVERT(nvarchar(10), @maximumRows) + ')'
-- Execute the SQL query
EXEC sp_executesql @sql

Saklı yordam, @sortExpression parametresi için bir değer belirtilmesini sağlayarak başlar.The stored procedure starts by ensuring that a value for the @sortExpression parameter has been specified. Eksik ise, sonuçlar ProductIDgöre sıralanır.If it is missing, the results are ranked by ProductID. Ardından, dinamik SQL sorgusu oluşturulur.Next, the dynamic SQL query is constructed. Burada dinamik SQL sorgusunun, Products tablosundan tüm satırları almak için kullanılan önceki sorgulardan biraz farklı olduğunu unutmayın.Note that the dynamic SQL query here differs slightly from our previous queries used to retrieve all rows from the Products table. Önceki örneklerde, bir alt sorgu kullanarak her bir ürüne ilişkin ilişkili kategori ve sağlayıcı adlarını elde ediyoruz.In prior examples, we obtained each product s associated category s and supplier s names using a subquery. Bu karar, veri erişim katmanı oluşturma öğreticisinde geri yapılmıştır ve TableAdapter bu tür sorgular için ilişkili Insert, Update ve DELETE yöntemlerini otomatik olarak oluşturamadığı için JOIN s kullanımı yerine oluşturulmuştur.This decision was made back in the Creating a Data Access Layer tutorial and was done in lieu of using JOIN s because the TableAdapter cannot automatically create the associated insert, update, and delete methods for such queries. Ancak, GetProductsPagedAndSorted saklı yordamı, sonuçlar kategorisi veya tedarikçi adlarına göre sıralanmak için JOIN s kullanmalıdır.The GetProductsPagedAndSorted stored procedure, however, must use JOIN s for the results to be ordered by the category or supplier names.

Bu dinamik sorgu statik sorgu bölümleri ve @sortExpression, @startRowIndexve @maximumRows parametreleri birleştirerek oluşturulur.This dynamic query is built up by concatenating the static query portions and the @sortExpression, @startRowIndex, and @maximumRows parameters. @startRowIndex ve @maximumRows tamsayı parametreleri olduğundan, doğru bir şekilde birleştirmek için bunların nvarchars içine dönüştürülmesi gerekir.Since @startRowIndex and @maximumRows are integer parameters, they must be converted into nvarchars in order to be correctly concatenated. Bu dinamik SQL sorgusu oluşturulduktan sonra, sp_executesqlaracılığıyla yürütülür.Once this dynamic SQL query has been constructed, it is executed via sp_executesql.

Bu saklı yordamı @sortExpression, @startRowIndexve @maximumRows parametrelerine ait farklı değerlerle test etmek için bir dakikanızı ayırın.Take a moment to test this stored procedure with different values for the @sortExpression, @startRowIndex, and @maximumRows parameters. Sunucu Gezgini, saklı yordam adına sağ tıklayın ve Yürüt ' ü seçin.From the Server Explorer, right-click on the stored procedure name and choose Execute. Bu işlem, giriş parametrelerini girebileceğiniz saklı yordamı Çalıştır iletişim kutusunu getirir (bkz. Şekil 1).This will bring up the Run Stored Procedure dialog box into which you can enter the input parameters (see Figure 1). Sonuçları kategori adına göre sıralamak için, @sortExpression parametresi değeri için CategoryName kullanın; tedarikçinin şirket adına göre sıralamak için CompanyName ' i kullanın.To sort the results by the category name, use CategoryName for the @sortExpression parameter value; to sort by the supplier s company name, use CompanyName. Parametre değerlerini sağladıktan sonra, Tamam ' a tıklayın.After providing the parameters values, click OK. Sonuçlar çıkış penceresinde görüntülenir.The results are displayed in the Output window. Şekil 2 ' de, azalan düzende UnitPrice göre derecelendirilen 11 ' den 20 ' ye kadar dönen sonuçları gösterir.Figure 2 shows the results when returning products ranked 11 through 20 when ordering by the UnitPrice in descending order.

Saklı yordamın üç giriş parametresi için farklı değerler deneyin

Şekil 1: saklı yordamın üç giriş parametresi Için farklı değerler deneyinFigure 1: Try Different Values for the Stored Procedure s Three Input Parameters

saklı yordam sonuçları Çıkış Penceresi gösterilirThe Stored Procedure s Results are Shown in the Output Window

Şekil 2: saklı yordam sonuçları çıkış penceresi gösterilir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 2: The Stored Procedure s Results are Shown in the Output Window (Click to view full-size image)

Note

OVER yan tümcesindeki belirtilen ORDER BY sütununa göre sonuçları derecelendirerek SQL Server sonuçları sıralaması gerekir.When ranking the results by the specified ORDER BY column in the OVER clause, SQL Server must sort the results. Bu işlem, sonuçların tarafından sıralanan sütunlar üzerinde kümelenmiş bir dizin varsa veya kapsayan bir dizin varsa, ancak başka maliyetli olabilir.This is a quick operation if there is a clustered index over the column(s) the results are being ordered by or if there is a covering index, but can be more costly otherwise. Yeterince büyük sorguların performansını artırmak için, sonuçların sıralandığı sütun için kümelenmemiş bir dizin eklemeyi göz önünde bulundurun.To improve performance for sufficiently large queries, consider adding a non-clustered index for the column by which the results are ordered by. Daha fazla ayrıntı için SQL Server 2005 ' de derecelendirme işlevleri ve performans bölümüne bakın.Refer to Ranking Functions and Performance in SQL Server 2005 for more details.

2. Adım: veri erişimini ve Iş mantığı katmanlarını genişleterekStep 2: Augmenting the Data Access and Business Logic Layers

GetProductsPagedAndSorted saklı yordam oluşturulduktan sonra, bir sonraki adımınız uygulama mimarimiz tarafından bu saklı yordamı yürütmek için bir yol sağlamaktır.With the GetProductsPagedAndSorted stored procedure created, our next step is to provide a means to execute that stored procedure through our application architecture. Bu, hem DAL hem de BLL 'ye uygun bir yöntem eklenmesini gerektirir.This entails adding an appropriate method to both the DAL and BLL. DAL için bir yöntem ekleyerek başlayalım.Let s start by adding a method to the DAL. Northwind.xsd türü belirtilmiş veri kümesini açın, ProductsTableAdaptersağ tıklayın ve bağlam menüsünden sorgu Ekle seçeneğini belirleyin.Open the Northwind.xsd Typed DataSet, right-click on the ProductsTableAdapter, and choose the Add Query option from the context menu. Önceki öğreticide yaptığımız gibi, bu yeni DAL yöntemini mevcut bir saklı yordamı kullanacak şekilde yapılandırmak istiyoruz-GetProductsPagedAndSorted, bu durumda.As we did in the preceding tutorial, we want to configure this new DAL method to use an existing stored procedure - GetProductsPagedAndSorted, in this case. Yeni TableAdapter yönteminin varolan bir saklı yordamı kullanmasını istediğinizi belirterek başlayın.Start by indicating that you want the new TableAdapter method to use an existing stored procedure.

Mevcut bir saklı yordam kullanmayı seçin

Şekil 3: varolan bir saklı yordam kullanmayı seçinFigure 3: Choose to Use an Existing Stored Procedure

Kullanılacak saklı yordamı belirtmek için, sonraki ekranda bulunan aşağı açılan listeden GetProductsPagedAndSorted saklı yordamını seçin.To specify the stored procedure to use, select the GetProductsPagedAndSorted stored procedure from the drop-down list in the next screen.

Getproductspagedandsıralanmış saklı yordamını kullanın

Şekil 4: Getproductspagedandsıralanmış saklı yordamını kullanınFigure 4: Use the GetProductsPagedAndSorted Stored Procedure

Bu saklı yordam, sonuçları olarak bir dizi kayıt döndürür. bu nedenle, sonraki ekranda tablo verileri döndüren anlamına gelir.This stored procedure returns a set of records as its results so, in the next screen, indicate that it returns tabular data.

Saklı yordamın tablo verilerini döndürdüğünü belirtir

Şekil 5: saklı yordamın tablo verilerini döndürdüğünü belirtinFigure 5: Indicate that the Stored Procedure Returns Tabular Data

Son olarak, hem bir DataTable doldur hem de bir DataTable desenleri döndüren DAL yöntemleri oluşturun ve sırasıyla FillPagedAndSorted ve GetProductsPagedAndSortedyöntemlerini adlandırarak bir DataTable deseni döndürün.Finally, create DAL methods that use both the Fill a DataTable and Return a DataTable patterns, naming the methods FillPagedAndSorted and GetProductsPagedAndSorted, respectively.

Yöntemlerin adlarını seçin

Şekil 6: yöntem adlarını seçinFigure 6: Choose the Methods Names

Artık DAL genişlettiğimiz için BLL 'ye yeniden başlamaya hazırız.Now that we ve extended the DAL, we re ready to turn to the BLL. ProductsBLL sınıf dosyasını açın ve GetProductsPagedAndSortedyeni bir yöntem ekleyin.Open the ProductsBLL class file and add a new method, GetProductsPagedAndSorted. Bu yöntemin sortExpression, startRowIndexve maximumRows üç giriş parametresini kabul etmesi gerekir ve bunun gibi DAL s GetProductsPagedAndSorted yöntemine çağrı yapmanız gerekir:This method needs to accept three input parameters sortExpression, startRowIndex, and maximumRows and should simply call down into the DAL s GetProductsPagedAndSorted method, like so:

[System.ComponentModel.DataObjectMethodAttribute(
    System.ComponentModel.DataObjectMethodType.Select, false)]
public Northwind.ProductsDataTable GetProductsPagedAndSorted(
    string sortExpression, int startRowIndex, int maximumRows)
{
    return Adapter.GetProductsPagedAndSorted
        (sortExpression, startRowIndex, maximumRows);
}

3. Adım: SortExpression parametresinde geçirilecek ObjectDataSource yapılandırmaStep 3: Configuring the ObjectDataSource to Pass in the SortExpression Parameter

GetProductsPagedAndSorted saklı yordamı kullanan Yöntemler dahil olmak üzere DAL ve BLL 'yi genişletmeden, her şey yeni BLL metodunu kullanmak ve kullanıcının sonuçları sıralamayı istediği sütuna göre SortExpression parametresini geçirmek için SortParameter.aspx sayfasındaki ObjectDataSource 'u yapılandırmaktır.Having augmented the DAL and BLL to include methods that utilize the GetProductsPagedAndSorted stored procedure, all that remains is to configure the ObjectDataSource in the SortParameter.aspx page to use the new BLL method and to pass in the SortExpression parameter based on the column that the user has requested to sort the results by.

GetProductsPaged SelectMethod ObjectDataSource 'ı GetProductsPagedAndSortedolarak değiştirerek başlayın.Start by changing the ObjectDataSource s SelectMethod from GetProductsPaged to GetProductsPagedAndSorted. Bu işlem, veri kaynağı Yapılandırma Sihirbazı ile Özellikler penceresi veya doğrudan bildirime dayalı sözdizimi aracılığıyla yapılabilir.This can be done through the Configure Data Source wizard, from the Properties window, or directly through the declarative syntax. Sonra, ObjectDataSource s SortParameterName özelliğiiçin bir değer sağlamamız gerekir.Next, we need to provide a value for the ObjectDataSource s SortParameterName property. Bu özellik ayarlandıysa, ObjectDataSource, GridView s SortExpression özelliğini SelectMethodgeçirmeye çalışır.If this property is set, the ObjectDataSource attempts to pass in the GridView s SortExpression property to the SelectMethod. Özellikle, ObjectDataSource, adı SortParameterName özelliğinin değerine eşit olan bir giriş parametresi arar.In particular, the ObjectDataSource looks for an input parameter whose name is equal to the value of the SortParameterName property. BLL s GetProductsPagedAndSorted yöntemi sortExpressionadlı sıralama ifadesi giriş parametresine sahip olduğundan, ObjectDataSource s SortExpression özelliğini sortExpression olarak ayarlayın.Since the BLL s GetProductsPagedAndSorted method has the sort expression input parameter named sortExpression, set the ObjectDataSource s SortExpression property to sortExpression .

Bu iki değişikliği yaptıktan sonra, ObjectDataSource 'un bildirime dayalı sözdizimi aşağıdakine benzer şekilde görünmelidir:After making these two changes, the ObjectDataSource s declarative syntax should look similar to the following:

<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
    OldValuesParameterFormatString="original_{0}" TypeName="ProductsBLL"
    SelectMethod="GetProductsPagedAndSorted" EnablePaging="True"
    SelectCountMethod="TotalNumberOfProducts" SortParameterName="sortExpression">
</asp:ObjectDataSource>

Note

Önceki öğreticide olduğu gibi, ObjectDataSource 'un SelectParameters koleksiyonunda sortExpression, StartRowIndex veya maximumRows giriş parametrelerini içermediğinden emin olun.As with the preceding tutorial, ensure that the ObjectDataSource does not include the sortExpression, startRowIndex, or maximumRows input parameters in its SelectParameters collection.

GridView 'da sıralamayı etkinleştirmek için GridView s akıllı etiketinde sıralama etkinleştir onay kutusunu işaretleyin. Bu, GridView s AllowSorting özelliğini true olarak ayarlayan ve her sütun için üst bilgi metninin bir LinkButton olarak işlenmesine neden olur.To enable sorting in the GridView, simply check the Enable Sorting checkbox in the GridView s smart tag, which sets the GridView s AllowSorting property to true and causing the header text for each column to be rendered as a LinkButton. Son Kullanıcı üst bilgi bağlantı düğmelerinden birine tıkladığında, geri gönderme ve aşağıdaki adımları transpire:When the end user clicks on one of the header LinkButtons, a postback ensues and the following steps transpire:

  1. GridView, SortExpression özelliğini üst bilgi bağlantısına tıklanan alanın SortExpression değerine güncelleştirirThe GridView updates its SortExpression property to the value of the SortExpression of the field whose header link was clicked
  2. ObjectDataSource, BLL s GetProductsPagedAndSorted yöntemini çağırır. Bu, GridView s SortExpression özelliğini yöntem s sortExpression giriş parametresinin değeri olarak geçirerek (uygun startRowIndex ve maximumRows giriş parametresi değerleriyle birlikte)The ObjectDataSource invokes the BLL s GetProductsPagedAndSorted method, passing in the GridView s SortExpression property as the value for the method s sortExpression input parameter (along with the appropriate startRowIndex and maximumRows input parameter values)
  3. BLL, DAL s GetProductsPagedAndSorted yöntemini çağırırThe BLL invokes the DAL s GetProductsPagedAndSorted method
  4. DAL, @sortExpression parametresini geçirerek (@startRowIndex ve @maximumRows giriş parametresi değerleriyle birlikte) GetProductsPagedAndSorted saklı yordamını yürütürThe DAL executes the GetProductsPagedAndSorted stored procedure, passing in the @sortExpression parameter (along with the @startRowIndex and @maximumRows input parameter values)
  5. Saklı yordam, veri alt kümesini BLL 'ye döndürür; bu, ObjectDataSource 'a döndürür; Bu veriler daha sonra GridView 'a bağlanır, HTML olarak işlenir ve son kullanıcıya gönderilirThe stored procedure returns the appropriate subset of data to the BLL, which returns it to the ObjectDataSource; this data is then bound to the GridView, rendered into HTML, and sent down to the end user

Şekil 7 ' de UnitPrice göre artan sırada sıralanan ilk sonuç sayfasını gösterir.Figure 7 shows the first page of results when sorted by the UnitPrice in ascending order.

sonuçlar BirimFiyat 'a göre sıralanırThe Results are Sorted by the UnitPrice

Şekil 7: sonuçlar BirimFiyat öğesine göre sıralanır (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 7: The Results are Sorted by the UnitPrice (Click to view full-size image)

Geçerli uygulama, sonuçları ürün adına, kategori adına, birim başına miktar 'a ve birim fiyata göre doğru bir şekilde sıralayabilse de, sonuçları Tedarikçi adına göre sıralamaya çalışırken çalışma zamanı özel durumu oluşur (bkz. Şekil 8).While the current implementation can correctly sort the results by product name, category name, quantity per unit, and unit price, attempting to order the results by the supplier name results in a runtime exception (see Figure 8).

Sonuçları tedarikçiye göre sıralamaya çalışırken aşağıdaki çalışma zamanı özel durumu oluşur

Şekil 8: sonuçları tedarikçiye göre sıralamaya çalışırken aşağıdaki çalışma zamanı özel durumu oluşurFigure 8: Attempting to Sort the Results by the Supplier Results in the Following Runtime Exception

Bu özel durum, SortExpression GridView SupplierName BoundField SupplierNameolarak ayarlandığı için oluşur.This exception occurs because the SortExpression of the GridView s SupplierName BoundField is set to SupplierName. Ancak, Suppliers tablodaki tedarikçinin adı, bu sütun adının SupplierNameolarak diğer adı verilir CompanyName.However, the supplier s name in the Suppliers table is actually called CompanyName we have been aliased this column name as SupplierName. Ancak, ROW_NUMBER() işlevi tarafından kullanılan OVER yan tümcesi diğer adı kullanamaz ve gerçek sütun adını kullanmalıdır.However, the OVER clause used by the ROW_NUMBER() function cannot use the alias and must use the actual column name. Bu nedenle, SortExpression SupplierName BoundField ' dan CompanyName olarak değiştirin (bkz. Şekil 9).Therefore, change the SupplierName BoundField s SortExpression from SupplierName to CompanyName (see Figure 9). Şekil 10 ' da gösterildiği gibi, bu değişiklikten sonra sonuçlar tedarikçiye göre sıralanabilir.As Figure 10 shows, after this change the results can be sorted by the supplier.

SupplierName BoundField, SortExpression 'ı CompanyName olarak değiştirme

Şekil 9: SupplierName BoundField, SortExpression 'ı CompanyName olarak değiştirmeFigure 9: Change the SupplierName BoundField s SortExpression to CompanyName

sonuçlar artık tedarikçiye göre sıralanabilecekThe Results Can Now Be Sorted by Supplier

Şekil 10: sonuçlar artık tedarikçiye göre sıralanabilir (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 10: The Results Can Now Be Sorted by Supplier (Click to view full-size image)

ÖzetSummary

Önceki öğreticide incelenen özel sayfalama uygulamasına, sonuçların sıralama sırasında, tasarım zamanında belirtilmesi gerekir.The custom paging implementation we examined in the preceding tutorial required that the order by which the results were to be sorted be specified at design time. Kısacası bu, uyguladığımız özel sayfalama uygulamasının aynı anda, sıralama özellikleri sunduğumuz anlamına gelir.In short, this meant that the custom paging implementation we implemented could not, at the same time, provide sorting capabilities. Bu öğreticide, sonuçların sıralanabileceği bir @sortExpression giriş parametresi dahil olmak üzere, saklı yordamı birinciden genişleterek bu sınırlamanın üstesinden geldik.In this tutorial we overcame this limitation by extending the stored procedure from the first to include a @sortExpression input parameter by which the results could be sorted.

Bu saklı yordamı oluşturduktan ve DAL ve BLL 'de yeni yöntemler oluşturduktan sonra, ObjectDataSource 'un geçerli SortExpression özelliğini BLL SelectMethodgeçirilecek şekilde yapılandırarak hem sıralama hem de özel disk belleği sunan bir GridView uygulayacağız.After creating this stored procedure and creating new methods in the DAL and BLL, we were able to implement a GridView that offered both sorting and custom paging by configuring the ObjectDataSource to pass in the GridView s current SortExpression property to the BLL SelectMethod.

Programlamanın kutlu olsun!Happy Programming!

Yazar hakkındaAbout the Author

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.comadresinden erişilebilir .He can be reached at mitchell@4GuysFromRolla.com. ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.or via his blog, which can be found at http://ScottOnWriting.NET.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğretici için lider gözden geçiren, Carlos Santos idi.Lead reviewer for this tutorial was Carlos Santos. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .If so, drop me a line at mitchell@4GuysFromRolla.com.