DataGridView中不会显示任何记录,即使它被绑定到List上

本文关键字:绑定 List 显示 记录 任何 DataGridView | 更新日期: 2023-09-27 18:11:21

我在Presenter中绑定了ListDataGridView,但是当我运行程序时,只显示网格列标题,而没有显示行。

View中有一个封装DGV的公共属性…

    public BindingSource Employees
    {
        set { dgvEmployees.DataSource = value; }
    }

Prsenter's构造器…

  bindingList = new BindingList<IEmployee>(_ModelList); // Presenter has a instance of `List <IEmployee>_ModelList` through the constructor injection
  var source = new BindingSource(bindingList, null);
  _View.Employees = source;

在事件处理程序方法中,我有数据访问代码…

  _ModelList = _DataService.FilterEmployees(_View.EmployeeName); // DataService returns a List<IEmployee>

我的代码中缺少的任何东西。在调试中,我注意到_ModelList正在用数据库中的几个项目填充,但它们都没有显示在网格上?这种方法有什么问题?

EDIT1:如果我在处理程序方法中这样做,它正在工作。但我知道这不是正确的做法。

   BindingSource bindingSource = new BindingSource();   
   bindingSource.DataSource = _DataService.FilterEmployees(_View.EmployeeName);
   _View.Employees = bindingSource ;

EDIT2:我发现了另一种更好的方法来做这件事。

在presentors构造函数中…

    bindingList = new BindingList<IEmployee>();
    _View.Employees = bindingList;

    var employees = _DataService.FilterEmployees(_View.EmployeeName);
    foreach (IEmployee emp in employees)
    {
        bindingList.Add(emp);
    }

最终将View的属性更改为…

    public BindingList<IEmployee> Employees
    {
        set { dgvEmployees.DataSource = value; }
    }

现在工作正常。

谁能告诉我我的第一个方法有什么问题?

DataGridView中不会显示任何记录,即使它被绑定到List上

下面两行可以解决你的问题:

        _View.Employees = null;
        _View.Employees = source;

如果你绑定相同的引用到DataGridView,它不会刷新。先赋空。这看起来像一个错误,我与DataGridView控件本身(有人纠正我,如果我错了)。

**Update 1:**

您可以绑定BindingSource(推荐)或任何集合。在您的新方法中,您正在重新创建导致DataGridView再次刷新的列表引用。如果您通过将其数据源赋值为null并重新赋值另一个引用来删除引用,则DataGridView也可以刷新。

在你的新方法中,你每次都要重新创建列表实例来分配值,而且你将无法利用BindingSource的一些良好的数据绑定功能,例如MoveNext, MovePrevious, AddNew等

我认为您的问题(在您的第一个方法中)是由于这一行

var source = new BindingSource(bindingList, null);

第二个形参指定数据成员。我不知道为什么你认为你的第二种方法,使用bindingsource的无参数构造函数是不正确的,这就是我要做的。

注意,你可以组合使用BindingList和BindingSource,将BindingList设置为BindingSource的数据源。如果您希望通过代码向列表中添加项目,这将非常有用,因为当添加项目或更改列表时,bindinglist会产生事件。

相关文章: