带有多个视图的Winforms MVP模式

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

问题在于我有一个表单,其中包含4个不同的面板,这些面板被隐藏并在需要时可见.但是,这导致我的表单类变得比我想考虑的不同,因为我有不同的事件和方法来处理同一类中每个面板的数据.因此,我进行了一些研究,并遇到了Model-View-Presenter,但我仅遇到了显示具有单视图应用程序的示例.

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

我的观点的具体实现应该是表格吗?我在这里想念什么吗?我想遵循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类将从Form及其自己的接口继承.在这里,我展示了通过窗体的构造函数传递的实例化DataGridViews:

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访问.

上一篇:如何在排序后在给定位置的bindingsource中添加一行? C#


下一篇:CodeGo.net>如何反转DataGridView中的行