读书人

WinForm DataGridView公式有关问题? 重

发布时间: 2013-09-11 16:59:41 作者: rapoo

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的相乘。帮您写了个触发器,代码如下,仅供参考:

SQL code
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()方法,就可以看到那个计算列的值了。
[解决办法]
向各位学习
[解决办法]
学习了
[解决办法]

------解决方案--------------------


探讨
关键是gz01*gz02是写在数据库里面的,也可能是gz01+gz02*gz03之类的,
要将数据库里的公式对应的查出来,然后再到datagridview上面去执行公式

[解决办法]
谢谢伟大的楼主的分享
[解决办法]
mark 一下 以后学习
[解决办法]
C# code
        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

读书人网 >C#

热点推荐