5

GridViewカスタム オブジェクトの一般的なリストにバインドされている複数の列 (、、、StringなどDateTimeDecimalデータ型) を並べ替える方法を見つけようとしています。

MyObject.vb :

Public Property Id
Public Property Name
Public Property Date
Public Property Amount

MyObjects.aspx.vb :

gridView.DataSource = GetMyObjects()
gridView.DataBind()

:をGetMyObjects()返しますListMyObject

基本的に、グリッドの列ヘッダーをクリックして並べ替えと逆の並べ替えができるようにする必要があります。またViewState、列ヘッダーをクリックするたびに方向が保持されるように、並べ替え方向を保存できる必要があります。

おそらくMyObject実装する必要があるようIComparableですが、すべてをまとめる方法がよくわかりません。

誰かがこれのための良いチュートリアルを提案したり、正しい方向に向けたりできますか?

4

1 に答える 1

5

並べ替え ( AllowSorting ) を有効にし、イベントOnSortingを処理する必要があります。

注: サンプル コードは C# を使用していますが、VB バージョンも同様のはずです。

GridViewを作成します。

<asp:GridView ID="GridView1" runat="server" AllowSorting="True" OnSorting="GridView1_Sorting">
</asp:GridView>

OnSortingを処理します

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    GridView1.DataSource = GetObjects(e.SortDirection, e.SortExpression);
    GridView1.DataBind();
}

GetObjectsは、ソートされた を返しますList<MyObject>ここで独自の並べ替えロジックを作成する必要があります。1 つの代替手段として、 Dynamic Linqを使用できます。そのルートを選択した場合、GetObjectsは次のように定義できます (もっと良い方法がありますが、理論を示すにはこれで十分です)。

private List<MyObject> GetObjects(SortDirection sd, string se)
{
    // Have we generated data before?
    if (SimulatedDB == null)
    {
        // Create a sample DB
        SimulatedDB = new List<MyObject>();
        var rnd = new Random();

        for (int i = 0; i < 20; i++)
        {
            var node = new MyObject();
            node.Id = i;
            node.Name = String.Format("Name {0}", i);
            node.CreationDate = DateTime.Now.AddDays(rnd.Next(100));
            node.Amount = (rnd.Next(1000) * rnd.NextDouble());

            SimulatedDB.Add(node);
        }
    }

    // Return sorted list
    if (sd == SortDirection.Ascending)
        return SimulatedDB.AsQueryable<MyObject>().OrderBy<MyObject>(se).ToList();
    else
        return SimulatedDB.AsQueryable<MyObject>().OrderByDescending<MyObject>(se).ToList();
}

それが役に立てば幸い。

于 2013-05-17T02:19:44.943 に答える