【问题标题】:UserControl with generic control - broken in designer具有通用控件的 UserControl - 在设计器中损坏
【发布时间】:2016-07-21 17:48:09
【问题描述】:

我有一个 WinForm-UserControl,它具有一个控件的泛型类型。为了创建实例,我更改了设计器代码:

public class TimeBarForm<T> : where T : TimeBarPanel
{
    protected void InitializeComponent()
    {
        // ...
        this.m_timeBarPanel = (T)Activator.CreateInstance(typeof(T));
        // ...
    }
}

这在编译时工作得很好,但在设计时它就坏了。在 TimeBarForm 上:

Failed to parse method 'InitializeComponent'. The parser reported the following error 
'Type parameters are not suppported Parameter name: typeSymbol'. 
Please look in the Task List for potential errors.

派生类只显示空用户控件的默认设计器。

我也尝试在构造函数中传递类型,但 VS 抱怨我不应该接触自动生成的代码(它不喜欢 if 条件)。我想要一个通用的 UserControl,我可以在其中决定派生类型中抽象类/控件的专门化,并且我仍然应该能够在基类中使用设计器。我愿意接受其他解决此问题的建议,因为这可能不是最佳解决方案。我不太习惯 UserControl 设计。

VS 2015/.Net 4.6

【问题讨论】:

  • 一般来说,不要手动更改设计器生成的代码。如果设计师改变,它可能会破坏设计师或您的代码可能会被删除。设计师的工作基于解析和反序列化。如错误中所述,它无法反序列化代码。看看这个帖子Can't view designer when coding a form in C#。它包含有关设计师如何工作的有用信息。它还包含一个有趣的示例,可以帮助您了解设计师的工作原理。
  • 您是否可以让您的基本控件TimeBarPanel 非抽象(因为设计师的目的)?
  • 在我当前的实现中它是非抽象的。但我必须以某种方式“注入”专业化。

标签: c# winforms visual-studio generics user-controls


【解决方案1】:

我做了一个有点肮脏的解决方法,但我可以将设计器用于基类和派生类。我删除了泛型并用对构造函数的调用替换了 Activator 类。当我完成基类的设计时,我评论了这一行。派生类调用构造函数传递实例:

    public TimeBarForm(TimeBarPanel timeBarPanel)
    {
        this.m_timeBarPanel = timeBarPanel;
        InitializeComponent();
    }

为了让派生类的设计者满意,第二个构造函数提供了一个默认实例:

    public TimeBarForm()
    {
        this.m_timeBarPanel = new TimeBarPanel();
        InitializeComponent();
    }

不漂亮,但我可以忍受。

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多