asp.net - sort column gridview asp net
clasificación y paginación con gridview asp.net (5)
Estoy tratando de obtener una vista de cuadrícula para ordenar y página manualmente sin éxito.
El problema es que cuando un usuario hace clic en la columna que desea ordenar, ordena esa página, pero no ordena el origen de datos (vista de datos) detrás de la vista de cuadrícula. Entonces cuando progresan a una página diferente, su tipo se pierde. Prácticamente estoy buscando un tipo que realmente clasifique la fuente de datos detrás de la vista de cuadrícula. Esto es lo que tengo hasta ahora:
protected void GridView_OnSort(object sender, GridViewSortEventArgs e)
{
String sortExpression = e.SortExpression;
if (GridViewSortDirection == SortDirection.Ascending)
{
DataView myDataView = new DataView(mybll.GetItemsOrdered());
myDataView.Sort = sortExpression + " DESC";
GridView.DataSource = myDataView;
GridView.DataBind();
}
else
{
DataView myDataView = new DataView(mybll.GetItemsOrdered());
myDataView.Sort = sortExpression + " ASC";
GridView.DataSource = myDataView;
GridView.DataBind();
}
}
Cualquier ayuda sería apreciada. Gracias.
De manera más simple ...
Dim dt As DataTable = DirectCast(GridView1.DataSource, DataTable)
Dim dv As New DataView(dt)
If GridView1.Attributes("dir") = SortDirection.Ascending Then
dv.Sort = e.SortExpression & " DESC"
GridView1.Attributes("dir") = SortDirection.Descending
Else
GridView1.Attributes("dir") = SortDirection.Ascending
dv.Sort = e.SortExpression & " ASC"
End If
GridView1.DataSource = dv
GridView1.DataBind()
Encontré una manera mucho más fácil, que le permite seguir utilizando la clasificación / paginación incorporada de la vista de cuadrícula estándar ...
crea 2 etiquetas configúrelos para que sean visibles = falso Llamé a los míos lblSort1 y lblSortDirection1
luego codifique 2 eventos simples ... la clasificación de páginas, que escribe en el texto de las etiquetas invisibles, y el cambio de índice de página, que las usa ...
Private Sub gridview_Sorting(sender As Object, e As GridViewSortEventArgs) Handles gridview.Sorting
lblSort1.Text = e.SortExpression
lblSortDirection1.Text = e.SortDirection
End Sub
Private Sub gridview_PageIndexChanging(sender As Object, e As GridViewPageEventArgs) Handles gridview.PageIndexChanging
gridview.Sort(lblSort1.Text, CInt(lblSortDirection1.Text))
End Sub
esto es un poco más descuidado que usar variables globales, pero he encontrado con asp especialmente que los vars globales son, bueno, poco confiables ...
Guarde su orden de clasificación en un ViewState.
private const string ASCENDING = " ASC";
private const string DESCENDING = " DESC";
public SortDirection GridViewSortDirection
{
get
{
if (ViewState["sortDirection"] == null)
ViewState["sortDirection"] = SortDirection.Ascending;
return (SortDirection) ViewState["sortDirection"];
}
set { ViewState["sortDirection"] = value; }
}
protected void GridView_Sorting(object sender, GridViewSortEventArgs e)
{
string sortExpression = e.SortExpression;
if (GridViewSortDirection == SortDirection.Ascending)
{
GridViewSortDirection = SortDirection.Descending;
SortGridView(sortExpression, DESCENDING);
}
else
{
GridViewSortDirection = SortDirection.Ascending;
SortGridView(sortExpression, ASCENDING);
}
}
private void SortGridView(string sortExpression,string direction)
{
// You can cache the DataTable for improving performance
DataTable dt = GetData().Tables[0];
DataView dv = new DataView(dt);
dv.Sort = sortExpression + direction;
GridView1.DataSource = dv;
GridView1.DataBind();
}
¿Por qué no quieres usar la funcionalidad de clasificación existente? Siempre puedes personalizarlo.
Clasificación de datos en un control de servidor web GridView en MSDN
Aquí hay un ejemplo con personalización:
La respuesta de Tarkus funciona bien. Sin embargo, sugiero reemplazar el VIEWSTATE con SESSION.
El VIEWSTATE de la página actual solo funciona mientras la página actual se devuelve a sí misma y desaparece una vez que el usuario es redirigido a otra página. SESSION persiste en el orden de clasificación en algo más que la posterior publicación de la página actual. Lo persiste durante toda la sesión. Esto significa que el usuario puede navegar a otras páginas, y cuando regresa a la página determinada, el orden de clasificación que utilizó por última vez aún permanece. Esto usualmente es más conveniente.
También hay otros métodos, como los perfiles de usuario persistentes.
Recomiendo este artículo para una muy buena explicación de ViewState y cómo funciona con el ciclo de vida de una página web: https://msdn.microsoft.com/en-us/library/ms972976.aspx
Para comprender la diferencia entre VIEWSTATE, SESSION y otras formas de variables persistentes, recomiendo este artículo: https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx
<asp:GridView
ID="GridView1" runat="server" AutoGenerateColumns="false" AllowSorting="True" onsorting="GridView1_Sorting" EnableViewState="true">
<Columns>
<asp:BoundField DataField="bookid" HeaderText="BOOK ID"SortExpression="bookid" />
<asp:BoundField DataField="bookname" HeaderText="BOOK NAME" />
<asp:BoundField DataField="writer" HeaderText="WRITER" />
<asp:BoundField DataField="totalbook" HeaderText="TOTALBOOK" SortExpression="totalbook" />
<asp:BoundField DataField="availablebook" HeaderText="AVAILABLE BOOK" />
</Columns>
</asp:GridView>
Código detrás:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack) {
string query = "SELECT * FROM book";
DataTable DT = new DataTable();
SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
DA.Fill(DT);
GridView1.DataSource = DT;
GridView1.DataBind();
}
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) {
string query = "SELECT * FROM book";
DataTable DT = new DataTable();
SqlDataAdapter DA = new SqlDataAdapter(query, sqlCon);
DA.Fill(DT);
GridView1.DataSource = DT;
GridView1.DataBind();
if (DT != null) {
DataView dataView = new DataView(DT);
dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
GridView1.DataSource = dataView;
GridView1.DataBind();
}
}
private string GridViewSortDirection {
get { return ViewState["SortDirection"] as string ?? "DESC"; }
set { ViewState["SortDirection"] = value; }
}
private string ConvertSortDirectionToSql(SortDirection sortDirection) {
switch (GridViewSortDirection) {
case "ASC":
GridViewSortDirection = "DESC";
break;
case "DESC":
GridViewSortDirection = "ASC";
break;
}
return GridViewSortDirection;
}
}