Esporta (0) Stampa
Espandi tutto

Ordinamento dei dati con i controlli origine dati

Il controllo GridView è in grado di ordinare i dati a cui è associato grazie alle funzionalità di ordinamento fornite dai controlli origine dati.

Attivazione dell'ordinamento in un controllo origine dati

I controlli origine dati che supportano l'ordinamento sono ObjectDataSource, SqlDataSource e AccessDataSource. I controlli SqlDataSource e AccessDataSource supportano l'ordinamento solo se la rispettiva proprietà DataSourceMode è impostata su DataSet, ovvero sull'impostazione predefinita, come nell'esempio seguente:

<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" />

Il controllo ObjectDataSource supporta l'ordinamento se l'oggetto restituito da SelectMethod è un oggetto DataSet, DataTable o DataView. ObjectDataSource supporta inoltre il recupero dei risultati dell'origine dati con un criterio di ordinamento.

Ordinamento personalizzato

Quando si utilizzano i controlli ObjectDataSource o SqlDataSource, è possibile usufruire delle funzionalità di ordinamento mediante la proprietà SortParameterName. È possibile impostare la proprietà SortParameterName sul nome del parametro che contiene un'espressione di ordinamento passata al controllo origine dati. L'espressione di ordinamento è un elenco di campi delimitati da virgole da utilzzare per l'ordinamento e, eventualmente, l'identificatore DESC utilizzato per applicare un ordinamento decrescente. Per informazioni sul formato dell'espressione di ordinamento, vedere la proprietà System.Data.DataView.Sort.

Il parametro identificato dalla proprietà SortParameterName viene passato al SelectMethod del controllo ObjectDataSource, oppure viene passato come elemento dell'insieme dei parametri al SelectCommand del controllo SqlDataSource. Il controllo ObjectDataSource è in grado di utilizzare l'informazione che gli viene passata nel parametro di ordinamento per restituire i dati con un ordinamento. Per il controllo SqlDataSource, è necessario indicare il nome di una stored procedure che può utilizzare il parametro di ordinamento e restituire i dati ordinati, perché non è possibile passare un parametro come elemento di una clausola ORDER BY.

Nell'esempio di codice riportato di seguito viene illustrata una dichiarazione del controllo ObjectDataSource che identifica un parametro denominato sortColumns come nome di parametro di ordinamento:

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

Nell'esempio di codice riportato di seguito viene illustrato un metodo nell'oggetto origine per il controllo ObjectDataSource. Il metodo viene identificato come SelectMethod. Il parametro identificato dalla proprietà SortParameterName viene utilizzato per l'ordinamento dei dati recuperati dal database.

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;
    }
  }
}

Per ulteriori informazioni, vedere Creazione di un oggetto di origine del controllo ObjectDataSource.

Vedere anche

Aggiunte alla community

AGGIUNGI
Mostra:
© 2014 Microsoft