MessageBox.Show(this.dataSet1.Tables[0].Rows[0].ItemArray[0].ToString());
              this.dataSet1.Tables[0].DefaultView.Sort="用户名 desc";
 MessageBox.Show(this.dataSet1.Tables[0].Rows[0].ItemArray[0].ToString());这是我测试的代码,排序后DATAGRID上的序顺变了。但this.dataSet1.Tables[0].Rows[0].ItemArray[0]对应的记录还是没变。

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/1759/1759325.xml?temp=7.030666E-03
      

  2.   

    本方法可以满足在dataGrid上按任意字段排序后正确打印出报表:(目前还有一个问题,就是必须选中记录后打印,如果全部打就全部选中,)首先要在dataGrid榜定的数据源上定义主键,如果是单表,只要数据库中有就行,多表的话需要自己代码定义,public static void printReport(DataSet ds,DataGrid dg,string tabName,ReportDocument MyCr,CrystalReportViewer crv)
    {
    //筛选选中数据到指定数据集中,再从该数据集中读取数据进行打印
    DataSet ds1=ds.Clone();
    for (int i=0;i<ds.Tables[tabName].Rows.Count-1;i++)
    {
         if (dg.IsSelected(i)==true)
        {   
    ds1.Tables[tabName].NewRow();

    ds1.Tables[tabName].Rows.Add(ds.Tables[tabName].Rows.Find(dg[i,0]).ItemArray);
        }
                    
    }
    ds1.Tables[tabName].AcceptChanges();crv.ReportSource=MyCr;
    MyCr.SetDataSource(ds1.Tables[tabName]);}
      

  3.   

    基本思路是复制一个数据集,让他来装载排序后的数据,只需要提交到离线的dataSet中,不需提交到数据库,打印后就自动释放掉了。
    ds1.Tables[tabName].Rows.Add(ds.Tables[tabName].Rows.Find(dg[i,0]).ItemArray);
    这句代码最重要,作用就是把选中的数据行添加到打印数据表中去,ReportDocument MyCr就是你做的报表模板,本例采用水晶报表,调用如下:
    printReport(dataSet1,dataGrid1,"department",MyCr,aform.crystalReportViewer1);
    主意要将crystalReportViewer1设为public
      

  4.   

    ReportDocument rptDoc=new ReportDocument();
    rptDoc.Load(reportname);
    rptDoc.SetDataSource=dgrd.DataSource;
    rptDoc.PrintToPrinter(0);
      

  5.   

    我的办法是直接打印DataGrid上的内容,通过DataGrid的数据源DataTale得到列数和行数,然后通过DataGrid[x,y](WinForm程序)来得到DataGrid的各个数据,然后循环打印出来。这样不管用户在界面的DataGrid排序也好,删除某行也好,都能反映出来!!!!
      

  6.   

    做一个循环,用CurrencyManager 找出dataGrid显示的行在DataSet中的位置,然后打印~