【问题标题】:Refreshing a binding source after add, update or delete添加、更新或删除后刷新绑定源
【发布时间】:2011-06-21 05:49:45
【问题描述】:

我需要知道是否有办法在添加、更新或删除记录后刷新绑定源,以便在删除记录的情况下,我将能够在绑定导航器工具栏中显示正确的记录数.

我正在制作一个工资单应用程序模块,用于添加银行。我无法添加两个连续的记录(现在只能一次添加一个,关闭我的应用程序,然后添加另一个)。我的应用程序已集成到 SAP Business 1。

在我的 BankMasterForm.cs 上有

private void BankMaintenanceForm_Load(object sender, EventArgs e)
{
    bankMasterBindingSource.DataSource = Program.Kernel.Get<IBankMasterService>().GetAllBankMasters();
}

我也在为这个应用程序使用 Ninject 插件

我在 IBankMasterService.cs(接口)表单上的代码:

namespace Payroll.BLL
{
    public interface IBankMasterService
    {
        IEnumerable<BankMaster> GetAllBankMasters();

        BankMaster GetBankMaster(string code);

        void AddBankMaster(BankMaster bankMaster);

        void UpdateBankMaster(BankMaster bankMaster);

        void DeleteBankMaster(BankMaster bankMaster);

        string GenerateSAPCode();
    }
}

我也有 BankMasterService.cs 类:

namespace Payroll.BLL
{
    public class BankMasterService : IBankMasterService
    {
        private readonly IBankMasterRepository _bankMasterRepository;

        public BankMasterService(
            IBankMasterRepository bankMasterRepository)
        {
            Guard.AgainstNullParameter(bankMasterRepository, "bankMasterRepository");

            _bankMasterRepository = bankMasterRepository;
        }

        public IEnumerable<BankMaster> GetAllBankMasters()
        {
            return _bankMasterRepository.SelectAll();
        }

        public BankMaster GetBankMaster(string code)
        {
            var rulesException = new RulesException<BankMaster>();

            // Business rule: Answer Id cannot be less than 1
            if (!code.HasValue())
                rulesException.ErrorFor(x => x.Code, "Code cannot be null");

            if (rulesException.Errors.Any()) throw rulesException;

            return _bankMasterRepository.GetEntity(code);
        }

        public void AddBankMaster(BankMaster bankMaster)
        {
            // Business rule: 0
            var errors = DataAnnotationsValidationRunner.GetErrors(bankMaster);

            var rulesException = new RulesException();

            rulesException.ErrorsForModel(errors);

            // Other validation rules

            if (rulesException.Errors.Any()) throw rulesException;

            // Save to database
            _bankMasterRepository.Insert(bankMaster);
        }

        public void UpdateBankMaster(BankMaster bankMaster)
        {
            // Business rule: 0
            var errors = DataAnnotationsValidationRunner.GetErrors(bankMaster);

            var rulesException = new RulesException();

            rulesException.ErrorsForModel(errors);

            // Other validation rules

            if (rulesException.Errors.Any()) throw rulesException;

            // Save to database
            _bankMasterRepository.Update(bankMaster);
        }

        public void DeleteBankMaster(BankMaster bankMaster)
        {
            var bm = GetBankMaster(bankMaster.Code);

            if (bm != null)
            {
                // Delete from database
                _bankMasterRepository.Delete(bm);
            }
        }

        public string GenerateSAPCode()
        {
            var result = default(long);

            var codesList = from b in GetAllBankMasters()
                            select new { Code = long.Parse(b.Code) };

            codesList = codesList.OrderBy(x => x.Code);

            var lastRecord = codesList.LastOrDefault();

            if (lastRecord != null)
                result = lastRecord.Code + 1;

            return result.ToString();
        }
    }
}

我的 BankMasterForm.cs 表单上的示例删除函数是:

private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
{
    DialogResult result = MessageBox.Show("Are You Sure You Want To Delete This Record?", "Confirm", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

    if (result == DialogResult.Yes)
    {
        // Get service instance
        var bankMasterService = Program.Kernel.Get<IBankMasterService>();

        var bankMasterDelete =
                new BankMaster
                {
                    Code = txt_code.Text
                };

        // Delete record
        bankMasterService.DeleteBankMaster(bankMasterDelete);

        //clear textfields after input
        txt_code.Text = string.Empty;
        txt_bank_code.Text = string.Empty;
        txt_bank_name.Text = string.Empty;
        cb_bank_type.Text = null;
        txt_address1.Text = string.Empty;
        txt_address2.Text = string.Empty;
        txt_comments.Text = string.Empty;

        MessageBox.Show("Bank Details Deleted Successfully");
    }
}

我的问题是,我如何获得绑定源,即:

bankMasterBindingSource.DataSource = Program.Kernel.Get<IBankMasterService>().GetAllBankMasters();

例如在删除后刷新?

任何帮助将不胜感激。

【问题讨论】:

  • 这是一个 Winforms 应用程序,还是其他一些 UI 工具包?此信息应添加到问题中,并可能添加到标签中。
  • @Merlyn Morgan-Graham。它是 SAP Business 1 附加组件 - Windows 表单应用程序

标签: c# .net winforms data-binding


【解决方案1】:

我很确定 .ResetBindings() 调用会强制它刷新列表。

但是,如果您正在执行 GUI 操作,最好使用绑定源来执行删除。这样您就可以使用表单等的验证属性,然后在下面实现基础设施来完成您需要完成的工作。想象一个多客户端系统,其中一次发生许多更改,列表会不断刷新。因此,绑定源允许您抽象视图更改的时间和频率,但旨在维护具有某种程度的理智的本地状态。

【讨论】:

  • 感谢您的回复。我不知道如何使用绑定源来执行删除。我将不得不对此进行研究
  • 你的列表应该实现 IList。 IList 有一个 .Remove 函数。如果将 IList 绑定到绑定源,则调用 BindingSource.Remove 将对绑定项目的 IList 执行 .Remove。然后,这将执行为您在 IList 上实现 .Remove 编写的删除逻辑。
【解决方案2】:

我找到了答案。只需在每次编辑或添加记录后添加这行代码。它刷新绑定源。

// Refresh the datasource
bankMasterBindingSource.DataSource = Program.Kernel.Get<IBankMasterService>().GetAllBankMasters().ToList();

这样,系统可以“看到”新添加或更新的记录

【讨论】:

    猜你喜欢
    • 2013-09-22
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2021-09-30
    • 2014-07-21
    • 2020-05-07
    相关资源
    最近更新 更多