.NET DataSet.HasChanges is incorrectly false

2019-07-04 09:57发布

Has anybody come across ds.hasChanges() being false despite that the ds clearly has the changes while you check it at a breakpoint? I've been looking at it for quite a while and I can't see what is wrong...

// connectionstring and command has been set
DataSet ds = new DataSet();
BindingSource myBindingSource = new BindingSource();
SqlDataAdapter dataAdapter1 = new SqlDataAdapter();
dataAdapter1.Fill(ds, "Data");
myBindingSource.DataSource = ds.Tables["Data"];

// then changes made to the datatable on a windows form using bindingnavigator
ds.HasChanges(DataRowState.Modified); // is false

Now when I set a breakpoint after the row with HasChanges and use DataSet Visualizer I can see that the DataSet has in fact changed, but HasChanges still returns false.

I'm sure I'm missing the obvious... can anybody see what I'm doing wrong?

Cheers

2条回答
仙女界的扛把子
2楼-- · 2019-07-04 10:30

Try calling the EndCurrentEdit() on BindingContext first:

DataTable dt = ds.Tables["Data"];
this.BindingContext[dt].EndCurrentEdit();

if(ds.HasChanges(DataRowState.Modified))
{
  // do your stuff here
}

Also try calling the myBindingSource.EndEdit() that will push any un-commited data to the DataTable.

查看更多
ゆ 、 Hurt°
3楼-- · 2019-07-04 10:42

The Windows Form isn't doing a .AcceptChanges() call on the DataSet is it?

Edit: Ok so not that. Next things, per my comment:
1) have records def been modified and not just added/deleted? What does DataSet.HasChanges() return?
2) what does GetChanges() return for the specific datable within the dataset?

查看更多
登录 后发表回答