首页 > 解决方案 > 如何使用应用控制器关闭表单?

问题描述

有一个 AppController - 管理所有表单。

在 appController 下面我管理表单,但我只能打开它们。马上又来了个问题,怎么关闭?另外,当我在同一个窗口的顶部打开它时,同一个窗口也打开了。我该如何摆脱这个?我试过form == null form.IsDisposed,但有点不对劲。

public class AppController : IAppController
{
private readonly Mainform_medicalrecord _mainform;
public IDataContext DataContext { get; }
public IMessageService MessageService { get; }

public AppController(IDataContext dataContext, IMessageService messageService)
{
DataContext = dataContext ??
throw new ArgumentNullException(nameof(dataContext));
MessageService = messageService ??
throw new ArgumentNullException(nameof(messageService));

var vm = new MainViewModel(this);
_mainForm = new MainForm_MedicalRecord(vm);
}

public Form GetMainForm()
{
return _mainForm;
}

public void ShowCardView()
{
var vm = new CardViewModel(this);
var form = new CardView(vm);
form.Owner = _mainForm;
form.ShowDialog();
}
}

视图模式

public CardViewModel(AppController appController)
{
_appController = appController
?? throw new ArgumentNullException(nameof(appController));
}
throw new ArgumentNullException(nameof(appController));
}

卡片视图

public CardView(CardViewModel cardViewModel)
{
InitializeComponent();
_viewModel = cardViewModel ??
throw new ArgumentNullException(nameof(cardViewModel));
}

我将添加...打开表单时,它是重复的,我根本不需要。请帮帮我。

标签: c#sql-serverwinformsmvp

解决方案


从评论中阐述我的想法并举一个例子:

private CardView cardView = null;

public void ShowCardView()
{
    if( null == cardView )
    {
        var vm = new CardViewModel(this);
        cardView = new CardView(vm);
        cardView.Owner = _mainForm;
    }
    cardView.Show();
}

请注意,这不是线程安全的!在这里,如果还没有,您的控制器只会创建一个新的(单独的)表单。这避免了“重复”表格。

不过,您应该在此代码中添加一些线程安全措施。

如果你有,你可以添加一个关闭方法:

// Again: TODO Add thread safety!
public void CloseCardView()
{
     cardView?.Close();
     cardView = null;
}

...如果你真的需要它。我认为隐藏表单可能就足够了。


推荐阅读