当前位置:编程学习 > C#/ASP.NET >>

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按着降序排了吗? --------------------编程问答--------------------
引用 1 楼 lovesongforever 的回复:
你指定A 和B同时降序, A按着降序排了吗?

A列降序排列的,B列还是随机的 --------------------编程问答-------------------- --------------------编程问答-------------------- 自己顶一下。。。。 --------------------编程问答--------------------
设置排序要同时设置。 --------------------编程问答--------------------  DataView dv = newDt.DefaultView;
dv.Sort = "A desc,B desc";
DataTable newTable = dv.ToTable();

这样试试看

--------------------编程问答-------------------- --------------------编程问答--------------------
引用 6 楼 yibey 的回复:
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") --------------------编程问答--------------------
引用 10 楼 happy09li 的回复:
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来降序 --------------------编程问答--------------------
引用 17 楼 jxj0115 的回复:
排序只能以一列为主呵,B的降序只是辅助的,A相同的情况下才会再按B来降序


你说的对,我有点钻牛角尖了 --------------------编程问答--------------------
DataRow[] dr = newDt.Select("status=0", "A,B desc");
--------------------编程问答-------------------- DataRow[] dr = newDt.Select("1=1", "A,B desc"); --------------------编程问答--------------------
引用 20 楼 happy09li 的回复:
DataRow[] dr = newDt.Select("1=1", "A,B desc");

这种情况下是:
orderby a asc ,b desc了吧? --------------------编程问答--------------------
引用 20 楼 happy09li 的回复:
DataRow[] dr = newDt.Select("1=1", "A,B desc");


经测试,,这个是可以的、、、 --------------------编程问答-------------------- DataRow[] dr = newDt.Select("1=1", "A desc,B desc");



--------------------编程问答--------------------
引用 21 楼 q107770540 的回复:
引用 20 楼 happy09li 的回复:
DataRow[] dr = newDt.Select("1=1", "A,B desc");

这种情况下是:
orderby a asc ,b desc了吧?


写错了。。。 --------------------编程问答--------------------
引用 21 楼 q107770540 的回复:
引用 20 楼 happy09li 的回复:
DataRow[] dr = newDt.Select("1=1", "A,B desc");

这种情况下是:
orderby a asc ,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. --------------------编程问答-------------------- 自己算出来。 --------------------编程问答--------------------
引用 6 楼  的回复:
 DataView dv = newDt.DefaultView;
dv.Sort = "A desc,B desc";
DataTable newTable = dv.ToTable();

这样试试看

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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,