WinForm DataGridView公式问题? 重新发帖 [图]
之前发的帖子:http://topic.csdn.net/u/20090627/16/65a756cf-930c-4a34-a1fb-f2076e338e1d.html
=============================================
[VS2005 SQL2000]
Form1:
数据库:
Form2:
1图:在DataGridView中,"项目名称,公式"由用户输入;
2图:数据库;
3图:在DataGridView中,数据库的"名称"数据为DataGridView的列,按照"公式"来计算
有点像Excel中的功能:
请问,在DataGridView中,如何实现这样的功能?
[如果我说得不够清楚,请回帖]
[解决办法]
所有的图都是 XX 哦!
[解决办法]
可以使用DataTable的功能
DataTable _Table = new DataTable();
_Table.Columns.Add("A");
_Table.Columns.Add("B");
for (int i = 0; i != 100; i++)
{
_Table.Rows.Add(new object[] { i, i + 1 });
}
添加计算列
_Table.Columns.Add("Sum(A*B)");
string _Expression = "convert(A,'System.Decimal')*convert(B,'System.Decimal')";
_Table.Columns["Sum(A*B)"].Expression = _Expression;
dataGridView1.DataSource=_Table;
如果你的数据类型是数字类型 Expression可以直接附值为 A*B
[解决办法]
UP
[解决办法]
假定你的表名是myTable,主键是id,其余字段是A,B,E。E值是A和B的相乘。帮您写了个触发器,代码如下,仅供参考:
CREATE TRIGGER myTrigger ON myTable FOR UPDATE, INSERTASUPDATE myTable SET t.E = t.A * t.B FROM test t, inserted i WHERE t.id=i.id
[解决办法]
2L的方法不错:
DataTable _Table = new DataTable();
_Table.Columns.Add("A");
_Table.Columns.Add("B");
for (int i = 0; i != 100; i++)
{
_Table.Rows.Add(new object[] { i, i + 1 });
}
添加计算列
_Table.Columns.Add("Sum(A*B)");
string _Expression = "convert(A,'System.Decimal')*convert(B,'System.Decimal')";
_Table.Columns["Sum(A*B)"].Expression = _Expression;
dataGridView1.DataSource=_Table;
[解决办法]
我写了一个例子:
//给dataGridView绑数据,我在这里动态的加了一些数据。
//A4输入公式,A3用公式计算。
private void button1_Click(object sender, EventArgs e)
{
DataSet t = new DataSet();
System.Data.DataTable tab = new DataTable();
DataColumn d = new DataColumn("A");
DataColumn d1 = new DataColumn("A2");
DataColumn d2 = new DataColumn("A3");
DataColumn d3 = new DataColumn("A4");
DataRow r = tab.NewRow();
tab.Columns.Add(d);
tab.Columns.Add(d1);
tab.Columns.Add(d2);
tab.Columns.Add(d3);
r[0] = "100";
r[1] = "33";
tab.Rows.Add(r);
DataRow r1 = tab.NewRow();
r1[0] = "200";
r1[1] = "333";
DataRow r2 = tab.NewRow();
r2[0] = "300";
r2[1] = "3433";
tab.Rows.Add(r2);
t.Tables.Add(tab);
this.dataGridView1.DataSource = t;
this.dataGridView1.DataMember = t.Tables[0].TableName;
this.dataGridView1.Columns[2].ReadOnly=true;
}
//
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
string msg = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
//假设只能输入 A+A2,A-A2....A2-A2..,所以A4的长度顶多5。
// 就是确保a4输入了正确的公式,可以再加其他的验证。
if (msg.Length > 5)
{
MessageBox.Show("error");
return;
}
//
if (dataGridView1["A3", this.dataGridView1.CurrentRow.Index].Value.ToString() == string.Empty)
{
string s1 = string.Empty;
string s2 = string.Empty;
string s3 = string.Empty;
if (msg.Contains("-") || msg.Contains("+") || msg.Contains("+") || msg.Contains("/"))
{
// subtract
if (msg.Contains("-"))
{
s1 = msg.Substring(0, msg.IndexOf("-"));
s2 = msg.Substring(msg.IndexOf("-") + 1, msg.Length - msg.IndexOf("-") - 1);
s3 = (Convert.ToInt32(dataGridView1.CurrentRow.Cells[s1].Value) - Convert.ToInt32(dataGridView1.CurrentRow.Cells[s2].Value)).ToString();
}
//add
if (msg.Contains("+"))
{
s1 = msg.Substring(0, msg.IndexOf("+"));
s2 = msg.Substring(msg.IndexOf("+") + 1, msg.Length - msg.IndexOf("+") - 1);
s3 = (Convert.ToInt32(dataGridView1.CurrentRow.Cells[s1].Value) + Convert.ToInt32(dataGridView1.CurrentRow.Cells[s2].Value)).ToString();
}
// divide
if (msg.Contains("/"))
{
s1 = msg.Substring(0, msg.IndexOf("/"));
s2 = msg.Substring(msg.IndexOf("/") + 1, msg.Length - msg.IndexOf("/") - 1);
s3 = (Convert.ToInt32(dataGridView1.CurrentRow.Cells[s1].Value) / Convert.ToInt32(dataGridView1.CurrentRow.Cells[s2].Value)).ToString();
}
//multiply
if (msg.Contains("*"))
{
s1 = msg.Substring(0, msg.IndexOf("*"));
s2 = msg.Substring(msg.IndexOf("*") + 1, msg.Length - msg.IndexOf("*") - 1);
s3 = (Convert.ToInt32(dataGridView1.CurrentRow.Cells[s1].Value) * Convert.ToInt32(dataGridView1.CurrentRow.Cells[s2].Value)).ToString();
}
}
dataGridView1["A3", this.dataGridView1.CurrentRow.Index].Value = s3;
}
}
[解决办法]
学习了,谢谢。
[解决办法]
up
[解决办法]
其实如果你用2楼提供的方法,你在CellEndEdit事件中将绑定的DataTable更新,然后调用DataGridView的Refresh()方法,就可以看到那个计算列的值了。
[解决办法]
向各位学习
[解决办法]
学习了
[解决办法]
學習
------解决方案--------------------
private void frm工资_工资总表_Load(object sender, EventArgs e) { string strSql工资 = "select '' as 工号,'' as 姓名,'' as 计件工资"; string strSql工资项目 = "Select 编号,名称,公式 from JC工资项目 where 名称 <> '' and 编号 <> 'gz00' order by 编号"; DataSet ds工资项目 = clsSql.GetDs(strSql工资项目); if (ds工资项目.Tables[0].Rows.Count > 0) { for (int i = 0; i < ds工资项目.Tables[0].Rows.Count; i++) { if (ds工资项目.Tables[0].Rows[i]["名称"].ToString() != "") { strSql工资 = strSql工资 + ",'' as '" + ds工资项目.Tables[0].Rows[i]["名称"].ToString() + "'"; } } } DataSet ds = clsSql.GetDs(strSql工资); for (int i = 0; i < ds.Tables[0].Columns.Count; i++) { string GS = clsSql.Find("select 公式 from JC工资项目 where 名称 = '" + ds.Tables[0].Columns[i].ColumnName.ToString() + "'"); if (GS != "") { ds.Tables[0].Columns[i].Expression = getGs(GS); } } grd工资总表.DataSource = ds.Tables[0]; ds工资项目.Dispose(); ds.Dispose(); } private string getGs(string GS) { string strSql = "Select 编号,名称 from JC工资项目 where 名称 <> '' and 编号 <> 'gz00' order by 编号"; DataSet ds = clsSql.Find(strSql); for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { if (!clsSql.Exist("select 公式 from JC工资项目 where 编号 <> '" + ds.Tables[0].Rows[i][0].ToString() + "'")) { GS.Replace(ds.Tables[0].Rows[i][0].ToString(), ds.Tables[0].Rows[i][1].ToString()); } else { GS.Replace(ds.Tables[0].Rows[i][0].ToString(), "(" + clsSql.Find("select 公式 from JC工资项目 where 编号 <> '" + ds.Tables[0].Rows[i][0].ToString() + "'") + ")"); } } ds.Dispose(); return GS; }
我的异常网推荐解决方案:软件开发者薪资,http://www.myexception.cn/other/1391128.html