操作界面:
dgv初始化
private void dgvHeadInit(int id) { string sql1 = @"select id,fno,positation, worktimeNo as 工序代码, initialCount as 起始针数, seamDistance as 车缝距离, endCount as 落回针数, initialCount+seamDistance+endCount as [每小时指标(件)], worktimeName as 工序名称, samTime as SAM值, target AS 工序指标, equipment as 使用设备, tool as 使用工具, pid from product_desProductTime where pid=" + id + " and positation='头部' and fno='"+txtfNo.Text+"'"; SqlConnection cn = new SqlConnection("server=172.20.50.4;uid=sa;pwd=p4japo020;database=gsd"); sda1 = new SqlDataAdapter(sql1, cn); ds1 = new DataSet(); sda1.Fill(ds1,"info"); //dt1 = ds1.Tables[0]; //ds1.Tables[0].TableName = "product_desProductTime"; dgvHead.DataSource = ds1.Tables[0]; // dgvHead.DataSource = dt1; dgvHead.Columns["id"].Visible = false; dgvHead.Columns["fNo"].Visible = false; dgvHead.Columns["positation"].Visible = false; dgvHead.Rows[0].Selected = false; //dgvHead.Columns["pid"].Visible = false; // dgv.DataSource = dt1;//分别绑定数据源 //DataRow dr1 = ds1.Tables[0].NewRow(); //ds1.Tables[0].Rows.Add(dr1); }
1 private void dgvHead_CellLeave(object sender, DataGridViewCellEventArgs e) 2 { 3 //第一次加载时候,dgvHead.Rows[e.RowIndex].Cells[e.ColumnIndex].Value默认是第一行的id值 4 if (dgvHead.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null) 5 { 6 tempCellValue = null; 7 return; 8 } 9 tempCellValue = dgvHead.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); 10 }
1 private void dgvHead_CellValidated(object sender, DataGridViewCellEventArgs e) 2 { 3 string curValue = dgvHead.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); 4 if (tempCellValue==curValue) 5 { 6 return; 7 } 8 else 9 { 10 if (e.ColumnIndex==3) 11 { 12 string workTimeNo = dgvHead.CurrentRow.Cells[3].Value.ToString(); 13 string sql2 = @"select count(*) from desProductTime where workTimeNo='"+workTimeNo+"'"; 14 cn = new SqlConnection(strconn); 15 cmd = new SqlCommand(sql2,cn); 16 cn.Open(); 17 int x = (int)(cmd.ExecuteScalar()); 18 cn.Close(); 19 if (x!=0) 20 { 21 cn = new SqlConnection(strconn); 22 string sql3 = @"select * from desProductTime where workTimeNo='"+workTimeNo+"'"; 23 cmd = new SqlCommand(sql3,cn); 24 cn.Open(); 25 26 SqlDataReader sdr = cmd.ExecuteReader(); 27 while (sdr.Read()) 28 { 29 30 dgvHead.Rows[e.RowIndex].Cells[1].Value = txtfNo.Text; 31 dgvHead.Rows[e.RowIndex].Cells[2].Value = "头部"; 32 dgvHead.Rows[e.RowIndex].Cells[4].Value = sdr["initialCount"].ToString(); 33 dgvHead.Rows[e.RowIndex].Cells[5].Value = sdr["seamDistance"].ToString(); 34 dgvHead.Rows[e.RowIndex].Cells[6].Value = sdr["endCount"].ToString(); 35 dgvHead.Rows[e.RowIndex].Cells[7].Value = (int)dgvHead.Rows[e.RowIndex].Cells[4].Value + (int)dgvHead.Rows[e.RowIndex].Cells[5].Value + (int)(dgvHead.Rows[e.RowIndex].Cells[6].Value); 36 dgvHead.Rows[e.RowIndex].Cells[8].Value = sdr["worktimeName"].ToString(); 37 dgvHead.Rows[e.RowIndex].Cells[9].Value = sdr["samTime"].ToString(); 38 dgvHead.Rows[e.RowIndex].Cells[10].Value = sdr["target"].ToString(); 39 dgvHead.Rows[e.RowIndex].Cells[11].Value = sdr["equipment"].ToString(); 40 dgvHead.Rows[e.RowIndex].Cells[12].Value = sdr["tool"].ToString(); 41 dgvHead.Rows[e.RowIndex].Cells[13].Value = id; 42 43 44 } 45 cn.Close(); 46 } 47 else 48 { 49 MessageBox.Show("工序代码输入有误!"); 50 return; 51 } 52 53 54 } 55 else 56 { 57 58 dgvHead.Rows[e.RowIndex].Cells[7].Value = (int)dgvHead.Rows[e.RowIndex].Cells[4].Value + (int)dgvHead.Rows[e.RowIndex].Cells[5].Value + (int)(dgvHead.Rows[e.RowIndex].Cells[6].Value); 59 } 60 } 61 }
1 private void btnSave_Click(object sender, EventArgs e) 2 { 3 //int id = 0; 4 //保存到数据库之前先判断一下主表是否有重复记录 5 string fno = txtfNo.Text.Trim(); 6 string fname = txtPname.Text.Trim(); 7 int orderqty = Convert.ToInt32(txtOrderQty.Text); 8 double orderc = Convert.ToDouble(txtOrderCoefficient.Text); 9 Image pic = pbchef.Image; 10 //主表的修改 11 string sql1 = "select count(1) from desProductAttach where fno='" + fno + "' and fno!='" + args["pNo"].ToString() + "' and fname='" + fname + "' and orderqty=" + orderqty + " and orderCoefficient=" + orderc + ""; 12 int count = Convert.ToInt32(SqlHelp.GetValue(CommandType.Text, sql1)); 13 if (count != 0) 14 { 15 MessageBox.Show("数据库中已经存在重复记录,请修改后重新录入!"); 16 return; 17 } 18 string sql2 = @"update desProductAttach set fno='" + fno + "',fname='" + fname + "',orderqty=" + orderqty + ",orderCoefficient=" + orderc + " where id="+id+""; 19 SqlHelp.ExecuteNonQuery(CommandType.Text,sql2); 20 21 //子表的更新(通过数据源更新) 22 //int flag = 2; 23 //flag= UpdateByDataSet(ds1, "product_desProductTime",strconn); 24 if (ds1.HasChanges()) 25 { 26 SqlCommandBuilder cb = new SqlCommandBuilder(sda1); 27 sda1.Update(ds1.Tables[0]); 28 ds1.AcceptChanges(); 29 dgvHead.Update(); 30 } 31 32 }
我现在知道问题出在dgvHead_CellLeave和dgvHead_CellValidated事件,导致现在更新有的时候成功,有时候失败,请教 我该怎么改?
就是通过一个保存按钮直接实现对数据库的增删改操作
datagridview少一行数据这是最常见的问题了,吴瑞祥说的
“你试试点确定前,先点下其它地方,然后看看.”
至于为啥,怎么解决,你是一个程序员,想想就有办法了。
如果非要给出一个理由,那就是
Datagridview中的修改尚未提交到Dataset中,而工具栏“保存”的点击事件触发是在
Datagridview的LostFocus之前的,而Dataset中的数据要等到Datagridview行离开后才会更新相关行的数据。所以不离开行,那行数据的修改、新增都不在Dataset中。
这样就造成保存代码是在Dataset接收到数据修改前运行。
如果你使用的不是工具栏,而是按钮Button,你点击按钮的事件是在Datagridview的LostFocus之后的,就不会有这种问题。
微软就是这么设计的,你咬比尔盖茨去吧,不然就自己想想办法。
大叔 你的回答是解释了为什么,但是没告诉我怎么做.按照道理只能给你一半分,不过还是给你80吧,能看得出来你经验很丰富, 我已经搞定了 多谢
@wq_vincent: 做法很多,不想限制住你的创造新思维。
我觉得提供思路就够了,大部分情况我不喜欢直接给答案的。
dataset和gridview不是可以直接用数据源绑定,然后自己做同步吗?什么代码都不用写的.
更新失败是有异常,还是代码都正常指定,但没有结果?
@吴瑞祥: 所有代码都正常运行,但有时候没结果
我明明对datagridview增加了一行,但是调试的时候,发现if (ds1.HasChanges())是false,更新那步直接跳过了
@吴瑞祥: 我这个是对工序代码那列输入一个数据,然后自动从数据库中其他的表读取数据填充后面的列.
@wq_vincent:你试试点确定前,先点下其它地方,然后看看.
你看下数据库的各个字段的长度设置是不是短了
跟这个没关系吧,我的问题是:比方说我在datagridview中增加了2行数据,但是点保存的时候,数据库中只增加了一行,最后输入的那行就没更新到数据库,这是什么原因??
@wq_vincent: 点击保存按钮的时候加上这句话试试
dgvHead.EndEdit();
@刘宏玺: 已试,没用
DATASET作为DATAGRID的数据源,当DATAGRID的数据内容变更后,会自动的保存在DATASET里,此时,数据没有真正更新到数据库。
通过SQLDATAADAPTER的UPDATECOMMAND,可以实现DATASET变更数据的更新操作,这个操作从某种意义上说是批量的。