Winforms &引用;路径中的非法字符。”;Visual Studio WinForm设计视图

Winforms &引用;路径中的非法字符。”;Visual Studio WinForm设计视图,winforms,visual-studio-2008,mvp,Winforms,Visual Studio 2008,Mvp,我正在为WinForms项目构建一个轻量级MVP模式。一切都很好地编译和运行。但是,当我试图在Visual Studio中以设计模式打开WinForm时,我得到一个“路径中的非法字符””错误。我的WinForm使用泛型并从基窗体类继承。在WinForm中使用泛型有问题吗 下面是WinForm和基本表单类 public partial class TapsForm : MvpForm<TapsPresenter, TapsFormModel>, ITapsView { publ

我正在为WinForms项目构建一个轻量级MVP模式。一切都很好地编译和运行。但是,当我试图在Visual Studio中以设计模式打开WinForm时,我得到一个“路径中的非法字符””错误。我的WinForm使用泛型并从基窗体类继承。在WinForm中使用泛型有问题吗

下面是WinForm和基本表单类

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);
    }
}
public分部类TapsForm:MvpForm,ITapsView
{
公共TapsForm()
{
初始化组件();
}
公共TapsForm(TapsPresenter演示者)
:base(演示者)
{
初始化组件();
UpdateModel();
}
公共厕所水龙头
{
设置{gridTaps.DataSource=value;}
}
私有void UpdateModel()
{
Model.RideId=Int32.Parse(cboRide.Text);
Model.Latitude=Double.Parse(txtlitude.Text);
Model.Longitude=Double.Parse(txtdolgitude.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;}
    }
}
公共类MvpForm:Form,IView
其中TPresenter:class,IPresenter
其中TModel:class,new()
{
专用只读TPresenter演示程序;
私有TModel模型;
公共MvpForm()
{
}
公共MvpForm(TPresenter演示者)
{
this.presenter=演示者;
this.presenter.RegisterView(this);
}
受保护的覆盖无效加载(事件参数e)
{
基础荷载(e);
如果(演示者!=null)
presenter.initializeView();
}
公共TModel模型
{
得到
{
if(model==null)
抛出新的InvalidOperationException(“模型属性当前为null,但是它应该由演示者自动初始化。这很可能表示没有演示者绑定到控件。请检查演示者绑定。”);
收益模型;
}
设置{model=value;}
}
}

显然,这是VisualStudio中的一个限制。我可以通过一个定义泛型值的中间类来解决这个问题。这是一项非常糟糕的工作,但我现在可以在VisualStudio中打开表单了

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

public class MvpTapsForm : MvpForm<TapsPresenter, TapsFormModel>
{
}
公共类MvpTapsForm:MvpForm
{
}
然后在我的实际形式中,我继承了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);
    }
}
public分部类TapsForm:MvpTapsForm,ITapsView
{
公共TapsForm()
{
初始化组件();
}
公共TapsForm(TapsPresenter演示者)
:base(演示者)
{
初始化组件();
UpdateModel();
}
公共厕所水龙头
{
设置{gridTaps.DataSource=value;}
}
私有void UpdateModel()
{
Model.RideId=Int32.Parse(cboRide.Text);
Model.Latitude=Double.Parse(txtlitude.Text);
Model.Longitude=Double.Parse(txtdolgitude.Text);
}
}

是的,设计器不支持通用的基本表单。您可能还没有做到这一点,我猜它会因为一个异常而消亡,因为您没有检查设计器中运行的代码中的DesignMode属性(构造函数、加载事件)。从VS 2015.1开始,Windows窗体设计器显示具有泛型基类的类,没有任何问题。我认为它在VS 2015更新1中已修复。在我安装了更新之后,它在这里工作得很好。啊,算了吧,如果泛型被定义为某个自定义类,有时它仍然无法工作。