Freigeben über


Sortieren von Daten mithilfe von Datenquellensteuerelementen

Aktualisiert: November 2007

Sie können Daten auf einer ASP.NET-Webseite anzeigen, indem Sie ein Datenquellensteuerelement und ein datengebundenes Steuerelement verwenden. Bei einigen Datensteuerungen können Benutzer die Daten sortieren, ohne dass dafür Code erforderlich ist.

Wenn Sie es Benutzern ermöglichen möchten, Daten zur Laufzeit zu sortieren, können Sie als Datenquellensteuerelement ein LinqDataSource-, ObjectDataSource-, SqlDataSource- oder AccessDataSource-Steuerelement verwenden. Um Daten anzuzeigen, die Benutzer nicht sortieren können, können Sie ein GridView- oder ein ListView-Steuerelement verwenden.

Bereitstellen einer Benutzeroberfläche zum Sortieren

Sie können für das Sortieren eine beliebige Benutzeroberfläche erstellen. Die Steuerelemente GridView und ListView stellen zum Sortieren jedoch eine Standardbenutzeroberfläche bereit.

Das GridView-Steuerelement unterstützt ohne weitere Programmierung die Sortierung nach einer einzelnen Spalte. Sie können die AllowSorting-Eigenschaft auf true setzen, um die Überschriften der einzelnen Spalten jeweils automatisch als Linkschaltfläche erstellen zu lassen, die einen Sortierausdruck an das Datenquellensteuerelement übergibt. Sie können die Sortierfunktion des GridView-Steuerelements weiter anpassen, indem Sie das Sortierereignis verarbeiten. Weitere Informationen finden Sie unter Sortieren von Daten in einem GridView-Webserversteuerelement.

Sie können die in einem ListView-Steuerelement angezeigten Daten sortieren, indem Sie der LayoutTemplate-Vorlage des Steuerelements eine Schaltfläche hinzufügen und die CommandName-Eigenschaft der Schaltfläche auf "Sort" (Sortieren) setzen. Sie setzen die CommandArgument-Eigenschaft der Schaltfläche auf den Namen der Spalte, nach der Sie sortieren möchten. Wenn Sie auf die Schaltfläche zum Sortieren klicken, wechselt die Sortierreihenfolge zwischen Ascending und Descending. Weitere Informationen finden Sie unter Übersicht über das ListView-Webserversteuerelement und Exemplarische Vorgehensweise: Anzeigen, Paging und Sortieren von Daten mit dem ListView-Webserversteuerelement.

Aktivieren der Sortierung in einem Datenquellensteuerelement

Die Datenquellensteuerelemente, die über integrierte Unterstützung für das Sortieren verfügen, sind LinqDataSource, ObjectDataSource, SqlDataSource und AccessDataSource. Das LinqDataSource-Steuerelement unterstützt das Sortieren, wenn die AutoSort-Eigenschaft auf true gesetzt ist (Standardwert). Dies ist im folgenden Beispiel gezeigt:

<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    AutoPage="true"
    AutoSort="true"
    ID="LinqDataSource1" 
    >
</asp:LinqDataSource>
<asp:GridView 
    AllowPaging="true"
    AllowSorting="true"
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    >
</asp:GridView>
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    AutoPage="true"
    AutoSort="true"
    ID="LinqDataSource1" 
    >
</asp:LinqDataSource>
<asp:GridView 
    AllowPaging="true"
    AllowSorting="true"
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    >
</asp:GridView>

Die Steuerelemente SqlDataSource und AccessDataSource unterstützen Sortieren nur, wenn ihre DataSourceMode-Eigenschaft auf den Standardwert DataSet festgelegt ist, wie im folgenden Beispiel gezeigt:

<asp:GridView ID="EmployeesGridView" 
  DataSourceID="EmployeesSqlDataSource" 
  DataKeyNames="EmployeeID" 
  AllowSorting="True"
  RunAt="Server" />

<asp:SqlDataSource ID="EmployeesSqlDataSource"  
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees" 
  Connectionstring="<%$ ConnectionStrings:NorthwindConnectionString %>" 
  RunAt="server" />
<asp:GridView ID="EmployeesGridView" 
  DataSourceID="EmployeesSqlDataSource" 
  DataKeyNames="EmployeeID" 
  AllowSorting="True"
  RunAt="Server" />

<asp:SqlDataSource ID="EmployeesSqlDataSource"  
  SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees" 
  Connectionstring="<%$ ConnectionStrings:NorthwindConnectionString %>" 
  RunAt="server" />

Das ObjectDataSource-Steuerelement unterstützt Sortieren, wenn das von der SelectMethod zurückgegebene Objekt ein DataSet-Objekt, ein DataTable-Objekt oder ein DataView-Objekt ist. ObjectDataSource unterstützt auch das Abrufen von Ergebnissen von der Datenquelle in sortierter Reihenfolge.

Benutzerdefinierte Sortierung

Sie können anpassen, wie die Sortierung von datengebundenen Steuerelementen und Datenquellensteuerelementen ausgeführt wird. Auf diese Weise können Sie die Art der Sortierung ändern oder eine benutzerdefinierte Sortierroutine erstellen.

Wenn Sie das LinqDataSource-Steuerelement verwenden, können Sie die Sortierung anpassen, indem Sie die AutoSort-Eigenschaft auf false setzen. Anschließend können Sie einen Handler für das Selecting-Ereignis erstellen.

Wenn Sie die Steuerelemente ObjectDataSource oder SqlDataSource verwenden, können Sie die Sortierfunktionen mithilfe der SortParameterName-Eigenschaft nutzen. Sie können die SortParameterName-Eigenschaft auf den Namen des Parameters festlegen, der einen Sortierausdruck enthält. Der Sortierausdruck wird dann dem Datenquellensteuerelement übergeben. Der Sortierausdruck ist eine durch Trennzeichen getrennte Liste der Felder, nach denen sortiert werden soll. (Durch einen zusätzlichen DESC-Bezeichner können Sie angeben, dass in absteigender Reihenfolge sortiert werden soll.) Einzelheiten über das Format des Sortierausdrucks finden Sie in den Informationen zur DataView.Sort-Eigenschaft.

Der von der SortParameterName-Eigenschaft identifizierte Parameter wird der SelectMethod des ObjectDataSource-Steuerelements übergeben, oder er wird dem SelectCommand des SqlDataSource-Steuerelements als Teil der Parameterauflistung übergeben. Das ObjectDataSource-Steuerelement kann die ihm im Sortierparameter übergebenen Information für die Rückgabe der Daten in sortierter Reihenfolge verwenden. Dem SqlDataSource-Steuerelement muss der Name einer gespeicherten Prozedur übergeben werden, die den Sortierparameter annehmen und die sortierten Daten zurückgeben kann, da ein Parameter nicht als Teil einer ORDER BY-Klausel übergeben werden kann.

Das folgende Codebeispiel veranschaulicht eine ObjectDataSource-Steuerelementdeklaration, die einen Parameter mit dem Namen sortColumns als Sortierparameternamen festlegt:

<asp:ObjectDataSource 
  ID="EmployeesObjectDataSource" 
   
  TypeName="Samples.AspNet.Controls.NorthwindEmployee" 
  SortParameterName="SortColumns"
  EnablePaging="true"
  StartRowIndexParameterName="StartRecord"
  MaximumRowsParameterName="MaxRecords" 
  SelectMethod="GetAllEmployees" >
</asp:ObjectDataSource>
<asp:ObjectDataSource 
  ID="EmployeesObjectDataSource" 
   
  TypeName="Samples.AspNet.Controls.NorthwindEmployee" 
  SortParameterName="SortColumns"
  EnablePaging="true"
  StartRowIndexParameterName="StartRecord"
  MaximumRowsParameterName="MaxRecords" 
  SelectMethod="GetAllEmployees" >
</asp:ObjectDataSource>

Das folgende Codebeispiel zeigt eine Methode im Quellobjekt für das ObjectDataSource-Steuerelement. Die Methode wird als SelectMethod identifiziert. Der von der SortParameterName-Eigenschaft identifizierte Parameter wird verwendet, um die von der Datenbank abgerufenen Daten zu sortieren.

Public Shared Sub Initialize()    
  ' Initialize data source. Use "Northwind" connection string from configuration.

  If ConfigurationManager.ConnectionStrings("Northwind") Is Nothing OrElse _
     ConfigurationManager.ConnectionStrings("Northwind").ConnectionString.Trim() = "" Then      
    Throw New Exception("A connection string named 'Northwind' with a valid connection string " & _
                        "must exist in the <connectionStrings> configuration section for the application.")
  End If

  _connectionString = _
    ConfigurationManager.ConnectionStrings("Northwind").ConnectionString

  _initialized = True
End Sub



' Select all employees.

<DataObjectMethod(DataObjectMethodType.Select, True)> _
Public Shared Function GetAllEmployees(sortColumns As String, startRecord As Integer, maxRecords As Integer) As DataTable

  VerifySortColumns(sortColumns)

  If Not _initialized Then Initialize()

  Dim sqlCommand As String = "SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode FROM Employees "

  If sortColumns.Trim() = "" Then
    sqlCommand &= "ORDER BY EmployeeID"
  Else
    sqlCommand &= "ORDER BY " & sortColumns
  End If

  Dim conn As SqlConnection  = New SqlConnection(_connectionString)
  Dim da   As SqlDataAdapter = New SqlDataAdapter(sqlCommand, conn) 

  Dim ds As DataSet =  New DataSet() 

  Try
    conn.Open()
    da.Fill(ds, startRecord, maxRecords, "Employees")
  Catch e As SqlException
    ' Handle exception.
  Finally      
    conn.Close()
  End Try

  If ds.Tables("Employees") IsNot Nothing Then _
    Return ds.Tables("Employees")

  Return Nothing
End Function


'''''
' Verify that only valid columns are specified in the sort expression to aSub a SQL Injection attack.

Private Shared Sub VerifySortColumns(sortColumns As String)

  If sortColumns.ToLowerInvariant().EndsWith(" desc") Then _
    sortColumns = sortColumns.Substring(0, sortColumns.Length - 5)

  Dim columnNames() As String = sortColumns.Split(",")

  For Each columnName As String In columnNames      
    Select Case columnName.Trim().ToLowerInvariant()        
      Case "employeeid"
      Case "lastname"
      Case "firstname"
      Case ""
      Case Else
        Throw New ArgumentException("SortColumns contains an invalid column name.")
    End Select
  Next
End Sub
public static void Initialize()
{
  // Initialize data source. Use "Northwind" connection string from configuration.

  if (ConfigurationManager.ConnectionStrings["Northwind"] == null ||
      ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString.Trim() == "")
  {
    throw new Exception("A connection string named 'Northwind' with a valid connection string " + 
                        "must exist in the <connectionStrings> configuration section for the application.");
  }

  _connectionString = 
    ConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

  _initialized = true;
}


// Select all employees.

[DataObjectMethod(DataObjectMethodType.Select, true)]
public static DataTable GetAllEmployees(string sortColumns, int startRecord, int maxRecords)
{
  VerifySortColumns(sortColumns);

  if (!_initialized) { Initialize(); }

  string sqlCommand = "SELECT EmployeeID, LastName, FirstName, Address, City, Region, PostalCode FROM Employees ";

  if (sortColumns.Trim() == "")
    sqlCommand += "ORDER BY EmployeeID";
  else
    sqlCommand += "ORDER BY " + sortColumns;

  SqlConnection conn = new SqlConnection(_connectionString);
  SqlDataAdapter da  = new SqlDataAdapter(sqlCommand, conn); 

  DataSet ds =  new DataSet(); 

  try
  {
    conn.Open();
    da.Fill(ds, startRecord, maxRecords, "Employees");
  }
  catch (SqlException e)
  {
    // Handle exception.
  }
  finally
  {
    conn.Close();
  }

  if (ds.Tables["Employees"] != null)
    return ds.Tables["Employees"];

  return null;
}


//////////
// Verify that only valid columns are specified in the sort expression to avoid a SQL Injection attack.

private static void VerifySortColumns(string sortColumns)
{
  if (sortColumns.ToLowerInvariant().EndsWith(" desc"))
    sortColumns = sortColumns.Substring(0, sortColumns.Length - 5);

  string[] columnNames = sortColumns.Split(',');

  foreach (string columnName in columnNames)
  {
    switch (columnName.Trim().ToLowerInvariant())
    {
      case "employeeid":
        break;
      case "lastname":
        break;
      case "firstname":
        break;
      case "":
        break;
      default:
        throw new ArgumentException("SortColumns contains an invalid column name.");
        break;
    }
  }
}

Weitere Informationen finden Sie unter Erstellen eines Quellobjekts für das ObjectDataSource-Steuerelement.

Siehe auch

Weitere Ressourcen

Datengebundene Webserversteuerelemente