我最近创建了一个没有特定设计模式的winforms应用程序。此应用程序有4个不同的视图",每个视图使用TableLayoutPanel实现。一种观点是"主要"允许用户选择输入文件的视图,其他3个视图包含允许用户使用从输入文件加载的数据的DataGridViews。
问题在于我有一个单独的表格,里面有4个不同的面板,这些面板是隐藏的,并在需要时可见。但这导致我的表单类变得比我想要的要大得多,因为我有不同的事件和方法对同一类中的每个面板的数据进行操作。所以我做了一些研究并遇到了Model-View-Presenter,但我只遇到过用单视图显示应用程序的示例。
我的问题是,如果我使用MVP并且每个视图都有自己的界面和演示者,并且视图的具体实现是使用Form完成的,那么在视图之间切换的最佳方式是什么(例如,当点击&时#34;下一个"。)
我的观点的具体实施是否应该是一个表格?我在这里错过了什么吗?我想遵循MVP模式,但如果有更好的选择,我愿意接受建议。
答案 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中,并且所有四个视图都可以由他们自己的演示者访问。