Winforms MVP模式w /多视图

时间:2017-03-21 20:32:15

标签: c# winforms datagridview mvp tablelayoutpanel

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

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

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

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

1 个答案:

答案 0 :(得分:3)

首先,您要为三个DataGridView表单中的每一个创建一个UserControl。当您使用MVP时,每个人都应该有一个控件继承的接口。例如:

<script src="https://code.highcharts.com/stock/5.0.7/highstock.js"></script>

以下是DataGridView1 UserControl的一个示例,它继承自其接口,也来自import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; public class Lottery extends JPanel implements ActionListener { private static final long serialVersionUID = 5815877011755522230L; private JTextField text; private JLabel title, subTitle; public final String Title = "Lottery"; public static void main(String[] args) { make(); } public Lottery() { title = new JLabel(Title, JLabel.CENTER); title.setFont(title.getFont().deriveFont(30.0f)); add(title); subTitle = new JLabel("Lottery Numbers"); subTitle.setHorizontalAlignment(JLabel.HORIZONTAL); setLayout(new BorderLayout()); add(subTitle, BorderLayout.CENTER); } public static void make(){ JFrame frame = new JFrame("Lottery"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Lottery hi = new Lottery(); frame.setContentPane(hi); frame.setSize(600, 600); frame.setVisible(true); } public void actionPerformed(ActionEvent e) { } }

public interface IDataGridView1
{
    // Properties, Methods, etc...
}

public interface IDataGridView2
{
    // Properties, Methods, etc...
}

public interface IDataGridView3
{
    // Properties, Methods, etc...
}

另外两个DataGridViews类似,但具有自己的功能。

然后,您可以为MainView创建一个界面,其中包含它应包含的三个DataGridViews的属性,以及显示一个DataGridView同时隐藏其余DataGridView的方法:

Control

MainView类将继承自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:

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...
}

以下是您的Main方法的示例。您将需要实例化每个DataGridView并将它们传递到MainView:

Form

这样的事情。

因此,您的三个DataGridViews将显示在您的MainView中,并且所有四个视图都可以由他们自己的演示者访问。