呵呵,这就是你的经验问题了
不应该全部绑定到DataGrid,而一次的改变页面只要映射或者ImportRow 每次DataGrid 要用到的记录就行了如果每次必然用到全部记录,为了加快速度,你可以将全部的记录映射进DataTable,然后每改变页码就从DataTable 映射不必再开数据库

解决方案 »

  1.   

    to ArLi2003(阿利 风雨中的无爪飞龙) 
    先谢谢你的建议,我有些地方可能没说清楚,有以下3点补充
    1.这里要求必须显示全部的数据
    2.程序是用Winform ,用分页并不是很方便
    3.这里主要是指加载时速度很慢(可能只加载一次)
      

  2.   

    1,这里要求必须显示全部的数据不应该全部绑定到DataGrid,而一次的改变页面只要映射或者ImportRow 每次DataGrid 要用到的记录就行了,你不会是想15000全显示出来吧?2.程序是用Winform ,用分页并不是很方便正是因为是winform 所以才那么说,如果是webform 根本不存在这问题。3.这里主要是指加载时速度很慢(可能只加载一次)全部绑定加载当然慢了,而且资源也狂占给你一个我的分页程序,希望对你有用:private void ReloadRecoard(int PageAdd) {
    int i;
    nowRecord = nowRecord + PageAdd; if (nowRecord<0){
    nowRecord=0;
    }else if (nowRecord>=MaxRecordPageSize){
    nowRecord = MaxRecordPageSize;
    } DataTable dtTemp = dtSource.Clone();
    for (i = nowRecord * RecordPageSize ; i < (nowRecord +1) * RecordPageSize; i++){
    try{
    dtTemp.ImportRow(dtSource.Rows[i-1]);
    }catch{}
    }

    DataView dv = new DataView(dtTemp); dataGrid1.DataSource = dv;
    label1.Text = (nowRecord + 1).ToString() + "/" + (MaxRecordPageSize + 1).ToString();
    }
      

  3.   

    其中的dtSource 就是库的全部记录缓存,它是一个DataTable
      

  4.   

    如果速度确实不行的话,你可以考虑采用“异步(多线程)”装载数据的方式。这样,用户界面依然响应用户的操作,也可以处理一些与正在装载的数据无关的处理。可能这些数据无关处理结束时,以下的流程必须要用到正在装载的数据,但数据仍未装载结束。对于“异步”方式,应付这种情况可以使用 ManualResetEvent 来等待装载的结束。
    在主线程中,yourEvent.WaitOne(); 在异步回调中 yourEvent.Set();对于“多线程”方式,你可以将“threadLoadData.Join();” 插入到主线程处理中必须等待数据装载结束的流程中。
      

  5.   

    这是一个系统设计问题,一次性显示这么多数据,当然慢了,要是你的数据日后再加倍,我估计,你的软件要被kill了。分页是个办法,但需要显示这么多数据,我仍怀泥你的分析。
      

  6.   

    首先感谢大家的指导和建议。to  ArLi2003(阿利 风雨中的无爪飞龙) :
        你所说的这些,我都有所考虑,比如你提出的这个分页方案的确是一个很好的方案,但有一点我不明白你的 dtSource 中是不是装载了所有的数据?如果是的话那么就有个问题,当我们把数据从数据库读出并且 Fill 到 dtSource 时这个过程需要的时间是很长的,而我的问题关键就在这个地方,如果不是,那么又是什么情况?to AhBian(阿扁):
        用异步线程也想过,我们做了分析:在异步线程装载数据的这段时间内,用户有50%的操作与装载的数据有关,这样的话用户是要等待的,然!用户提出的要求是不要让用户操作等待时间过长,还有在整个界面操作中还涉及到表的切换,即有很多不同的操作,每个操作都有不同的表,并且数据量都很大,当在装载过程中用户切换了操作哪又应如何处理?to junqiang(飞不起来的刀):
       你说的非常正确,客户的要求就是要全部显示,应为他们有这样一个要求:比如表中有10个字段,那么他们在操作时可以根据任意字段针对全部的数据进行排序(通过点击 DataGrid的列头) 重要的是"对全部数据进行排序",而我们又没办法捕捉到这个点击事件和相关参数,如果可以的话那么就容易处理了,分页的方式当点击排序后只能针对当前页进行排序,当页面改变时又要重新执行这个排序操作才行,而这是用户所不希望出现的就是因为存在这些问题,才如此让人头疼,请大家尽量帮帮忙,最好给出一个全面的合理的解决方案,或者是帮忙想个足够的理由或方式来使用户接受分页或等待操作(这个方法是迫不得已的方法,最好不用)的处理方式,不胜感激!
      

  7.   

    winform程序多线程应为首选
    系统等待时,显示一个状态条,挺好的
      

  8.   

    有没有搞错啊???
    读取15000条数据并显示在DataGrid中,你应该用DataReader啊?(速度可以快上好多哦 )^_^ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpcontheadonetdatareader.htm
      

  9.   

    本机建立一个非类型化的DataSet(*.xsd),用DataReader将数据读取到本机的DataSet,然后将DataGrid绑定到此DataSet。这样从数据库读取数据慢的现象就可以缓解了,希望对你能有所帮助
      

  10.   

    up樓樓上的說法!
     樓上的.用Datareader當然好過直新databind,但是它只能從上到下啊,如要返回就不可用.我們大家可能都沒有明白樓主的真正意思啊!
      

  11.   

    To lxy0423((zjl)) ( ):'要将这些数据取出并显示在 DataGrid (可点击列头对相应字段针对整个数据排序)中,如果一次性取出要很长时间(十几秒甚至更长时间),请问这里应该如何处理这种大数据的快速存取显示?'<<<----------楼主意思是只是要取出并显示啊?
      

  12.   

    谢谢各位的热心帮助先:),虽然还没有一个完全可行的方案  :(呵呵! lxy0423((zjl))  说的有道理,用户是想对数据能灵活的作各种操作:排序(重要,重申是对所有数据范围内排序,并且任意字段),查找筛选,添加,删除,修改等等操作
      

  13.   

    查找筛选操作可以在本地进行,添加,删除,修改...操作可以通过SQL语句或者是存储过程(update+Transaction)直接对数据库进行操作,成功后在本地DataSet中的相应数据执行添加,删除,修改操作就可以了。
      

  14.   

    》to  ArLi2003(阿利 风雨中的无爪飞龙) :
    》    你所说的这些,我都有所考虑,比如你提出的这个分页方案的确是一个很好的方案,但
    》有一点我不明白你的 dtSource 中是不是装载了所有的数据?如果是的话那么就有个问题,
    》当我们把数据从数据库读出并且 Fill 到 dtSource 时这个过程需要的时间是很长的,而我
    》的问题关键就在这个地方,如果不是,那么又是什么情况?dtSource 是一个全局记录集,fill 并不会很慢啊,你总不会是想每载入一页再读次数据库吧?我上面那个分页是来自MSDN的解决方案
      

  15.   

    to  ArLi2003(阿利 风雨中的无爪飞龙) :
    通过测试 12000条数据 Fill 一次(再我们这里的硬件和网络情况下,远程数据库)要8-12秒
      

  16.   

    既要灵活操作、又要速度快,我看这问题只好学acdsee了——“预读”可不可以?
    1)在用户启动当前功能窗口之前的某一时机,启动SQL Server预读数据的线程,将数据cache在客户端,这样就省去了Datagrid数据邦定时从后台数据库读数据的时间
    2)如果用户连datagrid 邦定的时间都不愿意忍受(谁让用户是上帝呢),我看甚至可以提前生成此功能窗口,将数据显示在datagrid中,只不过,把这个窗口设置成不可见。等到需要时,直接显示已存在的winform,这样岂不快哉?
    一点愚见,多指教……
      

  17.   

    是不是可以这样,用两个DataGrid:
    第一个只显示20-100条数据,程序启动,展示你美丽动人的界面后台开个线程去填充第二个DataGrid,填好后,一隐二显,如何
      

  18.   

    此种程序设计要求性能和交互速度.不能用所畏的客户端的高级技术.重点应该在SQL服务器.
    方案:在服务器端设计一个存储过程,用于返回分页并排序后的数据记录.此存储过程设计思想如下:与数据库初始读取的相关参数(若干或没有,依程序具体情况和设计者的设计理念).其它参数包括<每页待显示的记录数,待显示的页码号(即客户端当前显示的页号),待排序的字段,排序模式(升序还是降序)>.这些参数够用了.存储过程内部设计:先读取数据库的所有记录,把所有记录倒入一个临时表(因为需要通过临时表建立的ID键值对数据进行分页检索,原表ID不能用,可能有已经删除的记录,ID不连续),对临时表按要求排序.然后,根据页码和每页欲显示的记录数据数,返回某固定页的当前记录(一种乘法和加法的数学游戏,因为ID从1开始,很简单,不多讲).因为存储过程返回只是当前页面的记录(几十条罢了),速度就不会是问题,而且返回前已经进行过总体记录排序,在客户端可以达到用户的要求.每次用户进行排序或换页的时候,重新调用此存储过程返回新的记录即可.当然,由于是调用存储过程,且客户端程序初始化时可能需要记录总数,所以,要么再为此存储过程加一个OUT参数返回记录总数,要么通过另一个存储过程专门返回数据库记录总数以对客户端相关参数进行初始化.(对了,每页待显示的记录数,由开发者或客户自定)
      

  19.   

    TO: goben(雪松) 你的想法不错,可是在Fill的时候还是会很慢的(>=5000)条时。我觉得还是不能用SqlDataAdapter。
      

  20.   

    TO:qimini(循序渐进)
    你误解我的意思了.由存储过程返回来的是当前页面所要显示的记录数,也就是说,当前是分页的.每页显示的记录数不会过大.在Fill的时候怎么会因为数据库中的记录多少而速度变慢呢?不是一次性传输而后断开连接再也不用连了.而是每进行一次操作,如排序,换页,都用相应参数调用存储过程.以返回所要求的仅仅为本页服务的记录数.这种开发我作过.是经验的说法,不是凭空想出来的.
      

  21.   

    TO: goben(雪松)可是楼主的意思是最好不用分页啊!!!
      

  22.   

    TO:qimini(循序渐进)楼主不用分页的原因我想是因为需要所有字段进行排序,固没有使用分页.但,如果我们达到了他的要求,又何必在乎是否使用分页呢.现在只要求对总体记录进行排序并且能够正确返回就好.而且我们可以想清楚,没有分页的应用程序是不够美观和方便的.只要我们功能得以实现,有没有分页对于客户来说是一念之间的选择问题,我想这个问题不大.问题在于如何实现功能而且不失效率!
      

  23.   

    to goben(雪松):
        你说的很正确,其实并不是说不能使用分页,现在最重要的是分页后的排序问题,我们在排序时通常点击 DataGrid 每列的头达到按照所点击列的升序或降序排序,你提出的方法是可取的,但是当我们点击 DataGrid 每列的头时,怎样捕捉这个事件让他重新执行一次数据库操作呢?希望能够说明,
      

  24.   

    TO: chen_peng_inform(心宇)面对您的问题我想提出一些我的见意和想法,当然这些观点是建立在尊重您和贵公司立场及客户要求与利益基础上的.提示与建意如下:
    由上次的回帖已经初步解决数据库信息提取速度的问题,现在我们把重点放在排序上.客户要求通过点击列头相应字段可以对整个数据记录排序,这个要求并不过分.但是否合理并切易用,有待于技术人员的讲解与沟通,软件最终的设计方式并非由客户本身全全决定,他们要的是功能.他们也许不如我们专业.微软在制作DATAGRID的时候并非提供可以通过单击字段进而实现所有数据排序的功能,并非疏忽,因为对于任何使用软件的人来讲,当前界而所反映的信息才是他所感兴趣的,也就是说,我们只在乎当前页的信息处理,以至于在信息处理时,处理前与处理后应具有连续性(他们是同一组数据,但通过单击某一字段进行总体排序后他们不再具有信息的连续性了).一个具有说服性的例子:有字段(销售总额),(成本).现在客户想查看销售前二十位(假设一页显示为二十条记录)的产品相关信息,应当对(销售总额)进行降序排列.而后,因为前二十条的数据并非我们想要的最终数据,我们关心的是此二十条数据中成本最低的几个产品,以至于在进一步降低公司生产成本风险的同时作好其推广工作为公司带来更多的回报.那么该如何选择呢?
    答案是通过点击(成本)字段对当前页的记录按成本进行升序排列,找出最前面的N条记录<注:客户注重的是当前页的产品信息,所以,他要查的当然是当前二十条记录的成本,所排序的应为本页产品,而非所有数据库产品>.从另一个角度来说,如果此时产品按记录总数的成本升序排列后,又如何以醒目的方式知道哪些是销售额最高的产品呢,是不是再一条一条的查,通过手写的方式把销售额高的二十条与成本低的二十条都找出来,通过纸上对比,找出目标呢?客户的要求并不为过,要求针对任一数据字段进行排序以便进一步进行信息统计.那我们善意的为他们通过其它的方式实现(比如下拉列表框选择...),这样就不会出现因为DATAGRID无单击事件而产生无法实现的技术细节.我想,通过与客户的沟通,告诉他们,双重索引(总索引,单页索引)的必要与易用性,客户不会不接受,易用性是产品得以进一步深入客户的前提条件.在实现他们要求的同时,为他们提供了易用性,双方各有所图,何不乐矣.我的观点是站在曾经的开发与客服的基础上,并以程序员的角度来解决问题.问题有了不怕,关键在于静下心来解决,望我的见解能给您带来益处,而与此同时,因个人风格问题话题有别您与贵公司设计理念请见谅!真心希望你与贵公司早日解决问题.<补:至于进行总排序后是否回到第一页还是当前页,就看程序设计与客户要求了.存储过程提供了丰富的功能,只需参数对应即可>