繁体   English   中英

在Model-View-Presenter中使用DataGridView

[英]Using DataGridView in Model-View-Presenter

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

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

我的问题
综上所述,我的问题是是否可以将BindingSource从存储库实例(完成SQL连接和查询的地方)传递给我的演示者,再传递给我的WinForm,后者将使用它来填充DataGridView。
如果这不可能,是否有其他方法可以保持我的MVP和存储库结构,保持我的DataGridView私有并仍用数据库数据填充它?

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

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

绑定源的数据源是一个数据表。 使用执行SqlCommands的DataAdapter填充此DataTable。 可以将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);
    }

实现MVP的方法有很多种,说一个是对的,另一个是错是很愚蠢的。 但是,主要思想是您的View和Presenter仅通过界面彼此了解。 然后,这种松散的耦合使我们可以对表示层(有时是模型层)进行单元测试。

您实现的方式对于MVP来说看起来非常不错,并且与我之前的MVP代码看起来非常相似。 目前,我正在尝试减少View中的代码,并尽可能使MVP与MVVM更加相似。 这些天通常用于设置控制数据源,我只是公开一个简单的属性。 由于大多数网格都接受DataTable作为源,因此它可能看起来像这样:

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

当然,仍然需要配置网格列和其他接口任务,但是即使如此,我也已经从View移出了可以处理常见配置步骤的类的配置系统。

无论如何,请为您的解决方案做好工作。 我只是想在讨论中添加一些其他想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM