"路径中的非法字符." Visual Studio WinForm设计视图

jac*_*akj 14 mvp visual-studio-2008 winforms

我正在为WinForms项目组装一个轻量级的MVP模式.一切都编译好,运行良好.但是,当我尝试在Visual Studio中以设计模式打开WinForm时,出现" 路径中的非法字符 "错误.我的WinForm使用泛型并从基类Form类继承.在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

基本形式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;}
    }
}
Run Code Online (Sandbox Code Playgroud)

jac*_*akj 12

这篇文章有助于回答我的问题.

显然,这是Visual Studio中的一个限制.我能够通过一个定义通用值的中间类来解决它.这是一个非常难看的工作,但我现在可以在Visual Studio中打开表单.

这是我的中间类,它必须在单独的文件中,或者在表单类定义之后.它还必须具有默认构造函数,隐式或显式:

public class MvpTapsForm : MvpForm<TapsPresenter, TapsFormModel>
{
}
Run Code Online (Sandbox Code Playgroud)

然后在我的实际形式中,我继承自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);
    }
}
Run Code Online (Sandbox Code Playgroud)