BindingSource 取消添加新

Lou*_*Lou 2 .net c# datagridview bindingsource

是否可以取消在BindingSource.AddingNew事件处理程序中添加项目?

当用户单击 my 中的“添加新”按钮时BindingNavigator,我打开了一个对话框,该对话框可能会或可能不会返回有效文件。现在,我有这样的事情:

void bindingSource_AddingNew(object sender, AddingNewEventArgs e)
{
    using (var dialog = new OpenFileDialog())
    {
        var result = dialog.ShowDialog();

        // user canceled?
        if (result == DialogResult.Cancel)
            return;

        // TryLoad will return null on failure
        var data = TryLoad(dialog.FileName);

        // only add the item to the grid if not null
        if (data != null)
            e.NewObject = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

即使我没有e.NewObject在处理程序中设置一个值,DataGridView 中也会出现一个新的(“空”)项。

是否可以取消添加项目?

She*_*byZ 5

如果您的 BindingSource 实现了ICancelAddNew接口,您应该能够在新添加的对象上调用 CancelNew 来还原它。我不建议在 AddNew 的事件处理程序中尝试这个。通过使用此接口,您的项目仍将添加到列表中,但处于挂起状态,其中 EndNew() 将提交事务,而 CancelNew() 将还原事务。看起来BindingList实现了 ICancelNew 并允许您执行以下操作:

public void MyFunctionWhereIAddNew()
{
    var item  = _myBindingSource.AddNew();

    item.SetSomeParams(...);

    if(item.CheckItemForSuccess() != true)
    {
        _myBindingSource.CancelNew(_myBindingSource.IndexOf(item));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您想要有关如何实施您自己的 ICancelNew 的链接,请查看这篇旧博文