【问题标题】:Binding a DataGridView to a Object list将 DataGridView 绑定到对象列表
【发布时间】:2014-08-18 21:19:51
【问题描述】:

我是 .NET 中数据绑定的新手,我想将我的 DataGridView 绑定到一个对象列表。该网格可能以两种方式填充。

表单中有文本框,用户可以输入文本,当他们按下添加按钮时,将使用提供的字段实例化一个新对象并将其添加到列表中。

另一种方式是,当用户搜索对象时,匹配的对象会从数据库加载到列表中。此外,在搜索后,用户应该能够像第一种方法一样将新项目添加到此列表中。

最后这个列表绑定到 DataGridView,现在用户可以对网格中显示的项目进行任何更改,如果没问题,用户可以保存它们。

所以在我的演示者中,我有三种方法可以满足上述要求。

Class AttendancePresenter 
{
    private void AddAttendance()
    {
        AttendanceList.Add(attendanceModel);
        var bindingList = new BindingList<IAttendance>(AttendanceList);
        var source = new BindingSource(bindingList, null);
        _View.AttendanceGrid = source;
    }


    private void GetAttendance()
    {
        AttendanceList = _DataService.GetAttendance();
        var bindingList = new BindingList<IAttendance>(AttendanceList);
        var source = new BindingSource(bindingList, null);
        _View.AttendanceInGrid = source;
    }

    private void Save()
    {
        _DataService.InsertAttendance (AttendanceList);
    }

}
  1. 我不确定我绑定东西的方式是否正确。而且我想知道我是否可以在这里使用单个绑定列表,因为我将同一个列表绑定到同一个 DataGridView!有可能吗?

  2. 在这种情况下,将 BindingSource 与 BindingList 一起使用有什么区别?

【问题讨论】:

  • Fwiw 我使用的是较旧的 MVP 框架,但我通常看到的是 View 绑定到 Presenter,而不是 Presenter 设置视图数据源。

标签: c# .net winforms data-binding mvp


【解决方案1】:

在构造函数中将 DataGridView 绑定到演示者 AttendanceList,假设此时您的视图已实例化。然后在演示者中执行以下操作:

Class AttendancePresenter 
{
    private readonly BindingList<IAttendance> _attendanceList;

    public AttendancePresenter()
    {
        _attendanceList = new BindingList<IAttendance>();
        _View.AttendanceGrid = _attendanceList;
    }

    private void AddAttendance()
    {
        _attendanceList.Add(attendanceModel);
    }

    private void GetAttendance()
    {
        _attendanceList.Clear();

        var attendance = _DataService.GetAttendance();

        foreach (var attendant in attendance)
        {
            _attendanceList.Add(attendant);
        }
    }

    private void Save()
    {
        _DataService.InsertAttendance (_attendanceList);
    }
}

【讨论】:

  • 我的视图不知道演示者!我还没有实现那个保存部分。我的想法是使用 Attendance_ID 来查看它是否存在。
  • 好的,没问题,更新了答案以适应它。
  • 实际上我的DataService 返回一个List&lt;IAttendance&gt; 并且使用你的方法DataService 应该返回一个BindingList&lt;IAttendance&gt; 不是吗? (我指的是GetAttendance(){})我也找不到.AddRange() 方法!
  • 抱歉,我正在使用记事本 :) 更新了答案 - 试一试。
  • 嗨,我在我的应用程序中实现了你的代码。但现在我在 foreach 循环中收到错误消息...“System.ArgumentOutOfRangeException 已处理消息 = '4' 的值对 'indexStart' 无效。'indexStart' 必须小于或等于 0。”但似乎在此异常发生之前,所有项目都已成功添加到绑定列表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多