ページに単純なグリッドビューを表示し、並べ替えとページング機能を提供したいと思います。個別の並べ替えとページングは問題なく機能しますが、両方の組み合わせは機能しません。たとえば、最初の列を降順で並べ替えてから2ページ目に移動すると、デフォルトの並べ替え(昇順)でデータの2番目のページが表示されます。
私はこの質問のコードに大きく依存しました:GridViewの並べ替え:SortDirectionは常に昇順ですが、問題は残ります。また、Sessionオブジェクトの代わりにViewStateが使用されるようにコードを変更する必要があるように思われるので、これも理解する必要があります...
私のコードは単純化されており、2つの列しかありません。
aspx:
<asp:GridView ID="dgvView" runat="server" AutoGenerateColumns="false" AllowPaging="true"
PageSize="10" AllowSorting="True" OnPageIndexChanging="DgvViewPageIndexChanging" OnSorting="OnSort">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name">
<ItemStyle />
</asp:BoundField>
<asp:BoundField DataField="BirthDate" HeaderText="Birth date" DataFormatString="{0:dd.MM.yyyy}"
SortExpression="BirthDate">
<ItemStyle />
</asp:BoundField>
</Columns>
</asp:GridView>
そしてコードビハインド:
public partial class TestPage :Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DisplayData();
}
}
private void DisplayData()
{
Session["TableView"] = GetUsers();
dgvView.DataSource = Session["TableView"];
dgvView.DataBind();
}
protected void DgvViewPageIndexChanging(object sender, GridViewPageEventArgs e)
{
dgvView.PageIndex = e.NewPageIndex;
DisplayData();
}
private List<MyUser> GetUsers()
{
var users = new List<MyUser>();
for (int i = 0; i < 100; i++)
{
users.Add(new MyUser("Name" + i.ToString().PadLeft(2, '0'), new DateTime(2000, 1, 1).AddDays(i)));
}
return users;
}
private class MyUser
{
public string Name { get; private set; }
public DateTime BirthDate { get; private set; }
public MyUser(string name, DateTime birthDate)
{
Name = name;
BirthDate = birthDate;
}
}
protected void OnSort(object sender, GridViewSortEventArgs e)
{
Func<MyUser, object> f;
if (e.SortExpression == "Name") f = u => u.Name;
else f = u => u.BirthDate;
dgvView.DataSource = Sort((List<MyUser>)Session["TableView"], f, GetSortDirection(e.SortExpression));
dgvView.DataBind();
}
private List<MyUser> Sort<T>(IEnumerable<MyUser> user, Func<MyUser, T> f, SortDirection sortDirection)
{
if (sortDirection == SortDirection.Ascending) return user.OrderBy(f).ToList();
return user.OrderByDescending(f).ToList();
}
private SortDirection GetSortDirection(string column)
{
string sessionVariable = "TableSort" + column;
SortDirection sortDirection;
if (Session[sessionVariable] == null)
{
sortDirection = SortDirection.Ascending;
}
else if ((SortDirection)Session[sessionVariable] == SortDirection.Ascending)
{
sortDirection = SortDirection.Descending;
}
else
{
sortDirection = SortDirection.Ascending;
}
Session[sessionVariable] = sortDirection;
return sortDirection;
}
}