none
如何将DataTable排序且保持行状态 RRS feed

  • 问题

  • 我是想把一个乱续表按照指定列排序然后用Adapter更新。所以想将一个DataTable变成按某列排序的DataTable?尝试排到新表,使用DataTable的select可以实现,但是发现行状态没有复制过去?全是未更改的。如何实现这种需求呢?
    陈锦巍
    2012年2月5日 14:47

答案

全部回复

  • 试试看先把DB旧数据Delete后再一行一行Insert DataTable排序过后的数据

    不然直接Update的话,DB里仍然还是乱续表



    2012年2月5日 16:32
  • dear

    不知你排序后也要更新DB的需求目的是啥?只是要练习?

    若是,你可以删掉DB的Row,然后再把Datatable的资料倒回去DB

    若不是,照理讲排序后是不应该动到DB原始资料,试着想如果有很多User同时间都在排序,DB会变成如何?建议千万别把这样的流程弄到你的专案

     


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2012年2月5日 17:23
  • 請問您所指的狀態是DataTable中的狀態嗎?

    有Code可以看一下嗎? Thanks.


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2012年2月6日 1:42
  • DataRow[] rows = dataTable1.Select("", "ord asc");

    DataTable t = DataTable1.Clone();

    t.Clear();

    foreach (DataRow row in rows)

    t.ImportRow(row);

    DataTable1 = t;
    Hi,
     
    DataView dv = dt.DefaultView;
    dv.Sort = "c1 Asc";
    DataTable dt2 = dv.ToTable();

    ----

    //拿到数据源
    DataView dv = this.dtDataSource.Copy().DefaultView;
    //排序
    dv.Sort = "款 asc,項 asc,目 asc";
    //过滤重复数据
    //DataTable dt = dv.ToTable(true, "款", "項", "目");
    //不过滤重复数据
    DataTable dt = dv.Table.Copy();

     


    orichisonic http://blog.csdn.net/orichisonic
    2012年2月6日 1:43
  • 是这样一种情形,用户界面是以bindingsource为桥绑定DataTable到DataGridView,我想实现绑定情况下DataGridView插入行,所以弄了个行号列记录用户数据的行顺序。这样一来就的通过维护行号来实现,使用BindingSource的List转为DataView,反序更改需更改的行号。比如我在第二行插入移行,那用BindSource AddNew,这个新行物理顺序是在最后的,而我可以先将二行及之后的行号都加1,再将最后移行行号变为第二行,给用户显示是按行号排序的,行号就是逻辑顺序。

    但Adapter 更新时会按物理顺序更新,就会引起主键重复这样的问题。明白其中的原因应该是按DataTable的物理顺序一行行的更新的,所以会引起主键重复问题,所以我试图改变物理顺序,才提出这个问题。

    关于这种需求的解决方案也想过不使用表单号加行号为联合主键(不作主键就不会报重复),另加一主键列,表单号为外键。这样更改表结构也是种方法。只是加了一个为了主键而加的主键,这个主键在业务角度来说有点多余。而且为了提供插入功能还要更改表结构有点不妥。那种插入行时通过操作DataTable来插入行的方式在我已经使用BingdingSource为桥这种绑定形式上无法获取DataTable,不便直接操作。所以想是不是可以更新时能改变更新顺序,避免主键冲突。


    陈锦巍
    2012年2月6日 8:04
  • 我是使用Remoting作的分布式应用,也试图将要更新的表排序到新表送交数据层更新。但发现到新表后行状态全是未修改,一行也没有更新。如果获取了需更改的行ImportRow到新表,ImportRow的意义就像是抽取到新表,不合适,这时界面层就会丢失这些行吧?到现在也没决定采用何种方式实现更合理。


    陈锦巍
    2012年2月6日 8:09
  • 这样做:

    using (SqlDataAdapter adapter = new SqlDataAdapter("select * from xxx","字符连接串"))

    {
          DataTable dt = new DataTable();
          adapter.Fill(dt);   //元数据

          DataView dv = new DataView(dt);
          dv.Sort="某列"; 

         DataTable dt2 = dv.ToTable();

           dt.Clear();

           foreach(DataRow row in dt2)
           {
              dt.Rows.Add(row);
           } 

          adapter.Update(dt); 

    }


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    • 已标记为答案 陈锦巍 2012年2月15日 13:41
    2012年2月6日 8:34
    版主
  • 感谢各位对我的问题的答复,另感谢Wei_dong,也许您知道,我就是那个提出如何实现“所输即所得”效果的。

    由于我是使用bindingSource为桥的方式绑定数据表,所以照现在的设计,为避免主键重复,也只能在数据提交更新前更改更新顺序解决了。试图将要更新的数据表依行号顺序倒序排序更新,没实现。就在一筹不展之时,想到Adapter 的Update重载方法有DataRow数组,所以就从数据层下手,重写了更新方法,把更新明细表用dataTable的Select方法按行号倒序排序得到DataRow[],用Adapter Update更新。成功了,解决了主键重复问题,实现了“所输即所得”这种效果。


    陈锦巍
    2012年2月6日 14:18
  • dear

    你的提问跟后来的结果好像不太一样,或许描述清楚一点误会会比较少


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2012年2月6日 17:25
  • dear

    你的提问跟后来的结果好像不太一样,或许描述清楚一点误会会比较少


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    是啊,这个问题是针对我的那个更新需求的,想按逻辑行逆序更新以解决主键重复问题。原问题已发出过提问,这个问题地提出是我解决那个问题的一种想法。

    还是谢谢大家。


    陈锦巍

    2012年2月7日 3:09
  • Hi,

    可以参考下面的链接:
    DataGirdview如何正确实现“所输即所见”
    http://social.msdn.microsoft.com/Forums/zh-CN/visualstudio2010zhchs/thread/9fb6c308-cc70-4261-a4c0-ac98d805e3a6/#9fb6c308-cc70-4261-a4c0-ac98d805e3a6

    Thanks.

    yoyo


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 陈锦巍 2012年2月15日 13:41
    2012年2月8日 1:32
    版主