DataSet myDataSet;DataGrid1.SetDataBinding(myDataSet, "Codes");DataGrid1.MouseUp += new MouseEventHandler(DataGrid1_MouseUp);private void DataGrid1_MouseUp(object sender, MouseEventArgs e)
{
System.Drawing.Point pt = new Point(e.X, e.Y);
DataGrid.HitTestInfo hti = DataGrid1.HitTest(pt);
if(hti.Type == DataGrid.HitTestType.Cell)
{
BindingManagerBase bmb = this.BindingContext[myDataSet, "Codes"];
DataRow row = ((DataRowView) bmb.Current).Row;
row[hti.Column] = DateTime.Now.ToString();
}
}
{
System.Drawing.Point pt = new Point(e.X, e.Y);
DataGrid.HitTestInfo hti = DataGrid1.HitTest(pt);
if(hti.Type == DataGrid.HitTestType.Cell)
{
BindingManagerBase bmb = this.BindingContext[myDataSet, "Codes"];
DataRow row = ((DataRowView) bmb.Current).Row;
row[hti.Column] = DateTime.Now.ToString();
}
}
OleDbConnection conn;
DataSet ds;
OleDbDataAdapter da;private void InvoiceUpdate_Load(object sender, System.EventArgs e)
{
string Src="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Invoice.mdb";
string Invoice="SELECT 购货单位,日期,货名及规格,单位,数量,单价,金额,已报销,图片名称,备注,编号 FROM invoice";
conn=new OleDbConnection(Src);
da=new OleDbDataAdapter(Invoice,conn);
ds=new DataSet();
da.Fill(ds,"invoice");
dataGridInvoice.SetDataBinding(ds,"invoice");
}private void UpdateInvoice()
{
string Upt="UPDATE invoice SET 购货单位=@购货单位,日期=@日期,货名及规格=@货名及规格,单位=@单位,数量=@数量,单价=@单价,金额=@金额,已报销=@已报销,图片名称=@图片名称,备注=@备注 WHERE 编号=@编号";
da.UpdateCommand=new OleDbCommand(Upt,conn);
OleDbParameter Para;
//下面这些参数添加的先后顺序一定要和SQL语句中的顺序一致,其中WHERE子句中的参数位于最后,也就是要严格一致才行!
Para=da.UpdateCommand.Parameters.Add("@购货单位",OleDbType.Char);
Para.SourceColumn="购货单位";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@日期",OleDbType.Char);
Para.SourceColumn="日期";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@货名及规格",OleDbType.Char);
Para.SourceColumn="货名及规格";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@单位",OleDbType.Char);
Para.SourceColumn="单位";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@数量",OleDbType.Char);
Para.SourceColumn="数量";
Para.SourceVersion=DataRowVersion.Original;
Para=da.UpdateCommand.Parameters.Add("@单价",OleDbType.Char);
Para.SourceColumn="单价";
Para.SourceVersion=DataRowVersion.Original;
Para=da.UpdateCommand.Parameters.Add("@金额",OleDbType.Char);
Para.SourceColumn="金额";
Para.SourceVersion=DataRowVersion.Original;
Para=da.UpdateCommand.Parameters.Add("@已报销",OleDbType.Char);
Para.SourceColumn="已报销";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@图片名称",OleDbType.Char);
Para.SourceColumn="图片名称";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@备注",OleDbType.Char);
Para.SourceColumn="备注";
Para.SourceVersion=DataRowVersion.Current;
Para=da.UpdateCommand.Parameters.Add("@编号",OleDbType.BigInt);
Para.SourceColumn="编号";
Para.SourceVersion=DataRowVersion.Original;
if(MessageBox.Show("你真的要保存对数据库所做的更改吗?","确认!",MessageBoxButtons.OKCancel,MessageBoxIcon.Question)==DialogResult.OK)
{
da.Update(ds,"invoice");
dataGridInvoice.SetDataBinding(ds,"invoice");
}
}
'创建一个新数据集来保存对主数据集所做的更改。
Dim objDataSetChanges As 总量监测.dataset4 = New 总量监测.dataset4()
'停止当前的任何编辑。
'If TabControl1.SelectedIndex = 0 Then
Me.BindingContext(objdataset4, "水污染物月报").EndCurrentEdit()
'Else
'If TabControl1.SelectedIndex = 1 Then
Me.BindingContext(Dataset41, "大气污染物季报").EndCurrentEdit()
' End If
'End If
'获取对主数据集所做的更改。
If TabControl1.SelectedIndex = 0 Then
objDataSetChanges = CType(objdataset4.GetChanges, 总量监测.dataset4)
Else
If TabControl1.SelectedIndex = 1 Then
objDataSetChanges = CType(Dataset41.GetChanges, 总量监测.dataset4)
End If
End If
'检查是否做了任何更改。
If (Not (objDataSetChanges) Is Nothing) Then
Try
'需要做一些更改,所以尝试通过调用 update 方法
'和传递数据集以及任何参数来更新数据源。
Me.UpdateDataSource(objDataSetChanges)
If TabControl1.SelectedIndex = 0 Then
objdataset4.Merge(objDataSetChanges)
objdataset4.AcceptChanges()
Else
If TabControl1.SelectedIndex = 1 Then
Dataset41.Merge(objDataSetChanges)
Dataset41.AcceptChanges()
End If
End If
Catch eUpdate As System.Exception
'在此处添加错误处理代码。
Throw eUpdate
End Try
'添加代码以检查返回的数据集中是否有任何可能已被
'推入到行对象错误中的错误。
End If End Sub
Public Sub LoadDataSet()
'创建一个新数据集以保存从 FillDataSet 调用返回的记录。
'使用了一个临时数据集,这是因为填充现有的数据集
'需要重新绑定数据绑定。
Dim objDataSetTemp As 总量监测.dataset4
objDataSetTemp = New 总量监测.dataset4()
Try
'尝试填充临时数据集。
Me.FillDataSet(objDataSetTemp)
Catch eFillDataSet As System.Exception
'在此处添加错误处理代码。
Throw eFillDataSet
End Try
Try
'清空数据集中的旧记录。
If TabControl1.SelectedIndex = 0 Then
objdataset4.Clear()
'将记录合并到主数据集中。
objdataset4.Merge(objDataSetTemp)
Else
If TabControl1.SelectedIndex = 1 Then
Dataset41.Clear()
'将记录合并到主数据集中。
Dataset41.Merge(objDataSetTemp)
End If
End If
Catch eLoadMerge As System.Exception
'在此处添加错误处理代码。
Throw eLoadMerge
End Try End Sub
Public Sub UpdateDataSource(ByVal ChangedRows As 总量监测.dataset4)
Try
'在有挂起的更改时,只需要更新数据源即可。
If (Not (ChangedRows) Is Nothing) Then
'打开连接。
conn.Open()
'尝试更新数据源。
'If TabControl1.SelectedIndex = 0 Then
OleDbDataAdapter1.Update(ChangedRows)
'Else
'If TabControl1.SelectedIndex = 1 Then
OleDbDataAdapter2.Update(ChangedRows)
'End If
'End If
End If
Catch updateException As System.Exception
'在此处添加错误处理代码。
Throw updateException
Finally
'无论是否引发了异常都关闭连接。
conn.Close()
End Try End Sub
Public Sub FillDataSet(ByVal dataSet As 总量监测.dataset4)
'在填充数据集前关闭约束检查。
'这允许适配器填充数据集而不用考虑
'表之间的依赖项。
dataSet.EnforceConstraints = False
Try
'打开连接。
conn.Open()
'尝试通过 OleDbDataAdapter1 填充数据集。
'If TabControl1.SelectedIndex = 0 Then
Me.OleDbDataAdapter1.Fill(dataSet)
'Else
'If TabControl1.SelectedIndex = 1 Then
Me.OleDbDataAdapter2.Fill(dataSet)
'End If
'End If
Catch fillException As System.Exception
'在此处添加错误处理代码。
Throw fillException
Finally
'重新打开约束检查。
dataSet.EnforceConstraints = True
'无论是否引发了异常都关闭连接。
conn.Close()
End Try End Sub
好象也不能使当前正在编辑格的数据写到datatable中
我现在就是捕获到了datagrid的回车事件,在事件处理中希望能将当前编辑的内容写到后台的datatable中,焦点移不移都无所谓了。
foreach (DataGridTextBoxColumn cs in gridStyle.GridColumnStyles)
{
cs.TextBox.Leave+=new System.EventHandler(this.DataGridCell_TextChanged);
}
//bdData是datagrid绑定的数据集private void DataGridCell_TextChanged(object sender, System.EventArgs e)
{
TextBox tb=(TextBox)sender;
string txt=tb.Text.Trim(); DataTable table=bdData.Tables[BDData.BD_TABLE]; //如果dataGrid.CurrentRowIn dex不小于myTable的记录数的话,表示DataGrid中正在添加记录
if (dataGrid.CurrentRowIndex>=this.BindingContext[bdData,BDData.BD_TABLE].Count)
{
//往绑定的数据集插入一新行
}
else
{//如果textbox的值和datagrid绑定的datatable对应的值不一样
if(!txt.Equals(table.Rows[dataGrid.CurrentCell.RowNumber][dataGrid.CurrentCell.ColumnNumber].ToString()))
{
DataRow row=table.Rows[dataGrid.CurrentCell.RowNumber];
row.BeginEdit();
row[dataGrid.CurrentCell.ColumnNumber]=txt;
row.EndEdit();
}
}
//检查datagrid绑定的数据集是否发生变化,如果发生变化则显示“更新”按钮
if(((BDClass)BDArray[selectednode.Index]).bdData.HasChanges())
{
//显示更新按钮
}
}
我的思想就是当离开所编辑的datagrid中当前的cell对应的textbox时,绑定一个函数,对datatable对应的值进行修改。除了绑定TextBox.Leave消息外,你也可以绑定TextBox的其它消息。
grid.Update();
Adapter.Update(dataset);
因为我的当前焦点并没有离开textbox,所以不会引发leave事件,如果绑定keydown的话,因为我需要处理的键是enter键,这个键是DATAGRID系统键,也不会被textbox捕获到,只有继承datagrid。yuwen16(rr):
不行
你要焦点不离开textbox,又要把datagrid中cell的内容写到datatable中,请问是在什么情况下要去写呢?
CurrencyManager manage =(CurrencyManager)BindingContext[DATASET , TableName];
在保存的时候调用下面的两个方法
this.manage .Refresh();
this.manage .EndCurrentEdit();