c# - registros - ordenar datagridview por varias columnas vb net
¿Cómo ordenar columnas en un GridView de ASP.NET si usa un DataSource personalizado? (4)
No estoy seguro de esto, pero si usa un SqlDataSource estándar y hace clic en un campo para ordenar de acuerdo con ese campo, SqlDataSource se rellena nuevamente con los datos y se recupera en la cuadrícula. Por lo tanto, la clasificación no ocurre en el lado del cliente y también se puede hacer solo cuando el método de selección de SQLDataSource no es DataReader.
Al manejar el evento de ordenamiento, ¿recreas el SqlDataSource y lo vuelves a unir a GridView? ¿Puedes poner el campo y la dirección de ordenación en el comando de selección generado que usas? ¿O ponerlo en la propiedad SortParameterName de SQLDataSource?
Estoy absolutamente seguro de que tienes que recuperar el SqlDataSource a la cuadrícula, y ya que lo creas sobre la marcha, tienes que poblarlo de nuevo.
No puedo hacer que mi GridView permita a un usuario ordenar una columna de datos cuando estoy usando un SqlDataSource personalizado.
Tengo un GridView en el que el código en la referencia ASP en el HTML es mínimo:
<asp:GridView id="grid" runat="server" AutoGenerateColumns="False" AllowSorting="True">
</asp:GridView>
En el código subyacente adjunto un SqlDataSource creado dinámicamente (las columnas que contiene no son siempre las mismas, por lo que el SQL utilizado para crearlo se construye en tiempo de ejecución). Por ejemplo:
Configuré las columnas ...
BoundField column = new BoundField();
column.DataField = columnName;
column.HeaderText = "Heading";
column.SortExpression = columnName;
grid.Columns.Add(column);
la fuente de datos ...
SqlDataSource dataSource = new SqlDataSource(
"System.Data.SqlClient",
connectionString,
generatedSelectCommand);
entonces la vista de cuadrícula ...
grid.DataSource = dataSource;
grid.DataKeyNames = mylistOfKeys;
grid.DataBind();
Por el momento no ocurre nada cuando un usuario hace clic en un encabezado de columna cuando esperaba que ordenara los datos de la columna. Alguien alguna idea de lo que me estoy perdiendo?
Si hay una manera más agradable de hacer esto, sería útil también, ¡ya que me parece desordenado!
Primero necesitas agregar un evento:
<asp:GridView AllowSorting="True" OnSorting="gvName_Sorting" ...
Entonces ese evento se ve así:
protected void gvName_Sorting( object sender, GridViewSortEventArgs e )
{
...
//rebind gridview
}
Básicamente tienes que obtener tus datos de nuevo.
Tienes razón en que parece desordenado y hay una manera mejor: ASP.Net MVC
Desafortunadamente ese es un modelo de página drásticamente diferente.
¿Mejor tarde que nunca?
Algunas adiciones para la sugerencia de Keith, que es básicamente la correcta.
La verdad es que tienes que ocuparte de ordenar el evento gridView_Sorting. No es necesario DataBind () antes de GridView, por ejemplo, en el evento Page_Load. Allí solo debe llamar al método GridView.Sort () en lugar de .DataBind (). Aquí es cómo va:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Me.gridView.Sort(Request.QueryString("sortExpression"), Request.QueryString("sortDirection"))
End If
End Sub
A continuación, echemos un vistazo al evento gridView_Sorting.
Ahí tienes que empujar el origen de datos a la ordenación correcta. GridView en sí mismo no maneja eso (en este caso al menos).
Protected Sub gridView_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gridView.Sorting
If IsPostBack Then
e.Cancel = True
Dim sortDir As SortDirection = SortDirection.Ascending
If e.SortExpression = Me.Q_SortExpression And Me.Q_SortDirection = SortDirection.Ascending Then
sortDir = SortDirection.Descending
End If
RedirectMe(e.SortExpression, sortDir)
Else
Dim sortExpr As String = e.SortExpression + " " + IIf(e.SortDirection = SortDirection.Ascending, "ASC", "DESC")
Dim dv As System.Data.DataView = Me.dsrcView.Select(New DataSourceSelectArguments(sortExpr))
Me.gridView.DataSource = dv
Me.gridView.DataBind()
End If
End Sub
No es necesario codificar ninguna funcionalidad de clasificación en el origen de datos, como pasar los parámetros de ordenamiento al procedimiento almacenado. Toda clasificación tiene lugar en los fragmentos de código anteriores.
Además, es bueno tener gridView.EnableViewState cambiado a False, lo que hace que la página sea mucho más ligera para el tráfico de red y para el navegador también. Puede hacer eso ya que la cuadrícula se recrea completamente cada vez que la página se devuelve.
¡Que tengas un buen día!
Martín
También puede reasignar el origen de datos. Seleccionar comando antes de la llamada DataBind () en el controlador de ordenación. Algo como esto:
protected void gvItems_Sorting(object sender, GridViewSortEventArgs e)
{
GridView gv = (GridView)sender;
SqlDataSource ds = (SqlDataSource)gv.DataSource;
ds.SelectCommand = ds.SelectCommand + " order by "
+ e.SortExpression + " " + GetSortDirection(e.SortDirection);
gvItems.DataSource = ds;
gvItems.DataBind();
}
string GetSortDirection(string sSortDirCmd)
{
string sSortDir;
if ((SortDirection.Ascending == sSortDirCmd))
{
sSortDir = "asc";
}
else
{
sSortDir = "desc";
}
return sSortDir;
}
Espero esta ayuda. Avíseme si necesita ayuda adicional para implementarlo.
¡Disfrutar!