为什么我需要在 SaveChanges 之前更改 Binding Source Position

Why do I need to change the Binding Source Position before I can SaveChanges

我有一个小型演示 WinForms 应用程序。其中一个表格是我的添加新人表格。我使用了详细信息视图而不是数据源中的 DataGridView。当我输入数据并单击导航器上的保存按钮时,更改为零,但是我在 Load 形式的 AddNew 之后放置了 MovePreviousMoveNext,所有内容按预期工作。

public partial class AddPersonForm : Form
{
    private readonly DemoContext _context;

    public AddPersonForm()
    {
        _context = new DemoContext();
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        _context.People.Load();

        personBindingSource.DataSource = _context.People.Local.ToBindingList();

        personBindingSource.AddNew();
        personBindingSource.MovePrevious();
        personBindingSource.MoveNext();

        base.OnLoad(e);
    }

    private void personBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        int changes = _context.SaveChanges();
        Debug.WriteLine("# of changes: " + changes);
    }
}

为什么我需要切换 BindingSource Position 才能识别更改并保存?

您不需要更改位置,实际上您需要调用 EndEdit 将待定更改应用到基础数据源的 BindingSource。

更改头寸会导致基础货币管理器调用 EndCurrentEdit,这就是绑定源的 EndEdit 方法为您所做的。

这就是你通常想做的事情:

try
{
    this.Validate();
    bindingSource1.EndEdit();
    //Save data by dbContext.SaveChange or tableAdapter.Update
    //Set the dialog result or show a success message
}
catch (Exception ex)
{
    //Handle the exception, log it and/or show a failure message
}