Mehrere Spalte Sortieren im Gridview?
Hallo ich möchte sozusagen Mehrere Spalte In einem gridview-wie hier gezeigt
Hierarchische (Multi-Spalte) zu Sortieren, für die .net GridView?
Ich habe meine Arbeit zu Hause
Meine aspx sieht wie
<%@ Page Language="C#" AutoEventWireup="True" CodeBehind="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Multiple sorting with Gridview</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="True"
AllowSorting="true" onsorting="GridView1_Sorting" style="margin-right: 541px"
Width="873px">
</asp:GridView>
<p><asp:Label runat="server" ID="lblSortExpression" /></p>
</div>
</form>
</body>
</html>
In meiner Aspx.cs-Seite
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Collections.Specialized;
using System.Text;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
partial class _Default : System.Web.UI.Page
{
private ListDictionary m_ldSortExpression;
private ListDictionary SortExpressions
{
get
{
m_ldSortExpression = (ListDictionary)ViewState["SortExpressions"];
if (m_ldSortExpression == null)
{
m_ldSortExpression = new ListDictionary();
}
return m_ldSortExpression;
}
set { ViewState["SortExpressions"] = value; }
}
protected void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
BindData();
}
}
public void BindData()
{
//Usually you would get the data from the database.
//To simplify the code, I will just fill a datatable with some standard data.
DataTable dt = new DataTable();
dt.Columns.Add("FirstName");
dt.Columns.Add("LastName");
dt.Columns.Add("Age");
dt.Columns.Add("Position");
dt.Rows.Add(new object[] {
"1",
"2",
28,
"5"
});
dt.Rows.Add(new object[] {
"2",
"8",
31,
"2"
});
dt.Rows.Add(new object[] {
"2",
"4",
31,
"4"
});
dt.Rows.Add(new object[] {
"3",
"7",
37,
"3"
});
dt.Rows.Add(new object[] {
"4",
"4",
40,
"1"
});
DataView dv = dt.DefaultView;
//use a stringbuilder to hold the sortexpression for the dataview
StringBuilder sbSortExpression = new StringBuilder();
if (SortExpressions.Count > 0)
{
string[] myKeys = new string[SortExpressions.Count + 1];
SortExpressions.Keys.CopyTo(myKeys, 0);
for (int i = 0; i <= SortExpressions.Count - 1; i++)
{
sbSortExpression.Append(myKeys[i]);
sbSortExpression.Append(" ");
sbSortExpression.Append(SortExpressions[myKeys[i]]);
if (i != SortExpressions.Count - 1)
{
sbSortExpression.Append(", ");
}
}
lblSortExpression.Text = sbSortExpression.ToString();
//usually we would send that sort-expression now to SQL via some stored-procedure
dv.Sort = sbSortExpression.ToString();
}
else
{
lblSortExpression.Text = string.Empty;
}
GridView1.DataSource = dv;
GridView1.DataBind();
PositionGlyph(GridView1, dv.Sort.ToString(), dt);
}
private void PositionGlyph(GridView GridView1, string p,DataTable dt)
{
if ((GridView1.Rows.Count == 0) || (string.IsNullOrEmpty(p)))
return;
Image glyph = new Image();
glyph.EnableTheming = false;
string[] words = p.Split(',');
foreach (string word in words)
{
string[] SortType = word.Split(' ');
if (SortType[SortType.Length - 1] == SortOrder.Ascending.ToString().Substring(0, 3).ToUpper())
glyph.ImageUrl = "~/Images/down_arrow.png";
else
glyph.ImageUrl = "~/Images/up_arrow.png";
int columnindex = dt.Columns[SortType[SortType.Length - 2].ToString()].Ordinal;
GridView1.HeaderRow.Cells[columnindex].Controls.Add(glyph);
//for (int x = 0; x < dt.Columns.Count; x++)
//{
// if (SortType[SortType.Length - 2].ToString()== dt.Columns[x].ColumnName)
// {
// GridView1.HeaderRow.Cells[x].Controls.Add(glyph);
// break;
// }
//}
}
}
protected void GridView1_Sorting(object sender, System.Web.UI.WebControls.GridViewSortEventArgs e)
{
m_ldSortExpression = SortExpressions;
if (!m_ldSortExpression.Contains(e.SortExpression))
{
m_ldSortExpression.Add(e.SortExpression, e.SortDirection.ToString().Replace("Ascending", "ASC").Replace("Descending", "DESC"));
}
else
{
//Get sort direction
string strSortDirection = m_ldSortExpression[e.SortExpression].ToString();
//Was it ascending?
if (strSortDirection == "ASC")
{
//Yes, so sort in desc
m_ldSortExpression[e.SortExpression] = "DESC";
}
else if (strSortDirection == "DESC")
{
//it is descending
//remove the sort order
m_ldSortExpression.Remove(e.SortExpression);
}
}
SortExpressions = m_ldSortExpression;
BindData();
}
public _Default()
{
Load += Page_Load;
}
}
Alles ist in Ordnung, sogar mehrere Sortier -, sondern eine Art Pfeil in der Spaltenüberschrift zeigt nicht richtig.Ich denke, dass Problem ist in PositionGlyph Methode.Asc oder Desc Pfeil zeigt nur zum zuletzt angeklickten überschrift.Ich will zeigen, Sortierreihenfolge für alle Spalten.Bitte helfen Sie mir auf die gleiche
- Zum Wohle der jeder, der will, die dieses Verfahren in einer Anwendung möchte ich bemerken, dass das ListDictionary-Typ ist eine schlechte Wahl für diesen Zweck. Es garantiert nicht die Tasten angezeigt, die in einer bestimmten Reihenfolge, und das Sortieren nach Vorname, dann Nachname ist sehr Verschieden von das Sortieren nach Nachname, dann Vorname. Ein OrderedDictionary wäre eine bessere Wahl.
- was würden Sie für den Schlüssel in der Bestellten Wörterbuch um diese Arbeit zu machen wie der OP will? Sicherlich nicht der Name der Spalte oder der SortExpression.
- Ja, Sie verwenden den Namen der Spalte, so wie Rahul zeigt. Wohlgemerkt, das ist so Verschieden von der Spalte header-text -- es braucht eine eindeutige ID. Dieser code funktioniert einwandfrei, wie geschrieben, Sie tauschen Sie Sie einfach jedes vorkommen von "ListDictionary" für "OrderedDictionary" um sicherzustellen, dass es behält die richtige Reihenfolge.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden:
Hoffe, dass dies helfen.
zeigen Sie den Pfeil für die Sortierung Verhalten eines "gridview" - Spalte in der RowCreated Ereignis so etwas wie dieses ich in der Regel tun Sie es auf diese Weise
es auch schaltet das Bild auf die absteigende und aufsteigende Sortierung der Spalte
Was der code eigentlich tun, ist es eine Schleife durch das GridView-Header zu suchen, ein LinkButton (Rahmen schafft Sie es nur, wenn die SortExpression-Eigenschaft festgelegt ist). Dann, wenn die gefunden ist LinkButton Feld sortiert, dann zeigt es das Bild an den Ausgang, das ist alles
Finden Sie in diesem Beispiel