【问题标题】:Winforms MVP Pattern w/ Multiple Views具有多个视图的 Winforms MVP 模式
【发布时间】:2017-08-13 17:42:12
【问题描述】:

我最近创建了一个没有遵循特定设计模式的 winforms 应用程序。此应用程序有 4 个不同的“视图”,每个视图都使用 TableLayoutPanel 实现。一个视图是“主”视图,允许用户选择输入文件,其他 3 个视图包含允许用户处理从输入文件加载的数据的 DataGridView。

问题在于我有一个表单,其中包含 4 个不同的面板,这些面板在需要时隐藏并显示。但这导致我的表单类变得比我想的要大得多,因为我有不同的事件和方法对同一类中的每个面板的数据进行操作。所以我做了一些研究,发现了 Model-View-Presenter,但我只遇到了显示具有单视图的应用程序的示例。

我的问题是,如果我使用MVP并且每个视图都有自己的界面和演示者,并且视图的具体实现是使用Form完成的,那么在视图之间切换的最佳方式是什么(例如,当单击“下一个”)。

我的视图的具体实现是否应该是一个表单?我在这里错过了什么吗?我想遵循 MVP 模式,但如果有更好的选择,我愿意接受建议。

【问题讨论】:

  • 当我过去这样做时,我将每个视图创建为实现特定自定义界面的 UserControl,例如IWizardView。然后是一个小代码来选择正确的视图,也许使用有状态的WizardViewFactoryNext()Prev() 方法。只有一种选择。
  • UserControl 是处理这个问题的最佳方式
  • 谢谢!我将使用 UserControl 实施并跟进我的解决方案。

标签: c# winforms datagridview mvp tablelayoutpanel


【解决方案1】:

首先,您要为三个 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 类将继承自 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);
}

类似的东西。

所以你的三个 DataGridViews 显示在你的 MainView 中,所有四个视图都由它们自己的 Presenter 访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多