none
我就是想实现一个含有几行统计的报表使用dataGridView,怎么这么难用呢? RRS feed

  • 问题

  • 需求其它很简单
    我有若干文本文件,格式如下
    10-10-18 17:28:29 Flow  0 m3/h Vel:  0 m/s NET:  0x m POS:  0x m NEG:  0x m     T.D.: 0000000
    10-10-18 17:28:36 Flow  0 m3/h Vel:  0 m/s NET:  0x m POS:  0x m NEG:  0x m     T.D.: 0000000
    10-10-18 17:28:38 Flow  0 m3/h Vel:  0 m/s NET:  0x m POS:  0x m NEG:  0x m     T.D.: 0000000

    想通过报表展示出来,但是报表的结尾需要统计最大值,最大值发生时间,最小值,最小值发生时间。像这样

    图示


    所以,
    因为界面会需要根据不同的起始时间来过滤这部分数据,而且统计部分需要找到最大值及最大值发生时间,
    我考虑将不同的文件读入到一个含有数个datatable的dataset中。(使用正则分析每一行的数据,使用dataTable.Compute方法取到
    最大值,再根据dataTable.Select方法,来找到符合最大值的行。
    )看起来一切都很好,通过dataGridView.dataSource来绑定数据一切正常。

    最后,在做那几行统计时,才发现dataGridView绑定数据源后,无法再通过Add的方法来追加行。

    狂晕啊。泪如雨下。

    有winform开发经验的朋友(我是做webform的),请指我一条光明的道路啊。
    反正我对winform也不熟,无所谓使用哪种控件,ReportViewer可以吗?或者有更好的方案请告诉我。谢谢。

    • 已编辑 heywap 2010年10月21日 8:07 忘了加target=_blank
    2010年10月21日 8:06

答案

  • 你好!

    确实是这样的,绑定后增加数据通过向 DataTable 添加行实现。若界面没有及时更新建议使用 BindingSource 控件进行绑定。


    知识改变命运,奋斗成就人生!
    2010年10月21日 9:03
    版主
  • 既然是报表,建议使用RDLC报表做吧,就是你说的ReportViewer承载的东西,在你的项目中新建项,可以找到报表文件一项,具体使用起来和大多数的报表工具类似。

    DataGridView毕竟只是为了普通的列表数据显示的,让它去承担显示报表的任务,哪怕仅仅是多了一个合计行,对你对它都很为难的。所以,如果可以的话,试试RDLC吧。



    理解的越多,需要记忆的就越少
    2010年10月22日 8:44
    版主
  • 感谢您的回复。

    我的datatable的第一列的数据类型是datetime.第二列是double

    如果直接使用datasource,那么datatable的最后一行我的数据是这样的:

    第一列   第二列

    最大值   51.4

    显然,"最大值"是不能保存到datetime中的。


    dear
    若你坚持要用DataGridView我想到有几条路,您参考参考

    1.在DataTable新增一行(Column)用来存放统计资料格式,并在最后一列(Row)存放资料,然后重新绑定DataGridView,但如此一来你的统计资料不会如你所想的摆在第一行。
          DataTable sourceTable = new DataTable();
          //复制一份DataTable用来处理运算逻辑
          DataTable targetTable = sourceTable.Clone();
          /*
           * 新增统计的行/列
          */
          BindingSource bs = new BindingSource();
          //资料绑定
          bs.DataSource = targetTable;
          dataGridView1.DataSource = bs;

    3.变更原有的DataColumn资料形态为string,时间资料存入时转成string,但要确定使用者输入的格式是时间格式。
    2.把统计资料放在在别的DataTable



    秘訣無它,唯勤而已
    2010年10月22日 9:09

全部回复

  • 你好!

    确实是这样的,绑定后增加数据通过向 DataTable 添加行实现。若界面没有及时更新建议使用 BindingSource 控件进行绑定。


    知识改变命运,奋斗成就人生!
    2010年10月21日 9:03
    版主
  • 感谢您的回复

    使用DataTable是无法满足我的要求的。因为DataTable的列的数据类型已经定义好了。

    我不可能能在一个列类型为int的列添加一个string类型,再将DataTable绑定上。

    有没有其它的办法,如ReportViewer。。。

    2010年10月21日 13:09
  • 一般都列的统计有两种方式。

    1 将更更的汇总值通过 dataTable.Compute 算出来,用 label 控件显示。

    2 在 dataTable 添加一行,内容为各列的统计。这样做的缺点是合计的行会受排序影响。

    另外的就是用如 ReportView 这样的报表组件了。


    知识改变命运,奋斗成就人生!
    2010年10月22日 3:25
    版主
  • 感謝您的回覆

    使用DataTable是無法滿足我的要求的。因為DataTable的列的數據類型已經定義好了。

    我不可能能在一個列類型為int的列添加一個string類型,再將DataTable綁定上。

    有沒有其它的辦法,如ReportViewer。。。

    dear
    使用BindingSource绑定资料试看看

     

          DataTable sourceTable = new DataTable();
          //复制一份DataTable用来处理运算逻辑
          DataTable targetTable = sourceTable.Clone();
          /*
           * 处理运算
          */
          BindingSource bs = new BindingSource();
          //资料绑定
          bs.DataSource = targetTable;
          dataGridView1.DataSource = bs;
    


    秘訣無它,唯勤而已
    2010年10月22日 8:20
  • 感谢您的回复。

    我的datatable的第一列的数据类型是datetime.第二列是double

    如果直接使用datasource,那么datatable的最后一行我的数据是这样的:

    第一列   第二列

    最大值   51.4

    显然,"最大值"是不能保存到datetime中的。

    2010年10月22日 8:44
  • 既然是报表,建议使用RDLC报表做吧,就是你说的ReportViewer承载的东西,在你的项目中新建项,可以找到报表文件一项,具体使用起来和大多数的报表工具类似。

    DataGridView毕竟只是为了普通的列表数据显示的,让它去承担显示报表的任务,哪怕仅仅是多了一个合计行,对你对它都很为难的。所以,如果可以的话,试试RDLC吧。



    理解的越多,需要记忆的就越少
    2010年10月22日 8:44
    版主
  • 感谢您的回复。

    我的datatable的第一列的数据类型是datetime.第二列是double

    如果直接使用datasource,那么datatable的最后一行我的数据是这样的:

    第一列   第二列

    最大值   51.4

    显然,"最大值"是不能保存到datetime中的。


    dear
    若你坚持要用DataGridView我想到有几条路,您参考参考

    1.在DataTable新增一行(Column)用来存放统计资料格式,并在最后一列(Row)存放资料,然后重新绑定DataGridView,但如此一来你的统计资料不会如你所想的摆在第一行。
          DataTable sourceTable = new DataTable();
          //复制一份DataTable用来处理运算逻辑
          DataTable targetTable = sourceTable.Clone();
          /*
           * 新增统计的行/列
          */
          BindingSource bs = new BindingSource();
          //资料绑定
          bs.DataSource = targetTable;
          dataGridView1.DataSource = bs;

    3.变更原有的DataColumn资料形态为string,时间资料存入时转成string,但要确定使用者输入的格式是时间格式。
    2.把统计资料放在在别的DataTable



    秘訣無它,唯勤而已
    2010年10月22日 9:09
  • DataGridView本质上只是一个半成品

     

    你对web熟悉的话,何不尝试一下生成html报表用winform显示?

    2010年10月26日 2:43