DataTable 排序问题
using System;using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
namespace MdyTest
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt = GetDataTable();
ViewState["DataTable"] = dt;
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
private DataTable GetDataTable()
{
DataTable dt = new DataTable();
dt.Columns.Add("A",typeof(int));
for (int i = 1; i <= 50; i++)
{
DataRow dr = dt.NewRow();
dr["A"] = i;
dt.Rows.Add(dr);
}
return dt;
}
protected void btnRandom_Click(object sender, EventArgs e)
{
DataTable dt = ViewState["DataTable"] as DataTable;
ViewState["DataTable"] = GetRandomDataTable(dt, "A");
GridView1.DataSource = ViewState["DataTable"] as DataTable;
GridView1.DataBind();
}
#region 生成随机的DataTable
/// <summary>
/// 生成随机的DataTable
/// </summary>
/// <param name="dt"></param>
/// <param name="columnName"></param>
/// <returns></returns>
private DataTable GetRandomDataTable(DataTable dt,string columnName)
{
List<int> list = GetRandomList(dt.Rows.Count);
if (columnName == "A")
{
for (int i = 0; i < list.Count; i++)
{
dt.Rows[i]["A"] = list[i];
}
}
else if (columnName == "B")
{
for (int i = 0; i < list.Count; i++)
{
dt.Rows[i]["B"] = list[i];
}
}
return dt;
}
#endregion
protected void btnAddColumn_Click(object sender, EventArgs e)
{
DataTable dt = ViewState["DataTable"] as DataTable;
dt.Columns.Add("B",typeof(int));
ViewState["DataTable"] = GetRandomDataTable(dt, "B");
GridView1.DataSource = ViewState["DataTable"] as DataTable;
GridView1.DataBind();
}
protected void btnDesc_Click(object sender, EventArgs e)
{
DataTable dt = ViewState["DataTable"] as DataTable;
DataTable newDt = new DataTable();
newDt = dt.Clone();//拷贝表dt结构到新表newDt
for (int i = 0; i < dt.Rows.Count; i++)
{
newDt.ImportRow(dt.Rows[i]);
}
newDt.DefaultView.Sort = "A desc,B desc";
GridView1.DataSource = newDt;
GridView1.DataBind();
}
#region 生成不重复的随机List集合
/// <summary>
/// 生成不重复的随机List集合
/// </summary>
/// <param name="codeLength"></param>
/// <returns></returns>
private List<int> GetRandomList(int codeLength)
{
List<int> randList = new List<int>();
int i = 0;
Random random = new Random();
while (i < codeLength)
{
int randomNumber = random.Next(1, codeLength+1);
if (!randList.Contains(randomNumber))
{
i++;
randList.Add(randomNumber);
}
}
return randList;
}
#endregion
}
}
newDt.DefaultView.Sort = "A desc,B desc";
最后B列数据并没有降序排列,这是为什么 --------------------编程问答-------------------- 你指定A 和B同时降序, A按着降序排了吗? --------------------编程问答--------------------
A列降序排列的,B列还是随机的 --------------------编程问答-------------------- --------------------编程问答-------------------- 自己顶一下。。。。 --------------------编程问答--------------------
设置排序要同时设置。 --------------------编程问答-------------------- DataView dv = newDt.DefaultView;
dv.Sort = "A desc,B desc";
DataTable newTable = dv.ToTable();
这样试试看
--------------------编程问答-------------------- --------------------编程问答--------------------
还是不行啊,A是降序的,B随机 --------------------编程问答-------------------- 问:eval1003
http://006sf.com/是什么网站
你也不用这么做广告啊,把网址混在文字里面,让别人误点。 --------------------编程问答-------------------- newDt.select("1=1 order by A,B desc") --------------------编程问答--------------------
语法错误:“order”运算符后缺少操作数 --------------------编程问答-------------------- 我查了下DataTable Select方法,
Select("过滤条件","排序列")
Select("1=1","A desc,B desc")
这样调用,但是B列还是没有降序
这个太诡异了吧。。。。
--------------------编程问答-------------------- 顶,没有能够解决吗? --------------------编程问答-------------------- 本来就是这样的,A降序,B是在A相同的情况下才会降序的 --------------------编程问答-------------------- 怎么可能AB同时降序呢,那样的数据怎么排序额 --------------------编程问答-------------------- 看博客吧:http://blog.csdn.net/cqjiyong/article/details/7102392 --------------------编程问答-------------------- 排序只能以一列为主呵,B的降序只是辅助的,A相同的情况下才会再按B来降序 --------------------编程问答--------------------
你说的对,我有点钻牛角尖了 --------------------编程问答--------------------
DataRow[] dr = newDt.Select("status=0", "A,B desc");--------------------编程问答-------------------- DataRow[] dr = newDt.Select("1=1", "A,B desc"); --------------------编程问答--------------------
这种情况下是:
orderby a asc ,b desc了吧? --------------------编程问答--------------------
经测试,,这个是可以的、、、 --------------------编程问答-------------------- DataRow[] dr = newDt.Select("1=1", "A desc,B desc");
--------------------编程问答--------------------
写错了。。。 --------------------编程问答--------------------
对,以下是MSDN上的示例:
private void SortByTwoColumns()
{
// Get the DefaultViewManager of a DataTable.
DataView view = DataTable1.DefaultView;
// By default, the first column sorted ascending.
view.Sort = "State, ZipCode DESC";
}
By default, the first column sorted ascending. --------------------编程问答-------------------- 自己算出来。 --------------------编程问答--------------------
public DataTable GetTable()
{
DataTable dt = new DataTable();
dt.Columns.Add("凭证号");
dt.Columns.Add("名称");
dt.Columns.Add("序号");
DataRow row1 = dt.NewRow();
row1["凭证号"] = "1";
row1["名称"] = "3";
DataRow row2 = dt.NewRow();
row2["凭证号"] = "1";
row2["名称"] = "3";
DataRow row3 = dt.NewRow();
row3["凭证号"] = "2";
row3["名称"] = "2";
DataRow row4 = dt.NewRow();
row4["凭证号"] = "2";
row4["名称"] = "2";
DataRow row7 = dt.NewRow();
row7["凭证号"] = "2";
row7["名称"] = "1";
DataRow row6 = dt.NewRow();
row6["凭证号"] = "2";
row6["名称"] = "5";
DataRow row5 = dt.NewRow();
row5["凭证号"] = "3";
row5["名称"] = "1";
dt.Rows.Add(row1);
dt.Rows.Add(row5);
dt.Rows.Add(row4);
dt.Rows.Add(row3);
dt.Rows.Add(row2);
dt.Rows.Add(row6);
dt.Rows.Add(row7);
return dt;
}
protected void Page_Load(object sender, EventArgs e)
{
DataTable dt1 = GetTable();
DataView dv1 = dt1.DefaultView;
dv1.Sort = " 凭证号 ASC,名称 ASC ";
DataTable dt4 = dt1.Clone();
for (int i = 0; i < dv1.Count; i++)
{
DataRow dr=dt4.NewRow();
for (int j = 0; j < dv1[i].Row.ItemArray.Length; j++)
{
dr[j] = dv1[i][j];
}
dt4.Rows.Add(dr);
}
//dt4为排序后的表
}
补充:.NET技术 , C#