各位大虾好:
        帮忙解决一下吧,我想在gridview 里实现跨行计算,应该怎么实现?
想实现的结果如下: 数量   单价   合计      付款           余额
 200    5.00   1000.00   200.00       800.00  
 150    3.00   450.00    100.00       1150.00
 100    2      200.00     0           1350.00
依次类推.
就是上次的余额+当前合计-付款=当前余额
好几天了,请大家帮忙解决,谢谢了!

解决方案 »

  1.   

    为什么一定要在gridview 里面计算呢?
    你直接在SQL语句里面计算好,然后把上面的图生成一个视图,
    然后再在gridview显示不就可以了么??
      

  2.   

    跨行计算用sql吧,这样最好,如果实在不想用就用程序计算好了
      

  3.   

    先说一下,你的表结构,我建议在读出数据库数据到dataset后,对dataset中的表数据进行处理,
    对表先加一列“余额”,然后对表中每一个行循环,用你的“上次的余额+当前合计-付款=当前余额”公式给你的“余额”赋值,然后绑定即可。
    感觉用sql实现需要用游标来实现吧。
      

  4.   

    用我上面说的第一个对已经读出到dataset中的数据进行处理
      

  5.   

    有啊,合计是sql自动计算的.
      

  6.   

    完全可以的,你再格式化显示即可<%@ Page Language="C#" AutoEventWireup="true"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server">
      ICollection CreateDataSource( )
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("数量", typeof(System.Int32)));
        dt.Columns.Add(new System.Data.DataColumn("单价", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("付款", typeof(System.Decimal)));
        
          dr = dt.NewRow();
          dr[0] = 200;
          dr[1] = 5.00;
          dr[2] = 200.00;
          dt.Rows.Add(dr);      dr = dt.NewRow();
          dr[0] = 150;
          dr[1] = 3.00;
          dr[2] = 100.00;
          dt.Rows.Add(dr);      dr = dt.NewRow();
          dr[0] = 100;
          dr[1] = 2;
          dr[2] = 0;
          dt.Rows.Add(dr);
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }   Decimal aa = 0;
      protected void Page_Load( object sender, EventArgs e )
      {
        if (!IsPostBack)
        {
          GridView1.BorderWidth = Unit.Pixel(2);
          GridView1.BorderColor = System.Drawing.Color.DarkOrange;
          GridView1.DataSource = CreateDataSource();
          GridView1.DataBind();
        }
      }
       protected void GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
      {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
          
          Literal l = (Literal)e.Row.FindControl("mxh");
          Literal leftCount = (Literal)e.Row.FindControl("leftCount");
          Decimal c = 0;
          Decimal b;
          System.Data.DataRowView d = (System.Data.DataRowView)e.Row.DataItem;
          System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo();
          provider.NumberDecimalDigits = 2;
          provider.NumberGroupSeparator = ".";
          if (e.Row.DataItemIndex == 0)
          {
            aa = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]) - Convert.ToDecimal(d["付款"]);
            
            leftCount.Text = Convert.ToString(aa, provider);
          }
          else
          {        b = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]);
            l.Text = Convert.ToString(b, provider);
            aa = b + aa - Convert.ToDecimal(d["付款"]);        leftCount.Text = Convert.ToString(aa, provider);
          }
        
          
        }
      }</script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title>无标题页</title>
    </head>
    <body>
      <form id="form1" runat="server">
       <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound1">
       <Columns>
       <asp:BoundField DataField="数量" />
       <asp:BoundField DataField="单价" />
       <asp:TemplateField>
       <ItemTemplate>
       <asp:Literal ID="mxh" runat="server"></asp:Literal>
       </ItemTemplate>
       </asp:TemplateField>
       <asp:BoundField DataField="付款" />
       <asp:TemplateField>
       <ItemTemplate>
       <asp:Literal ID="leftCount" runat="server"></asp:Literal>
       
       </ItemTemplate>
       </asp:TemplateField>
       </Columns>
       
       
       </asp:GridView>
      </form>
    </body>
    </html>
      

  7.   

    kbjx406 可以给个联系方式吗?
      

  8.   

    <%@ Page Language="C#" AutoEventWireup="true"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server">
      ICollection CreateDataSource( )
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("数量", typeof(System.Int32)));
        dt.Columns.Add(new System.Data.DataColumn("单价", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("付款", typeof(System.Decimal)));
        
          dr = dt.NewRow();
          dr[0] = 200;
          dr[1] = 5.00;
          dr[2] = 200.00;
          dt.Rows.Add(dr);      dr = dt.NewRow();
          dr[0] = 150;
          dr[1] = 3.00;
          dr[2] = 100.00;
          dt.Rows.Add(dr);      dr = dt.NewRow();
          dr[0] = 100;
          dr[1] = 2;
          dr[2] = 0;
          dt.Rows.Add(dr);
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }   Decimal aa = 0;
      protected void Page_Load( object sender, EventArgs e )
      {
        if (!IsPostBack)
        {
          GridView1.BorderWidth = Unit.Pixel(2);
          GridView1.BorderColor = System.Drawing.Color.DarkOrange;
          GridView1.DataSource = CreateDataSource();
          GridView1.DataBind();
        }
      }
       protected void GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
      {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
          
          Literal l = (Literal)e.Row.FindControl("mxh");
          Literal leftCount = (Literal)e.Row.FindControl("leftCount");
          Decimal c = 0;
          Decimal b;
          System.Data.DataRowView d = (System.Data.DataRowView)e.Row.DataItem;
          System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo();
          provider.NumberDecimalDigits = 2;
          provider.NumberGroupSeparator = ".";
          if (e.Row.DataItemIndex == 0)
          {
            aa = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]) - Convert.ToDecimal(d["付款"]);
            b = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]);
            l.Text = Convert.ToString(b, provider);
            leftCount.Text = Convert.ToString(aa, provider);
          }
          else
          {        b = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]);
            l.Text = Convert.ToString(b, provider);
            aa = b + aa - Convert.ToDecimal(d["付款"]);        leftCount.Text = Convert.ToString(aa, provider);
          }
        
          
        }
      }</script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title>无标题页</title>
    </head>
    <body>
      <form id="form1" runat="server">
       <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowDataBound="GridView1_RowDataBound1" ShowHeader="true">
       <Columns>
       <asp:BoundField DataField="数量" HeaderText="数量"/>
       <asp:BoundField DataField="单价" HeaderText="单价"/>
       <asp:TemplateField HeaderText="合计">
       <ItemTemplate>
       <asp:Literal ID="mxh" runat="server"></asp:Literal>
       </ItemTemplate>
       </asp:TemplateField>
       <asp:BoundField DataField="付款" HeaderText="付款" />
       <asp:TemplateField HeaderText="余额">
       <ItemTemplate>
       <asp:Literal ID="leftCount" runat="server"></asp:Literal>
       
       </ItemTemplate>
       </asp:TemplateField>
       </Columns>
       
       
       </asp:GridView>
      </form>
    </body>
    </html>
      

  9.   

    厉害,net_lover,我这就试一下,谢谢你了,没想到你能回答我的问题,我买过你的书<asp.net 2.0>
      

  10.   

    <%@ Page Language="C#" AutoEventWireup="true" debug="true"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">
      ICollection CreateDataSource()
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("数量", typeof(System.Int32)));
        dt.Columns.Add(new System.Data.DataColumn("单价", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("付款", typeof(System.Decimal)));    dr = dt.NewRow();
        dr[0] = 200;
        dr[1] = 5.00;
        dr[2] = 200.00;
        dt.Rows.Add(dr);    dr = dt.NewRow();
        dr[0] = 150;
        dr[1] = 3.00;
        dr[2] = 100.00;
        dt.Rows.Add(dr);    dr = dt.NewRow();
        dr[0] = 100;
        dr[1] = 2.00;
        dr[2] = 0.00;
        dt.Rows.Add(dr);
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }  Decimal aa = 0;
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!IsPostBack)
        {
          GridView1.BorderWidth = Unit.Pixel(2);
          GridView1.BorderColor = System.Drawing.Color.DarkOrange;
          GridView1.DataSource = CreateDataSource();
          GridView1.DataBind();
        }
      }
      protected void GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
      {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
          Literal l = (Literal)e.Row.FindControl("mxh");
          Literal leftCount = (Literal)e.Row.FindControl("leftCount");
          Decimal c = 0;
          Decimal b;
          System.Data.DataRowView d = (System.Data.DataRowView)e.Row.DataItem;
          System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo();
          provider.NumberDecimalDigits = 2;
          if (e.Row.DataItemIndex == 0)
          {
            aa = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]) - Convert.ToDecimal(d["付款"]);
            b = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]);
            l.Text = Convert.ToString(b, provider);
            leftCount.Text = Convert.ToString(aa, provider);
          }
          else
          {
            b = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]);
            l.Text = Convert.ToString(b, provider);
            aa = b + aa - Convert.ToDecimal(d["付款"]);
            leftCount.Text = Convert.ToString(aa, provider);
          }
        }
      }</script><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title>无标题页</title>
    </head>
    <body>
      <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
          OnRowDataBound="GridView1_RowDataBound1" ShowHeader="true">
          <Columns>
            <asp:BoundField DataField="数量" HeaderText="数量"  HtmlEncode="false"/>
            <asp:BoundField DataField="单价" HeaderText="单价" DataFormatString="{0:###.00}" HtmlEncode="false"/>
            <asp:TemplateField HeaderText="合计">
              <ItemTemplate>
                <asp:Literal ID="mxh" runat="server"></asp:Literal>
              </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="付款" HeaderText="付款" DataFormatString="{0:###.00}" HtmlEncode="false"/>
            <asp:TemplateField HeaderText="余额" >
              <ItemTemplate>
                <asp:Literal ID="leftCount" runat="server"></asp:Literal>
              </ItemTemplate>
            </asp:TemplateField>
          </Columns>
        </asp:GridView>
      </form>
    </body>
    </html>
      

  11.   

    完整版本<%@ Page Language="C#" AutoEventWireup="true" debug="true"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">
      ICollection CreateDataSource()
      {
        System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("数量", typeof(System.Int32)));
        dt.Columns.Add(new System.Data.DataColumn("单价", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("付款", typeof(System.Decimal)));    dr = dt.NewRow();
        dr[0] = 200;
        dr[1] = 5.00;
        dr[2] = 200.00;
        dt.Rows.Add(dr);    dr = dt.NewRow();
        dr[0] = 150;
        dr[1] = 3.00;
        dr[2] = 100.00;
        dt.Rows.Add(dr);    dr = dt.NewRow();
        dr[0] = 100;
        dr[1] = 2.00;
        dr[2] = 0.00;
        dt.Rows.Add(dr);
        System.Data.DataView dv = new System.Data.DataView(dt);
        return dv;
      }  Decimal aa = 0;
      protected void Page_Load(object sender, EventArgs e)
      {
        if (!IsPostBack)
        {
          GridView1.BorderWidth = Unit.Pixel(2);
          GridView1.BorderColor = System.Drawing.Color.DarkOrange;
          GridView1.DataSource = CreateDataSource();
          GridView1.DataBind();
        }
      }
      protected void GridView1_RowDataBound1(object sender, GridViewRowEventArgs e)
      {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
          Literal l = (Literal)e.Row.FindControl("mxh");
          Literal leftCount = (Literal)e.Row.FindControl("leftCount");
          Decimal c = 0;
          Decimal b;
          System.Data.DataRowView d = (System.Data.DataRowView)e.Row.DataItem;
          System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo();
          provider.NumberDecimalDigits = 2;
          if (e.Row.DataItemIndex == 0)
          {
            aa = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]) - Convert.ToDecimal(d["付款"]);
            b = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]);
            l.Text = b.ToString("##0.00");
            leftCount.Text = aa.ToString("##0.00");
          }
          else
          {
            b = Convert.ToDecimal(d["数量"]) * Convert.ToDecimal(d["单价"]);
            l.Text = b.ToString("##0.00");
            aa = b + aa - Convert.ToDecimal(d["付款"]);
            leftCount.Text = aa.ToString("##0.00");
          }
        }
      }</script><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title>无标题页</title>
    </head>
    <body>
      <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
          OnRowDataBound="GridView1_RowDataBound1" ShowHeader="true">
          <Columns>
            <asp:BoundField DataField="数量" HeaderText="数量"  HtmlEncode="false"/>
            <asp:BoundField DataField="单价" HeaderText="单价" DataFormatString="{0:##0.00}" HtmlEncode="false"/>
            <asp:TemplateField HeaderText="合计">
              <ItemTemplate>
                <asp:Literal ID="mxh" runat="server"></asp:Literal>
              </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="付款" HeaderText="付款" DataFormatString="{0:##0.00}" HtmlEncode="false"/>
            <asp:TemplateField HeaderText="余额" >
              <ItemTemplate>
                <asp:Literal ID="leftCount" runat="server"></asp:Literal>
              </ItemTemplate>
            </asp:TemplateField>
          </Columns>
        </asp:GridView>
      </form>
    </body>
    </html>
      

  12.   

    我的思路,主要代码如下:DataSet ds = new DataSet();
    ds=GetData();//从数据库中获得数据if(ds.Tables[0].Columns.Contains("余额"))
    {
    ds.Tables[0].Columns.Remove("余额");
    }
    ds.Tables[0].Columns.Add(new DataColumn("余额",typeof(Decimal),null,MappingType.Element));//向表中加一列Decimal left=0;
    foreach(DataRow row in ds.Tables[0].Rows)//给新加列赋值
    {
    Decimal leftcount = Convert.ToDecimal(row["数量"]) * Convert.ToDecimal(row["单价"]) - Convert.ToDecimal(d["付款"])+left;
    row["余额"]=leftcount;
    left=leftcount;
    }
    datagrid1.DataSource=ds;//绑定
    datagrid1.DataMember=ds.Tables[0].TableName;
    datagrid1.DataBind();在可视化中把余额列的数据库字段设置"余额"就可以了。
      

  13.   

    ok,very good!!!!!!!!!!!!!!!!!
    各位,十分感谢,问题解决了,谢谢啊,!!!!!!!!!!
      

  14.   

    在此特别感谢孟子E章,kbxj406(羽儿),还有ustbwuyi,dyjqk,wshuangminlg,再次感谢,给个机会到烟台请吃海鲜。真的。
      

  15.   

    kbxj406 "娃哈哈" 什么意思?打广告,还是??????呵呵呵呵!
      

  16.   

    MSN上面不是写过了,“向上看”