我正在尝试弄清楚如何对包含多个列(GridView
,String
,DateTime
等数据类型)的Decimal
进行排序到自定义对象的通用列表。
MyObject.vb :
Public Property Id
Public Property Name
Public Property Date
Public Property Amount
MyObjects.aspx.vb :
gridView.DataSource = GetMyObjects()
gridView.DataBind()
注意 :GetMyObjects()
返回List
MyObject
基本上,我需要能够点击网格的列标题进行排序和反向排序,并且还能够将排序方向存储在ViewState
中,这样每次点击时方向都会保持不变列标题。
似乎我可能需要MyObject
来实现IComparable
,但我不确定如何将它们放在一起。
有人可以建议一个很好的教程,或者指出我正确的方向吗?
答案 0 :(得分: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>
。你必须在这里创建自己的排序逻辑,一种方法是使用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();
}
希望它有所帮助。