我的意思是在Datagrid 中 根据第一列、第二列输入数字后,按回车在第三列自动显示合计.

解决方案 »

  1.   

    你可以在你的DataGrid的数据源中(比如DataTable)添加一个表达式列就行了.这个表达式来自前两个列的和.
    这样表达式列就会在改变前两列值的时候自动的来更新显示了.
      

  2.   

    应该没有问题吧! 在keypress事件中 获取刚才编辑的行号 跟要计算的列
      

  3.   

    参考下:
    DataColumn.Expression 属性 
    获取或设置表达式,用于筛选行、计算列中的值或创建聚合列。 属性值
    用来计算列的值,或创建聚合列的表达式。表达式的返回类型由列的 DataType 来确定。 
    比如:DataColumn totalColumn = new DataColumn();
        totalColumn.DataType = System.Type.GetType("System.Decimal");
        totalColumn.ColumnName = "total";
        totalColumn.Expression = "price + tax";
      

  4.   

    给个笨办法:
    当你在datagrid中输入值时自然会保存起来,计算完重新绑定就可以了当然也可以用JS来解决,在datagrid加事件判断并计算后修改第三列,你看一下源码很容易知道
      

  5.   

    和你的一样,但是不是加法,而是乘法using   System;  
      using   System.Drawing;  
      using   System.Collections;  
      using   System.ComponentModel;  
      using   System.Windows.Forms;  
      using   System.Data;  
       
      namespace   DataGrid  
      {  
      ///   <summary>  
      ///   Form1   的摘要说明。  
      ///   </summary>  
      public   class   Form1   :   System.Windows.Forms.Form  
      {  
      private   System.Windows.Forms.DataGrid   dataGrid1;  
      ///   <summary>  
      ///   必需的设计器变量。  
      ///   </summary>  
      private   System.ComponentModel.Container   components   =   null;  
      DataSet   ds   =   new   DataSet();  
      DataTable   dt   =   new   DataTable();  
      private   int   currentRow;  
      private   int   num;  
      private   int   price;  
      public   Form1()  
      {  
      //  
      //   Windows   窗体设计器支持所必需的  
      //  
      InitializeComponent();  
       
      //  
      //   TODO:   在   InitializeComponent   调用后添加任何构造函数代码  
      //  
      }  
       
      ///   <summary>  
      ///   清理所有正在使用的资源。  
      ///   </summary>  
      protected   override   void   Dispose(   bool   disposing   )  
      {  
      if(   disposing   )  
      {  
      if   (components   !=   null)    
      {  
      components.Dispose();  
      }  
      }  
      base.Dispose(   disposing   );  
      }  
       
      #region   Windows   窗体设计器生成的代码  
      ///   <summary>  
      ///   设计器支持所需的方法   -   不要使用代码编辑器修改  
      ///   此方法的内容。  
      ///   </summary>  
      private   void   InitializeComponent()  
      {  
      this.dataGrid1   =   new   System.Windows.Forms.DataGrid();  
      ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).BeginInit();  
      this.SuspendLayout();  
      //    
      //   dataGrid1  
      //    
      this.dataGrid1.AlternatingBackColor   =   System.Drawing.SystemColors.Window;  
      this.dataGrid1.BackgroundColor   =   System.Drawing.SystemColors.AppWorkspace;  
      this.dataGrid1.CaptionFont   =   new   System.Drawing.Font("Tahoma",   8F,    
      System.Drawing.FontStyle.Bold);  
      this.dataGrid1.DataMember   =   "";  
      this.dataGrid1.GridLineColor   =   System.Drawing.SystemColors.Control;  
      this.dataGrid1.HeaderBackColor   =   System.Drawing.SystemColors.Control;  
      this.dataGrid1.HeaderForeColor   =   System.Drawing.SystemColors.ControlText;  
      this.dataGrid1.LinkColor   =   System.Drawing.SystemColors.HotTrack;  
      this.dataGrid1.Location   =   new   System.Drawing.Point(16,   16);  
      this.dataGrid1.Name   =   "dataGrid1";  
      this.dataGrid1.SelectionBackColor   =    
      System.Drawing.SystemColors.ActiveCaption;  
      this.dataGrid1.SelectionForeColor   =    
      System.Drawing.SystemColors.ActiveCaptionText;  
      this.dataGrid1.Size   =   new   System.Drawing.Size(656,   360);  
      this.dataGrid1.TabIndex   =   0;  
      //    
      //   Form1  
      //    
      this.AutoScaleBaseSize   =   new   System.Drawing.Size(6,   14);  
      this.ClientSize   =   new   System.Drawing.Size(688,   389);  
      this.Controls.Add(this.dataGrid1);  
      this.Name   =   "Form1";  
      this.Text   =   "Form1";  
      this.Load   +=   new   System.EventHandler(this.Form1_Load);  
      ((System.ComponentModel.ISupportInitialize)(this.dataGrid1)).EndInit();  
      this.ResumeLayout(false);  
       
      }  
      #endregion  
       
      ///   <summary>  
      ///   应用程序的主入口点。  
      ///   </summary>  
      [STAThread]  
      static   void   Main()    
      {  
      Application.Run(new   Form1());  
      }  
       
      

  6.   

    private   void   Form1_Load(object   sender,   System.EventArgs   e)  
      {  
      dt   =   ds.Tables.Add("myTable");  
      DataColumn   myColumn1   =   new   DataColumn();  
      myColumn1.DataType   =   System.Type.GetType("System.Decimal");  
      myColumn1.Caption   =   "单价";  
      myColumn1.ColumnName   =   "单价";  
      myColumn1.DefaultValue   =   "25";  
      dt.Columns.Add(myColumn1);  
      DataRow   myRow1;  
      for(int   i   =   0;   i   <   10;   i++)  
      {    
      myRow1   =   dt.NewRow();    
      myRow1["单价"]   =   i   +   1;    
      dt.Rows.Add(myRow1);    
      }  
       
      DataColumn   myColumn2   =   new   DataColumn();  
      myColumn2.DataType   =   System.Type.GetType("System.Decimal");  
      myColumn2.Caption   =   "数量";  
      myColumn2.ColumnName   =   "数量";  
      myColumn2.DefaultValue   =   "2";  
      dt.Columns.Add(myColumn2);  
      DataRow   myRow2;  
      for(int   i   =   0;   i   <   10;   i++)  
      {    
      myRow2   =   dt.NewRow();    
      myRow2["数量"]   =i+2;  
      dt.Rows.Add(myRow2);    
      }  
       
      DataColumn   myColumn3   =   new   DataColumn();  
      myColumn3.DataType   =   System.Type.GetType("System.Decimal");  
      myColumn3.Caption   =   "总价";  
      myColumn3.ColumnName   =   "总价";  
      myColumn3.DefaultValue   =   1;  
      dt.Columns.Add(myColumn3);  
      DataRow   myRow3;  
      for(int   i   =   0;   i   <   10;   i++)  
      {    
      myRow3   =   dt.NewRow();    
      myRow3["总价"]   =1;    
      dt.Rows.Add(myRow3);    
      }  
       
      DataGridTableStyle   ts   =   new   DataGridTableStyle();  
      DataGridTextBoxColumn   aColumnTextColumn   =   new   DataGridTextBoxColumn();  
      dataGrid1.DataSource   =   dt;  
      ts.MappingName   =   dt.TableName;  
       
      int   numCols;  
      numCols   =   dt.Columns.Count;  
      dataGrid1.CaptionText   =   "test";  
       
      int   j   =   0;  
      while(j<numCols)  
      {  
      aColumnTextColumn   =   new   DataGridTextBoxColumn();  
      aColumnTextColumn.HeaderText   =   dt.Columns[j].ColumnName;  
      aColumnTextColumn.MappingName   =   dt.Columns[j].ColumnName;  
      if   (j==1)  
      {  
      aColumnTextColumn.TextBox.LostFocus   +=new    
      EventHandler(TextBox_LostFocus);  
      aColumnTextColumn.TextBox.TextChanged   +=new    
      EventHandler(TextBox_TextChanged);  
      aColumnTextColumn.TextBox.Enter   +=new   EventHandler(TextBox_Enter);  
      aColumnTextColumn.TextBox.Leave   +=new   EventHandler(TextBox_Leave);  
      aColumnTextColumn.TextBox.KeyUp   +=new   KeyEventHandler(TextBox_KeyUp);  
      }  
      // if   (j==1)  
      // {  
      ts.PreferredColumnWidth   =   100;  
      ts.PreferredRowHeight   =   20;  
      // }  
      ts.AlternatingBackColor   =   Color.LightGray;  
      ts.GridColumnStyles.Add(aColumnTextColumn);  
      j+=1;  
      }  
       
      // DataGridBoolColumn   aColumnBoolColumn   =   new   DataGridBoolColumn();  
      // aColumnBoolColumn.HeaderText   =   dt.Columns[2].ColumnName;  
      // aColumnBoolColumn.MappingName   =   dt.Columns[2].ColumnName;  
      // ts.PreferredColumnWidth   =   100;  
      // ts.PreferredRowHeight   =   25;  
      // ts.AlternatingBackColor   =   Color.LightGray;  
      // ts.GridColumnStyles.Add(aColumnBoolColumn);  
      dataGrid1.TableStyles.Clear();  
      dataGrid1.TableStyles.Add(ts);  
      }  
      private   void   TextBox_TextChanged(object   sender,System.EventArgs   e)  
      {  
       
      }  
      private   void   TextBox_Enter(object   sender,System.EventArgs   e)  
      {  
      }  
      private   void   TextBox_Leave(object   sender,System.EventArgs   e)  
      {  
      // num   =   0;  
      // currentRow   =   dataGrid1.CurrentCell.RowNumber;  
      // num   =    
      Convert.ToInt32(((DataGridTextBoxColumn)this.dataGrid1.TableStyles[0].GridColumnStyles[1]).TextBox.Text);  
      // price=Convert.ToInt32(dt.Rows[currentRow][0].ToString());  
      // dt.Rows[currentRow][1]   =   num;  
      }  
      private   void   TextBox_LostFocus(object   sender,System.EventArgs   e)  
      {  
      num   =   0;  
      num   =    
      Convert.ToInt32(((DataGridTextBoxColumn)this.dataGrid1.TableStyles[0].GridColumnStyles[1]).TextBox.Text);  
      currentRow   =   dataGrid1.CurrentCell.RowNumber;  
      dt.Rows[currentRow][2]   =   num   *   Convert.ToInt32(dt.Rows[currentRow][0]);  
      dt.Rows[currentRow][1]   =   num;  
      }  
      private   void   TextBox_KeyUp(object   sender,System.Windows.Forms.KeyEventArgs    
      e)  
      {  
      // num   =   0;  
      // num   =    
      Convert.ToInt32(((DataGridTextBoxColumn)this.dataGrid1.TableStyles[0].GridColumnStyles[1]).TextBox.Text);  
      // currentRow   =   dataGrid1.CurrentCell.RowNumber;  
      // dt.Rows[currentRow][2]   =   num   *   Convert.ToInt32(dt.Rows[currentRow][0]);  
      // dt.Rows[currentRow][1]   =   num;  
      MessageBox.Show("fsd");  
      }  
       
      }  
      }
      

  7.   

    只要改在keypress里计算就行了,上面是在数量变化的时候计算
      

  8.   

    ufoteam()  留个联系方式可以吗 我的msn:[email protected]
      

  9.   

    ufoteam() :谢谢你的回答.
     现在问题是,你这个方法前提是DataGrid要有数据,如果我是手工增加一行填入 单价和数量 就不能用了.只能是先把datagrid 填入数据然后可以用.
      

  10.   

    自己new一列假设为3列
    然后循环
    for(int i=0;i<dataGrid.row.count;i++)
    {dataGrid.row[i].cell[3].value=dataGrid.row[i].cell[3].value+dataGrid.row[i].cell[3].value
    }
      

  11.   

    这里只是一个实现,你的计算是在Enter之后计算的,所以你无须要原封不动底使用上面代码,你只要在接受到Enter之后,计算出该冽的和就行了,上面你手动增加的行中没有为他增加事件绑定,
      

  12.   

    问题解决! 说下我的方法.
    1.由于我不是采用DataColumn totalColumn = new DataColumn(); 这种方法添加列.
    我是用DataGridTableStyle,所以不能用Expression,不然这是最简单处理方法.
    2. 后来采用了ufoteam() 的方法, 给datagrid 的单价列添加了一个事TextBox_LostFocus, 然后就解决了.private   void   TextBox_LostFocus(object   sender,System.EventArgs   e)  
    {  
    DataTable dgvv=(DataTable)this.dg1.DataSource;
    decimal num2   =  Convert.ToDecimal(((DataGridTextBoxColumn)this.dg1.TableStyles[0].GridColumnStyles[5]).TextBox.Text);  
    decimal num3   =  Convert.ToDecimal(((DataGridTextBoxColumn)this.dg1.TableStyles[0].GridColumnStyles[3]).TextBox.Text);
    int currentRow   =   dg1.CurrentCell.RowNumber;  
    dg1[currentRow,6]   =  Convert.ToString(num2   *   num3);
    }

    }
      

  13.   

    你把这个列直接加到DataTable上然后再绑定到Grid上才行啊,你为什么一定要先绑定到Grid上中啊...如果在DataTable里直接添加一个表达式列问题不是很简单就解决了吗!