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.