可输入的列我转换成 TemplateField,拖了个 TextBox 进去求思路~

解决方案 »

  1.   

    用js解决很简单
    在onblur事件里自动计算即可
      

  2.   

    完整的例子,拷贝即可运行
    <%@ Page Language="C#" %><%@ Import Namespace="System.Xml" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">  protected void Page_Load(object sender, EventArgs e)
      {    System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));    for (int i = 0; i < 8; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = "班级" + i.ToString();
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 0);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 0);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 0);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 0);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        GridView1.DataSource = dv;
        GridView1.DataBind();
      }
    </script><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
      <script>    function Gen(t) {
          var tr = t.parentNode;
          while (tr.tagName != "TR") {
            tr = tr.parentNode;
          }
          if (!tr) {
            return;
          }
          if (tr.tagName != "TR") {
            return;
          }
          if (t.value != "" && !isNaN(parseInt(t.value, 10)))
            tr.cells[2].getElementsByTagName("span")[0].innerHTML = parseInt(t.value, 10) + parseInt(tr.cells[1].innerHTML)
        
        }
      
      </script>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
      <Columns>
      <asp:TemplateField><ItemTemplate>输入:<asp:textBox id="t" runat="server" onblur="Gen(this)"></asp:textBox></ItemTemplate></asp:TemplateField>
      <asp:BoundField DataField="数学" />
      <asp:TemplateField>
      <ItemTemplate>总计:<span></span></ItemTemplate></asp:TemplateField>
      </Columns>
      </asp:GridView>
      </form>
    </body>
    </html>
      

  3.   

    RowDataBound事件中进行计算。当然也可以先计算
    DataTable dt = YourTable;
    dt.Column.Add("GetSum");
    //然后循环赋值this.gridView1.DataSource = dt;
    this.gridView1.DataBind()//这样做效率不是很高,建议在Sql语句中处理
      

  4.   

    加入点容错处理
    <%@ Page Language="C#" %><%@ Import Namespace="System.Xml" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">  protected void Page_Load(object sender, EventArgs e)
      {    System.Data.DataTable dt = new System.Data.DataTable();
        System.Data.DataRow dr;
        dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
        dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
        dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));    for (int i = 0; i < 8; i++)
        {
          System.Random rd = new System.Random(Environment.TickCount * i); ;
          dr = dt.NewRow();
          dr[0] = "班级" + i.ToString();
          dr[1] = "【孟子E章】" + i.ToString();
          dr[2] = System.Math.Round(rd.NextDouble() * 100, 0);
          dr[3] = System.Math.Round(rd.NextDouble() * 100, 0);
          dr[4] = System.Math.Round(rd.NextDouble() * 100, 0);
          dr[5] = System.Math.Round(rd.NextDouble() * 100, 0);
          dt.Rows.Add(dr);
        }
        System.Data.DataView dv = new System.Data.DataView(dt);
        GridView1.DataSource = dv;
        GridView1.DataBind();
      }
    </script><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
      <script>    function Gen(t) {
          var tr = t.parentNode;
          while (tr.tagName != "TR") {
            tr = tr.parentNode;
          }
          if (!tr) {
            return;
          }
          if (tr.tagName != "TR") {
            return;
          }
          if(isNaN(parseInt(t.value, 10))) t.value = "0";
          if (t.value != "" && !isNaN(parseInt(t.value, 10))) {
            tr.cells[2].getElementsByTagName("span")[0].innerHTML = parseInt(t.value, 10) + parseInt(tr.cells[1].innerHTML)
            //计算必须是数字,下面这行对输入进行规范化
            t.value = parseInt(t.value, 10); 
          }
        
        }
      
      </script>
    </head>
    <body>
      <form id="form1" runat="server">
      <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
      <Columns>
      <asp:TemplateField HeaderText="输入项目"><ItemTemplate>输入:<asp:textBox id="t" runat="server" onblur="Gen(this)"></asp:textBox></ItemTemplate></asp:TemplateField>
      <asp:BoundField DataField="数学" HeaderText="数学成绩" />
      <asp:TemplateField HeaderText="总计">
      <ItemTemplate>总计:<span></span></ItemTemplate></asp:TemplateField>
      </Columns>
      </asp:GridView>
      </form>
    </body>
    </html>
      

  5.   

    function sum()   
      {   
      var table=document.getElementById("Table1");   
      var tr=table.getElementsByTagName("tr");   
      var sum=0;   
      var pattem=/^\d+(\.\d+)?$/;   
      for( i=1;i <tr.length;i++)   
      {   
      var sum1;   
      var a,b,c;   
      if(pattem.test(tr[i].getElementsByTagName("td")[4].getElementsByTagName("input")[0].value))   
      a=parseFloat( tr[i].getElementsByTagName("td")[4].getElementsByTagName("input")[0].value );   
      else   
      a=0;   
      if(pattem.test(tr[i].getElementsByTagName("td")[5].getElementsByTagName("input")[0].value))   
      b=parseFloat( tr[i].getElementsByTagName("td")[5].getElementsByTagName("input")[0].value );   
      else   
      b=0;   
      if(pattem.test(tr[i].getElementsByTagName("td")[7].getElementsByTagName("input")[0].value))   
      c=parseFloat( tr[i].getElementsByTagName("td")[7].getElementsByTagName("input")[0].value );   
      else   
      c=0;   
      sum1=a+ b + c;   
      sum=sum+sum1;   
      }   
      document.getElementById("txt").value=parseFloat(sum).toFixed(2);   
      }   
    <script type="text/javascript">
            function checkFloat(e) {
                return (e.keyCode >= 48 && e.keyCode <= 57) || e.keyCode == 8 || e.keyCode == 46 || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 190 || e.keyCode == 110 ? true : false;
            }        function Cal(tb) {
                var b = parseFloat(tb.value);
                var par = tb.parentElement || tb.parentNode;
                var a = parseFloat(par.previousSibling.getElementsByTagName("span")[0].innerHTML);
                var tbC = par.nextSibling.getElementsByTagName("input")[0];
                tbC.value = a * b;
            }
        </script>
                    <asp:TemplateField HeaderText="数量">
                        <EditItemTemplate>
                            <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("[T-jpcs1]") %>'></asp:TextBox>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:Label ID="a" runat="server" Text='<%# Bind("[T-jpcs1]") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="单价">
                        <EditItemTemplate>
                            <asp:TextBox ID="TextBox8" runat="server"></asp:TextBox>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:TextBox ID="b" runat="server" Width="100px" onkeydown="return checkFloat(event)" onkeyup='Cal(this)' ></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField HeaderText="总金额">
                        <EditItemTemplate>
                            <asp:TextBox ID="TextBox10" runat="server"></asp:TextBox>
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:TextBox ID="c" runat="server" Width="100px" onkeydown="return checkFloat(event)"></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>