asp.net 数组排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 数组排序相关的知识,希望对你有一定的参考价值。
有两个数据库,一个是sql2000,一个是access.
sql2000里有table1表,access有table2表,
同样都有个datetime类型的字段.
我现在要取这两张表里按order by [datetime] desc 排序的前20条.
也就是两表都取前20条,然后放在一数组里面,数组里也就有40条记录了
根据 datatime 最新的来排序.
最终取 datatime 最新的20条记录.
我现在两个表的数据都取出来了,该怎么赋到数组里排序呢?
请高手赐教,比较急,在线等 ...
合并两个表后再通过排序显示前20条出来的.
根据你的实际情况,因为你的数据是从数据库中获取,这里可以用DataTable和DataView来辅助你进行排序
//随机生成序列,你可以分别从SQL和Access中获取这两个DataTable
DataTable d1 = new DataTable();
DataTable d2 = new DataTable();
d1.Columns.Add("时间", typeof(DateTime));
d2.Columns.Add("时间", typeof(DateTime));
Random r = new Random();
for (int i = 0; i < 20; i++)
DataRow dr1 = d1.NewRow();
DataRow dr2 = d2.NewRow();
dr1["时间"] = DateTime.Today.AddDays(r.Next(1, 999));
dr2["时间"] = DateTime.Today.AddDays(r.Next(1, 999));
d1.Rows.Add(dr1);
d2.Rows.Add(dr2);
DataView dv1 = d1.DefaultView;
dv1.Sort = "时间 desc";
listBox1.DataSource = dv1;
listBox1.DisplayMember = "时间";
DataView dv2 = d2.DefaultView;
dv2.Sort = "时间 desc";
listBox2.DataSource = dv2;
listBox2.DisplayMember = "时间";
//把两个DataTable合并到一个
DataTable d3 = new DataTable();
d3.Columns.Add("时间", typeof(DateTime));
for (int i = 0; i < 20; i++)
d3.Rows.Add(d1.Rows[i].ItemArray);
d3.Rows.Add(d2.Rows[i].ItemArray);
//利用DataView排序
DataView dv3 = d3.DefaultView;
dv3.Sort = "时间 desc";
listBox3.DataSource = dv3;
listBox3.DisplayMember = "时间"; 参考技术A Array.Sort(Array,Array);
第一个array放排序字段,第二个array放记录数组 参考技术B List<string> sl = new List<string>();
sl.Add("Dataa");
sl.Add("Datab");
sl.Add("Datac");
SCompare sc = new SCompare();
sc.IsAsc = false; //正序为true 默认为true
sl.Sort(sc);
//建一个排序类
class SCompare : IComparer<string>
public bool IsAsc =true;
public int Compare(string xs, string ys)
int op = 1;
if (IsAsc) op = 1;
return xs.CompareTo(ys) * op;
参考技术C 主要是合并,学过数据结构就知道用两个栈比较后往第三个里面放,不好意思,现在没空给你写例程,大概就是这意思
使用 gridview asp.net 进行排序和分页
【中文标题】使用 gridview asp.net 进行排序和分页【英文标题】:sorting and paging with gridview asp.net 【发布时间】:2010-10-16 16:47:48 【问题描述】:我正在尝试让 gridview 手动排序和分页,但没有成功。
问题在于,当用户单击他们想要排序的列时,它会对该页面进行排序,但不会对 gridview 后面的数据源(数据视图)进行排序。因此,当他们前进到不同的页面时,他们的排序就会丢失。几乎我正在寻找一种实际上会对gridview后面的数据源进行排序的排序。这是我目前所拥有的:
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();
任何帮助将不胜感激。谢谢。
【问题讨论】:
【参考方案1】:将您的排序顺序保存在 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();
为什么不想使用现有的排序功能?您可以随时自定义它。
Sorting Data in a GridView Web Server Control 在 MSDN 上
这是一个自定义示例:
http://www.netomatix.com/development/GridViewSorting.aspx
【讨论】:
因为表格中有一些我不想在 Gridview 中显示的项目,所以我在将表格传递给数据源之前省略了它们......我已经尝试过了,但它按加载时的初始列,但后续页面保持该排序,但只是按新列排序【参考方案2】:<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>
后面的代码:
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;
【讨论】:
【参考方案3】:Tarkus 的回答效果很好。但是,我建议将 VIEWSTATE 替换为 SESSION。
当前页面的 VIEWSTATE 仅在当前页面回发到自身时有效,并且在用户被重定向到另一个页面后消失。 SESSION 不仅在当前页面的回发上保持排序顺序。它在整个会话期间持续存在。这意味着用户可以浏览其他页面,当他返回给定页面时,他上次使用的排序顺序仍然存在。这通常更方便。
还有其他方法,例如持久化用户配置文件。
我推荐这篇文章来很好地解释 ViewState 以及它如何与网页的生命周期一起工作:https://msdn.microsoft.com/en-us/library/ms972976.aspx
想了解VIEWSTATE、SESSION等变量持久化方式的区别,推荐这篇文章:https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx
【讨论】:
【参考方案4】:我找到了一种更简单的方法,它允许您仍然使用标准 gridview 的内置排序/分页...
创建 2 个标签。将它们设置为可见 = false。我打电话给我的 lblSort1 和 lblSortDirection1
然后编写 2 个简单的事件……页面排序,写入不可见标签的文本,页面索引更改,使用它们……
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
这比使用全局变量有点草率,但我发现使用 asp 尤其是全局变量是不可靠的......
【讨论】:
【参考方案5】:更简单的方法...:
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()
【讨论】:
以上是关于asp.net 数组排序的主要内容,如果未能解决你的问题,请参考以下文章