【问题标题】:Using DataGridView in Model-View-Presenter在 Model-View-Presenter 中使用 DataGridView
【发布时间】:2014-10-08 02:55:11
【问题描述】:

情况
我正在使用 Model-View-Presenter 结构设计一个 Windows 窗体应用程序。这意味着每个表单背后都有一个演示者类,用于处理用户输入。除此之外,我使用的是存储库结构,这意味着我希望将所有 SQL 查询放在单独的类中。
对于我的一个表单,我希望使用 DataGridView 来显示数据库中的一些数据。

我想要什么
一旦用户按下某个按钮,我希望从 DataGridView 中的数据库加载数据。换句话说,我希望将我的 DataGridView1.DataSource 绑定到一个 BindingSource,该 BindingSource 通过 SQL 查询从数据库中获取数据。
但是,由于我的 DataGridView 是私有的,我无法从演示者或存储库类访问其数据源。

我的问题
总而言之,我的问题是是否可以将 BindingSource 从存储库-cass(完成 SQL 连接和查询的地方)传递给我的演示者,再传递给我的 WinForm,后者将使用它来填充 DataGridView。 如果这是不可能的,是否有另一种方法来保持我的 MVP 和存储库结构,保持我的 DataGridView 私有并仍然用数据库数据填充它?

如果问题不清楚,请询问详细信息。提前致谢!

【问题讨论】:

    标签: c# datagridview


    【解决方案1】:

    实现 MVP 的方法有很多,如果说一种是对的,一种是错的,那就太愚蠢了。不过,主要思想是您的 View 和 Presenter 只能通过接口相互了解。然后,这种松散耦合允许我们对表示层进行单元测试,有时还可以对模型层进行单元测试。

    您实现它的方式对于 MVP 来说看起来相当不错,并且与我早期的 MVP 代码的外观非常匹配。目前,我正在尝试减少视图中的代码,并尽可能使 MVP 与 MVVM 更相似。现在通常为了设置控制数据源,我只公开一个简单的属性。由于大多数网格接受 DataTable 作为源,它可能看起来像这样:

    public Object CustomerGridDataSource
    {
        get
        {
            return CustomerGrid.DataSource;
        }
        set (Object value)
        {
            CustomerGrid.DataSource = value;
        }
    }
    

    当然,仍然需要配置网格列和其他界面任务,但即便如此,我已经从 View 转移到处理常见配置步骤的类配置系统。

    无论如何,您的解决方案做得很好。我只是想在讨论中添加一些额外的想法。

    【讨论】:

    • 另外,我刚才写的一个属性通常可能是只写的,因为 Presenter 具有对我可能永远不需要从 Presenter 访问网格源的对象的原始引用。
    【解决方案2】:

    找到一个可行的解决方案。对于那些感兴趣的人:

    bindingsource 的数据源是一个DataTable。此 DataTable 使用执行 SqlCommands 的 DataAdapter 填充。 DataTable 可以作为参数传递。 我像这样构建了我的演示者函数,当用户按下按钮时调用它:

    public void load_tableData()
        {
            FactuurRepository repository = new FactuurRepository();
            DataTable table = repository.getDataTable();
            screen.load_tableData(table);
        }
    

    存储库函数 getDataTable 将如下所示:

    try
            {
                String selectCommand = "Enter selectcommand here";
                String connectionString = "Enter connectionString here";
                SqlDataAdapter adapter = new SqlDataAdapter(selectCommand, connectionString);
                DataTable table = new DataTable();
                adapter.Fill(table);
                return table;
            }
    

    最后,我的表单中的代码变成了这样:

    public void load_tableData(DataTable table)
        {
            BindingSource binding = new BindingSource();
            binding.DataSource = table;
            dataGridView.DataSource = binding;
            dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2020-08-19
      • 1970-01-01
      相关资源
      最近更新 更多