我的意思是在Datagrid 中 根据第一列、第二列输入数字后,按回车在第三列自动显示合计.
解决方案 »
- C#的整型如何取其中的每个字节
- winform的menuStrip控件
- 关于ListView 列的动态创建的问题
- 关于dataGridView自定义列的一个问题
- 关于数据筛选的问题!!!!!!!!!标题要长!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 如何在按钮事件里获取gridview中的数据?
- 关于正则表达式的又一个问题.
- byte数组转成string,再转成byte数组,前后两个数组就不一样了!
- 我的C#程序解决方案里的所有程序前面怎么都带上了黄色感叹号?
- using Microsoft.DirectX;引用什么类,在项目-引用中引用哪一个
- ListBox problem
- 怎样实现超链接的Onclick事件
这样表达式列就会在改变前两列值的时候自动的来更新显示了.
DataColumn.Expression 属性
获取或设置表达式,用于筛选行、计算列中的值或创建聚合列。 属性值
用来计算列的值,或创建聚合列的表达式。表达式的返回类型由列的 DataType 来确定。
比如:DataColumn totalColumn = new DataColumn();
totalColumn.DataType = System.Type.GetType("System.Decimal");
totalColumn.ColumnName = "total";
totalColumn.Expression = "price + tax";
当你在datagrid中输入值时自然会保存起来,计算完重新绑定就可以了当然也可以用JS来解决,在datagrid加事件判断并计算后修改第三列,你看一下源码很容易知道
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());
}
{
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");
}
}
}
现在问题是,你这个方法前提是DataGrid要有数据,如果我是手工增加一行填入 单价和数量 就不能用了.只能是先把datagrid 填入数据然后可以用.
然后循环
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
}
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);
}
}