场合
我正在使用Model-View-Presenter结构设计Windows Forms应用程序。这意味着每个Form都有一个演示者类,处理用户输入。除此之外,我使用的是存储库结构,这意味着我希望将所有SQL查询放在单独的类中
对于我的一个表单,我希望使用DataGridView来显示数据库中的一些数据。
我想要什么
一旦用户按下某个按钮,我希望从DataGridView中的数据库加载数据。换句话说,我希望将我的DataGridView1.DataSource绑定到一个BindingSource,它通过SQL查询从数据库中获取数据。
但是,由于我的DataGridView是私有的,我无法从我的演示者或存储库类访问其数据源。
我的问题
总而言之,我的问题是是否可以从存储库-cass(SQL连接和查询完成),我的演示者,我的WinForm传递BindingSource,它将使用它来填充DataGridView。登记/>
如果这是不可能的,有没有另一种方法来保持我的MVP和repositorystructure,保持我的DataGridView私有,仍然用数据库数据填充它?
如果问题不明确,请询问详情。提前谢谢!
答案 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移出到处理常见配置步骤的类的配置系统。
无论如何,你的解决方案做得很好。我只想在讨论中添加一些额外的想法。