【问题标题】:.GetChanges shows always null.GetChanges 始终显示为空
【发布时间】:2012-07-12 12:10:18
【问题描述】:

我使用sqladapter 直接从datagridview 更改数据库值。

为此,我使用以下代码:

private void ok_Modify_Click(object sender, EventArgs e) {
    //modify mod = new modify();
    //modify_gv.DataSource = mod.TabletoMod(tickerBox.Text, FundBox.Text);        
    connetionString = Properties.Settings.Default.TraFra;
    connection = new SqlConnection(connetionString);
    Sql = "select * from Approval where Ticker ='" + tickerBox.Text + "'";
    try {
        connection.Open();
        adapter = new SqlDataAdapter(Sql, connection);
        adapter.Fill(ds);
        connection.Close();
        modify_gv.DataSource = ds.Tables[0];
    } catch (Exception ex) {
        MessageBox.Show(ex.ToString());
    }
}

private void modify_gv_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
    try {
        cmdBuilder = new SqlCommandBuilder(adapter);
        changes = ds.GetChanges();
        if(changes != null)
            adapter.Update(changes);
        //   MessageBox.Show("Changes Done");
    } catch (Exception ex) {
        MessageBox.Show(ex.ToString());
    }
}

但是,每次我对datagridview 进行更改时,变量“changes”始终为空。你知道为什么吗?

【问题讨论】:

  • 你在哪里打电话给AcceptChanges?这将清除对数据集的更改跟踪。
  • 我试过 cmdBuilder = new SqlCommandBuilder(adapter); ds.AcceptChanges();更改 = ds.Tables[0].GetChanges();但更改仍然为空
  • 不,我的意思是 不要 调用 AcceptChanges 是否会导致 GetChanges 什么也不返回。
  • 好吧明白了,不,我不叫{AccepChanges}
  • 加载数据集后也不会立即发生变化。

标签: c# sql datagridview


【解决方案1】:

我认为您可能会发现 DataGridView 控件在您移出“当前”行之前不会将更改写入基础数据源 - 因此,当 CellValueChanged 事件触发时,它没有将更改写入绑定的 DataRow .

例如,如果您要处理 DataTable 对象的“RowChanged”事件,GetChanges 将返回更改的行(您还可以观察到该事件仅在您离开正在编辑的行时触发)。

我确信有一种方法可以强制 DataGridView 控件将更改写入底层 DataRow,但我还没有尝试过 (BeginEdit/EndEdit ?)

【讨论】:

    【解决方案2】:

    ds.GetChanges()之前调用ds.AcceptChanges()

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2011-03-15
      相关资源
      最近更新 更多