带多个视图的 Winforms MVP 模式
Winforms MVP Pattern w/ Multiple Views
我最近创建了一个没有遵循特定设计模式的 winforms 应用程序。此应用程序有 4 个不同的 "views",每个都使用 TableLayoutPanel 实现。一个视图是 "main" 视图,允许用户 select 输入文件,其他 3 个视图包含 DataGridViews,允许用户处理从输入文件加载的数据。
问题在于我有一个表单,其中有 4 个不同的面板,这些面板在需要时隐藏并显示。但这导致我的表单 class 变得比我想的要大得多,考虑到我有不同的事件和方法来处理同一个 class 中每个面板的数据。所以我做了一些研究并遇到了 Model-View-Presenter,但我只遇到了显示具有单一视图的应用程序的示例。
我的问题是,如果我使用 MVP 并且每个视图都有自己的界面和展示器,并且视图的具体实现是使用 Form 完成的,那么在视图之间切换的最佳方式是什么(例如,当点击 "next").
我的视图的具体实现是否应该是一个Form?我在这里错过了什么吗?我想遵循 MVP 模式,但如果有更好的选择,我愿意接受建议。
首先,您要为三个 DataGridView 窗体中的每一个创建一个 UserControl。当您使用 MVP 时,每个人都应该有一个控件继承的接口。例如:
public interface IDataGridView1
{
// Properties, Methods, etc...
}
public interface IDataGridView2
{
// Properties, Methods, etc...
}
public interface IDataGridView3
{
// Properties, Methods, etc...
}
这里是 DataGridView1 UserControl 的一个例子,它继承自它的接口,也继承自 Control
:
public class DataGridView1 : Control, IDataGridView1
{
TableLayoutPanel layoutPanel;
public DataGridView1()
{
layoutPanel = new TableLayoutPanel();
// Set up the layoutPanel.
// Rest of constructor, define your controls.
// Add your controls to layoutPanel.
// Add layoutPanel to this control.
Controls.Add(layoutPanel);
}
// Methods etc...
}
其他两个 DataGridView 将类似但具有自己的功能。
然后您可以为 MainView 创建一个界面,其中包括它应该包含的三个 DataGridView 的属性,以及显示一个 DataGridView 而隐藏其余部分的方法:
public interface IMainView
{
IDataGridView1 DataView1 { get; set; }
IDataGridView2 DataView2 { get; set; }
IDataGridView3 DataView3 { get; set; }
void ShowOnlyDataView1();
void ShowOnlyDataView2();
void ShowOnlyDataView3();
// Other methods, properties, etc...
}
MainView class 将继承自 Form
及其自己的界面。在这里,我展示了通过表单的构造函数传入的实例化 DataGridView:
public class MainView : Form, IMainView
{
public IDataGridView1 DataView1 { get; set; }
public IDataGridView2 DataView2 { get; set; }
public IDataGridView3 DataView3 { get; set; }
TableLayoutPanel layoutPanel;
public MainView(IDataGridView1 dataView1, IDataGridView2 dataView2,
IDataGridView3 dataView3)
{
this.DataView1 = dataView1;
this.DataView2 = dataView2;
this.DataView3 = dataView3;
layoutPanel = new TableLayoutPanel();
// Define your layout panel here.
// Add your controls to layoutPanel.
// Add layoutPanel to the MainView.
Controls.Add(layoutPanel);
// Rest of constructor...
}
// Hides other views and show DataView1.
public void ShowOnlyDataView1()
{
DataView2.Hide();
DataView3.Hide();
DataView1.Show();
}
// Hides other views and show DataView2.
public void ShowOnlyDataView2()
{
// Etc...
}
// Hides other views and show DataView3.
public void ShowOnlyDataView3()
{
// Etc...
}
// Other Methods etc...
}
这是您的 Main 方法的示例。您需要实例化每个 DataGridView 并将它们传递到您的 MainView:
public static void Main(string[] args)
{
IDataModel dataModel = new DataModel();
IDataGridView1 dataView1 = new DataGridView1();
IDataGridView2 dataView2 = new DataGridView2();
IDataGridView3 dataView3 = new DataGridView3();
IMainView mainView = new MainView(dataView1, dataView2, dataView3);
DataGridPresenter1 dataPresenter1 = new DataGridPresenter1(dataView1, dataModel);
DataGridPresenter2 dataPresenter2 = new DataGridPresenter2(dataView2, dataModel);
DataGridPresenter3 dataPresenter3 = new DataGridPresenter3(dataView3, dataModel);
MainPresenter mainPresenter = new MainPresenter(mainView, dataModel);
}
类似的东西。
所以您的三个 DataGridView 显示在您的 MainView 中,所有四个视图都由它们自己的 Presenter 访问。
我最近创建了一个没有遵循特定设计模式的 winforms 应用程序。此应用程序有 4 个不同的 "views",每个都使用 TableLayoutPanel 实现。一个视图是 "main" 视图,允许用户 select 输入文件,其他 3 个视图包含 DataGridViews,允许用户处理从输入文件加载的数据。
问题在于我有一个表单,其中有 4 个不同的面板,这些面板在需要时隐藏并显示。但这导致我的表单 class 变得比我想的要大得多,考虑到我有不同的事件和方法来处理同一个 class 中每个面板的数据。所以我做了一些研究并遇到了 Model-View-Presenter,但我只遇到了显示具有单一视图的应用程序的示例。
我的问题是,如果我使用 MVP 并且每个视图都有自己的界面和展示器,并且视图的具体实现是使用 Form 完成的,那么在视图之间切换的最佳方式是什么(例如,当点击 "next").
我的视图的具体实现是否应该是一个Form?我在这里错过了什么吗?我想遵循 MVP 模式,但如果有更好的选择,我愿意接受建议。
首先,您要为三个 DataGridView 窗体中的每一个创建一个 UserControl。当您使用 MVP 时,每个人都应该有一个控件继承的接口。例如:
public interface IDataGridView1
{
// Properties, Methods, etc...
}
public interface IDataGridView2
{
// Properties, Methods, etc...
}
public interface IDataGridView3
{
// Properties, Methods, etc...
}
这里是 DataGridView1 UserControl 的一个例子,它继承自它的接口,也继承自 Control
:
public class DataGridView1 : Control, IDataGridView1
{
TableLayoutPanel layoutPanel;
public DataGridView1()
{
layoutPanel = new TableLayoutPanel();
// Set up the layoutPanel.
// Rest of constructor, define your controls.
// Add your controls to layoutPanel.
// Add layoutPanel to this control.
Controls.Add(layoutPanel);
}
// Methods etc...
}
其他两个 DataGridView 将类似但具有自己的功能。
然后您可以为 MainView 创建一个界面,其中包括它应该包含的三个 DataGridView 的属性,以及显示一个 DataGridView 而隐藏其余部分的方法:
public interface IMainView
{
IDataGridView1 DataView1 { get; set; }
IDataGridView2 DataView2 { get; set; }
IDataGridView3 DataView3 { get; set; }
void ShowOnlyDataView1();
void ShowOnlyDataView2();
void ShowOnlyDataView3();
// Other methods, properties, etc...
}
MainView class 将继承自 Form
及其自己的界面。在这里,我展示了通过表单的构造函数传入的实例化 DataGridView:
public class MainView : Form, IMainView
{
public IDataGridView1 DataView1 { get; set; }
public IDataGridView2 DataView2 { get; set; }
public IDataGridView3 DataView3 { get; set; }
TableLayoutPanel layoutPanel;
public MainView(IDataGridView1 dataView1, IDataGridView2 dataView2,
IDataGridView3 dataView3)
{
this.DataView1 = dataView1;
this.DataView2 = dataView2;
this.DataView3 = dataView3;
layoutPanel = new TableLayoutPanel();
// Define your layout panel here.
// Add your controls to layoutPanel.
// Add layoutPanel to the MainView.
Controls.Add(layoutPanel);
// Rest of constructor...
}
// Hides other views and show DataView1.
public void ShowOnlyDataView1()
{
DataView2.Hide();
DataView3.Hide();
DataView1.Show();
}
// Hides other views and show DataView2.
public void ShowOnlyDataView2()
{
// Etc...
}
// Hides other views and show DataView3.
public void ShowOnlyDataView3()
{
// Etc...
}
// Other Methods etc...
}
这是您的 Main 方法的示例。您需要实例化每个 DataGridView 并将它们传递到您的 MainView:
public static void Main(string[] args)
{
IDataModel dataModel = new DataModel();
IDataGridView1 dataView1 = new DataGridView1();
IDataGridView2 dataView2 = new DataGridView2();
IDataGridView3 dataView3 = new DataGridView3();
IMainView mainView = new MainView(dataView1, dataView2, dataView3);
DataGridPresenter1 dataPresenter1 = new DataGridPresenter1(dataView1, dataModel);
DataGridPresenter2 dataPresenter2 = new DataGridPresenter2(dataView2, dataModel);
DataGridPresenter3 dataPresenter3 = new DataGridPresenter3(dataView3, dataModel);
MainPresenter mainPresenter = new MainPresenter(mainView, dataModel);
}
类似的东西。
所以您的三个 DataGridView 显示在您的 MainView 中,所有四个视图都由它们自己的 Presenter 访问。