其实我想做动态生成的DataGrid,可以让用户自定义字段,字段的值由前几列的值计算得来,有什么实现方法,说个思路也行,只要能实现就给分。

解决方案 »

  1.   

    你直接在SQL语句里生成不就行了吗,
    select a1+a2+a3 as bb from table2
    bb就是你要的。
      

  2.   

    用你的SQL语句构造。select sj,jh,sj-jh as sh from table
      

  3.   

    用SQL语句
    select a,b,a+b as c from table
      

  4.   

    我也许没有说清楚,我做的是一个二维的交叉表,我先把数据全部从数据库里面读出来,
    得到的是这样一些数据。
    时间      指标   单位   值
    2003-11   实际   北京   456
    2003-11   实际   武汉   123
    2003-11   计划   北京   234
    2003-11   计划   武汉   678然后得到这样一个表头
    ————————————————————
            | 实际         |     计划      |
    ————————————————————
            |北京   |武汉  |北京  |武汉    |
    ————————————————————
    2003-11 |       |      |      |        |
    ————————————————————然后根据用户选择的字段生成表头后,再把数据填到这样一个类里面class tablecells
    {
         string  指标;
         string  单位;
         string  日期;
         int     值;
    }得到一个  m_tableCells[];
    再将数据填到上面建成的表头里面,得到交叉表————————————————————
            | 实际         |     计划      |
    ————————————————————
            |北京   |武汉  |北京  |武汉    |
    ————————————————————
    2003-11 | 456   | 123  |  234 |  678   |
    ————————————————————
      

  5.   

    现在这样做还不够,要用户能自定义字段,例如上面例子中,要得到北京和武汉的差。
    用户在界面上自定义一个字段,,,叫 x  它的值是北京和武汉的差,要得到这样一个表。。
    —————————————————————————————
            | 实际                 |               计划      |
    —————————————————————————————
            |北京   |武汉  |  X    |北京  |武汉    |    X    |
    —————————————————————————————
    2003-11 | 456   | 123  |  333  |  234 |  678   |  -444   |
    —————————————————————————————
    数据还是以上那些,我怎么通过程序控制得到 333 和  -444 这个值, 
    要是复杂一点的值 例如  
    (北京的值×北京的值)/ (武汉的值×武汉的值 + 北京的值×北京的值)^2  怎么在sql语句中做呢,。。
      

  6.   

    在dataset中构造,在datagrid上用模板列。你是能取出任何一列的值的,然后用什么逻辑算都无所谓了。
      

  7.   

    我也考虑过用模板列的。但是具体不知道怎么做。wwl1981(小刀)有没有什么具体的例子看看,如果可以我就散分。
      

  8.   

    我提个建议:
        你可以创建一个新的DataTable,再写个循环,当你的用户创建一个新的列的时候,就触发这个循环,添加列,
    myColumn = new DataColumn();
    myColumn.DataType = System.Type.GetType("System.String");
    myColumn.ColumnName = "新列名";
    表名.Columns.Add(myColumn);
                            ..........
    myRow["新列名"]= 新列的计算公式;
             表名.Rows.Add(myRow);
    然后在让你的DATAGRID来绑定这个新的DataTable,刷新页面。
    当然了,用户创建新列的时候肯定要写该列的结构的运算公式了。你就把它转换到程序能懂的表达式。不知道行不行。你可以试试!我得一个类似的功能就是这样实现的!!
    祝你好运!           ====================================    
                          流水下滩非有意,
                          白云出岫本无心。
               ====================================
      

  9.   

    参考一下:
    在dataGrid中增加一个模板列,形成一个计算列<ItemTemplate>
    <asp:Label id="Label1" runat="server" Text='<%# (DataBinder.Eval(Container, "DataItem.title_id").ToString()+DataBinder.Eval(Container, "DataItem.title").ToString()) %>'>
    </asp:Label>
    </ItemTemplate>
      

  10.   

    我试试mjzcyber(流水白云)  的方法。。
      

  11.   

    或这样,写个方法在客户端转换
    private string a(string a,string b)
    {
      return (int(a)- int(b)).Tostring();
    }<ItemTemplate>
    <asp:Label id="Label1" runat="server" Text='<%# a((DataBinder.Eval(Container, "DataItem.title_id").ToString(),DataBinder.Eval(Container, "DataItem.title").ToString())) %>'>
    </asp:Label>
    </ItemTemplate>
      

  12.   

    datatable.columns.add("aa");
    <ItemTemplate>
    <asp:Label id="OriginalAm" Width="100px" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "TransferAmount") 
    %>'>
    </asp:Label>
    在item_databound事件中处理
    Label mylab=(Label)e.item.findcontrol("OriginalAm");
    mylab.text=bb-cc;
    bb,cc可以用同样的方法取到。