2010-03-30 101 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