tri et pagination avec gridview asp.net
j'essaie d'obtenir un gridview pour trier et page manuellement sans succès.
le problème est que lorsqu'un utilisateur clique sur la colonne qu'il veut trier, il trie cette page, mais ne trie pas la source de données (dataview) derrière gridview. Donc quand ils progressent vers une autre page, leur espèce est perdue. Je cherche une sorte de source de données derrière gridview. Voici ce que j'ai jusqu'à présent:
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();
}
}
Toute aide serait appréciée. Grâce.
5 réponses
enregistrez votre ordre de tri dans 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();
}
pourquoi ne voulez-vous pas utiliser les fonctionnalités de tri existantes? Vous pouvez toujours personnaliser.
tri des données dans un contrôle de serveur web GridView at MSDN
Voici un exemple de personnalisation:
<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>
Code derrière:
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;
}
}
j'ai trouvé un moyen beaucoup plus facile, qui vous permet de toujours utiliser le construit dans le tri/paging de la gridview standard...
créer 2 étiquettes. mettez-les à visible = false. J'ai appelé le mien lblSort1 et lblSortDirection1
puis Coder 2 événements simples... le tri de page, qui écrit sur le texte des étiquettes invisibles, et le changement d'index de page, qui les utilise...
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
c'est un peu moins précis que d'utiliser des variables globales, mais j'ai trouvé avec surtout que les var mondiales ne sont pas fiables...
façon plus 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()
la réponse de Tarkus fonctionne bien. Toutefois, je suggère de remplacer VIEWSTATE par SESSION.
la VIEWSTATE de la page courante ne fonctionne que pendant que la page courante est postée de nouveau à elle-même et est partie une fois que l'utilisateur est redirigé loin à une autre page. SESSION maintient l'ordre de tri sur plus que juste le post-back de la page courante. Elle persiste pendant toute la durée de la session. Cela signifie que l'utilisateur peut naviguer sur d'autres pages, et quand il revient à la donnée page, l'ordre de tri qu'il a utilisé pour la dernière fois reste toujours. C'est généralement plus pratique.
il existe aussi d'autres méthodes, telles que les profils d'utilisateurs persistants.
je recommande cet article pour une très bonne explication de ViewState et comment il fonctionne avec le cycle de vie d'une page web: https://msdn.microsoft.com/en-us/library/ms972976.aspx
pour comprendre la différence entre VIEWSTATE, SESSION et d'autres façons de persisting variables, je recommande ceci article:https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx