2010-03-30 107 views
14

我正在为WinForms项目组织一个轻量级MVP模式。一切都编译并运行良好。但是,当我尝试在Visual Studio中以设计模式打开WinForm时,出现“路径中的非法字符”错误。我的WinForm使用泛型并从基本Form类继承。在WinForm中使用泛型有问题吗?“路径中存在非法字符”。 Visual Studio WinForm设计视图

这里是WinForm和基本Form类。

public partial class TapsForm : MvpForm<TapsPresenter, TapsFormModel>, ITapsView 
{ 
    public TapsForm() 
    { 
     InitializeComponent(); 
    } 

    public TapsForm(TapsPresenter presenter) 
     :base(presenter) 
    { 
     InitializeComponent(); 
     UpdateModel(); 
    } 

    public IList<Taps> Taps 
    { 
     set { gridTaps.DataSource = value; } 
    } 

    private void UpdateModel() 
    { 
     Model.RideId = Int32.Parse(cboRide.Text); 
     Model.Latitude = Double.Parse(txtLatitude.Text); 
     Model.Longitude = Double.Parse(txtLongitude.Text); 
    } 
} 

基本形式MvpForm:

public class MvpForm<TPresenter, TModel> : Form, IView 
    where TPresenter : class, IPresenter 
    where TModel : class, new() 
{ 
    private readonly TPresenter presenter; 
    private TModel model; 

    public MvpForm() 
    { 
    } 

    public MvpForm(TPresenter presenter) 
    { 
     this.presenter = presenter; 
     this.presenter.RegisterView(this); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     if (presenter != null) 
      presenter.IntializeView(); 
    } 

    public TModel Model 
    { 
     get 
     { 
      if (model == null) 
       throw new InvalidOperationException("The Model property is currently null, however it should have been automatically initialized by the presenter. This most likely indicates that no presenter was bound to the control. Check your presenter bindings."); 

      return model; 
     } 
     set { model = value;} 
    } 
} 
+1

是的,设计师不支持通用的基础表单。你可能没有那么远,我猜它正在死于异常,因为你没有在设计器(构造函数,Load事件)中运行的代码中检查DesignMode属性。 – 2010-03-30 16:57:55

回答

12

This post helped answer my question.

很显然,这是一个在Visual Studio中的限制。我能够通过定义泛型值的中间类来解决这个问题。它是一个真的很难看,但我现在可以在Visual Studio中打开窗体。

这是我的中介类,它必须在单独的文件中,或者在表单类定义之后。它也必须有一个默认的构造函数,暗示或明示:

public class MvpTapsForm : MvpForm<TapsPresenter, TapsFormModel> 
{ 
} 

然后在我的实际形式,我从MvpTapsForm继承。

public partial class TapsForm : MvpTapsForm, ITapsView 
{ 
    public TapsForm() 
    { 
     InitializeComponent(); 
    } 

    public TapsForm(TapsPresenter presenter) 
     : base(presenter) 
    { 
     InitializeComponent(); 
     UpdateModel(); 
    } 

    public IList<Taps> Taps 
    { 
     set { gridTaps.DataSource = value; } 
    } 

    private void UpdateModel() 
    { 
     Model.RideId = Int32.Parse(cboRide.Text); 
     Model.Latitude = Double.Parse(txtLatitude.Text); 
     Model.Longitude = Double.Parse(txtLongitude.Text); 
    } 
} 
+0

我认为它在VS 2015更新1中得到了修复。安装更新后,可以正常工作。 – Jerther 2015-12-22 15:05:15

+0

啊忘了它,有时它仍然不会工作,如果通用定义为一些自定义类。 – Jerther 2016-02-24 19:51:03

相关问题