WinForm和Class交互

时间:2012-06-18 08:30:29

标签: c# .net winforms design-patterns

我有两个classess和一个Userform。我试图不在我的classess中使用任何与Form相关的代码,但我对OOP很新。在CreateGraph()方法中,我想用“是/否”对话框提示用户。方法中的代码将根据结果继续。我已经阅读了一些关于MVP的例子,但并不完全确定我在这种情况下如何实现。

有人可以指导我吗?我相信我的代码中存在一些严重的设计问题

//singleton class
public class MyApplication
{
    private int state;
    private static MyApplication instance = null;

    public void Task1()
    {
        GraphGenerator gg = new GraphGenerator();
        gg.CreateGraph();
        state = 1;
    }

    public void Task2()
    {
        //some other tasks..
        state = 2;

    }
}

我有问题的班级..

public class GraphGenerator
{
    public void CreateGraph()
    {
        //some code for creating a graph..
        //here i want to prompt the user with a
        // Yes/No dialog box..
    }
}

用户形式

public partial class Form1 : Form
{
    private void btnTask1_Click(object sender, EventArgs e)
    {
        MyApplication ma = MyApplication.Instance;
        ma.Task1();
    }

    private void btnTask1_Click(object sender, EventArgs e)
    {
        MyApplication ma = MyApplication.Instance;
        ma.Task2();
    }
}

3 个答案:

答案 0 :(得分:2)

  1. 命名 - MyApplication - 是控制器或演示者的坏名称,例如使用"表单名称" +"演示者"用于命名。
  2. 单件。控制器或演示者不应该是单身人士。通过构造函数注入它或在ctor中创建,然后使用类中的私有setter保存到字段或属性。例如:

    public Form1(FormPresenter presenter)
    {
       InitializeComponent();
       this.presenter = presenter;
    }
    
  3. 这个简单样本的所有其他内容都是正常的。但是对于按钮事件处理程序,您可以在演示者/控制器中使用事件,并在特定于演示者/控制器事件的​​按钮事件处理程序中触发。

  4. 还尝试寻找MVC / MVP框架。在这里查看相关问题: Implementing MVC with Windows Forms

    我记得那里有Microsoft Smart Client Guidance (CAB / Microsoft Composite Application Block)

答案 1 :(得分:1)

首先,最好尽可能地设计类,这样就不需要将UI代码与域对象混合在一起。您是否可以重新构建代码,以便GraphGenerator调用方/所有者决定是否需要向用户询问而不是GraphGenerator这样做?尽量让GraphGenerator专注于他的任务或制作图表。

如果失败了,您可以在GraphGenerator内定义事件(或委托或回调接口,但现在可以调用这些相关的机制事件),以便调用者/所有者可以监听来自GraphGenerator的通知反过来与用户互动。例如,定义一个名为QueryConfirmSave的事件来引发,调用者可以处理该事件并提示用户,然后将一个布尔值作为EventArg字段传回。

(代码将是这样的(从时髦,而不是编辑检查):

GraphGenerator gg = new GraphGenerator();
gg.QueryConfirmSave += new EventHandler<ConfirmSaveArgs>(GraphGenerator_QueryConfirmSave);

然后:

private void GraphGenerator_QueryConfirmSave(object sender, ConfirmSaveArgs args)
{
   if (MessageBox.Show("Save?") == DialogResult.Yes)
   {
      args.SaveConfirmed = true;
   }
}

答案 2 :(得分:-3)

您需要MessageBox.Show(...)