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();
  } 

解决方案 »

  1.   

    参考我下面的代码,最重要的是注意我代码中的注释,我调了三天才调通的。
    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");
    }
    }
      

  2.   

    Public Sub UpdateDataSet()
            '创建一个新数据集来保存对主数据集所做的更改。
            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
      

  3.   

    Me.BindingContext(objdataset4, "水污染物月报").EndCurrentEdit()
    好象也不能使当前正在编辑格的数据写到datatable中
      

  4.   

    OleDbDataAdapter OleDbDataAdapter1 = new OleDbDataAdapter(..............);.................OleDbDataAdapter1.Fill(dataSet11);.....................//对数据库进行修改以后OleDbDataAdapter。Updata(dataSet11);
      

  5.   

    你要干什么啊!正在编辑的数据也往dataset里写?
      

  6.   

    老大,我说的不是写数据库啊,而是将DATAGRID当前编辑的数据写到后台的那个设置成DATAGRID的数据源的那个DATATABLE里面去
      

  7.   

    是啊,我就是要把正在编辑的数据往dataset里写!有没有办法?
      

  8.   

    我觉的应该捕获form的回车事件,在事件中进行处理。并自动将焦点移动到下一个应该编辑的单元中。
      

  9.   

    我就是想要实用啊,老大,我才不喜欢研究这些该死的技巧呢
    我现在就是捕获到了datagrid的回车事件,在事件处理中希望能将当前编辑的内容写到后台的datatable中,焦点移不移都无所谓了。
      

  10.   

    你移动到另外一格是因为触发了datagridtextboxcolumn的commit事件,只有触发commit事件才能写到datatable中,Me.BindingContext(objdataset4, "水污染物月报").EndCurrentEdit()也不能触发该事件。当你点击button按钮是可以触发该事件的,但toolbar上的button除外!我也想知道什么方法能触发该事件,强烈关注!!
      

  11.   

    SORRY,前面我说焦点移动不移动无所谓是错误的,焦点在我的程序中是不能被移动的!
      

  12.   

    to 5drush(五农民出狗狗)://在DATAGRID上绑定textbox编辑消息
    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())
       {
    //显示更新按钮
       }
    }
      

  13.   

    to 5drush(五农民出狗狗):
    我的思想就是当离开所编辑的datagrid中当前的cell对应的textbox时,绑定一个函数,对datatable对应的值进行修改。除了绑定TextBox.Leave消息外,你也可以绑定TextBox的其它消息。
      

  14.   

    用这个方法绝对可以。。grid.BindingContext[dataset,"表名"].EndCurrentEdit();
    grid.Update();
    Adapter.Update(dataset);
      

  15.   

    ccchn(爱喝茶的老虎):
    因为我的当前焦点并没有离开textbox,所以不会引发leave事件,如果绑定keydown的话,因为我需要处理的键是enter键,这个键是DATAGRID系统键,也不会被textbox捕获到,只有继承datagrid。yuwen16(rr):
    不行
      

  16.   

    to  5drush(五农民出狗狗) 
    你要焦点不离开textbox,又要把datagrid中cell的内容写到datatable中,请问是在什么情况下要去写呢?
      

  17.   

    to  5drush(五农民出狗狗) 你这个问题的关键在于如何将datagrid的cell同datatable的相应的单元找出来,通过((DataRowView)BindingManagerBase.Current).Row可以确定当前所在datagrid所对应的datatalbe的Row,不过datagrid中的列怎么对应到datatable的列我还真不知道,哪位知道的可以指点一下啊。
      

  18.   

    问题解决了,单独调用EndEdit或者EndCurrentEdit都不能更新后台datatable,但是两个都调用就能更新了,信息是Saucer告诉我的,所以分全给saucer了
      

  19.   

    先给你的表帮定一个
    CurrencyManager manage =(CurrencyManager)BindingContext[DATASET , TableName];
    在保存的时候调用下面的两个方法
    this.manage .Refresh();
    this.manage .EndCurrentEdit();