在Model-View-Presenter中使用DataGridView

时间:2014-08-14 12:42:08

标签: c# datagridview

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

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

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

如果问题不明确,请询问详情。提前谢谢!

2 个答案:

答案 0 :(得分:2)

找到了一个有效的解决方案对于那些感兴趣的人:

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

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);
    }

答案 1 :(得分:0)

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

你实现它的方式看起来非常适合MVP,并且与我之前的MVP代码的外观非常匹配。目前我正在尝试减少View中的代码,并尽可能使MVP与MVVM更相似。通常,对于设置控制数据源这些天我只是暴露一个简单的属性。由于大多数网格都接受DataTable作为源,因此它可能如下所示:

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

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

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