C#WinForms基本用户控件

C#WinForms基本用户控件,c#,winforms,inheritance,user-controls,C#,Winforms,Inheritance,User Controls,我在VS2019中遇到了一些用户控件问题 我有一个基本用户控件(WinForms),我希望从中继承所有其他用户控件。基本控件提供了我所需要的一些公共属性 public partial class MyBaseControl : System.Windows.Forms.UserControl { internal Int32 _caseID; internal object _objectID; public int CaseID { get => _caseI

我在VS2019中遇到了一些用户控件问题

我有一个基本用户控件(WinForms),我希望从中继承所有其他用户控件。基本控件提供了我所需要的一些公共属性

public partial class MyBaseControl : System.Windows.Forms.UserControl
{

    internal Int32 _caseID;
    internal object _objectID;

    public int CaseID { get => _caseID; set => _caseID = value; }
    public object ObjectID { get => _objectID; set => _objectID = value; }

    internal virtual void MakeScreenReadOnly()
    {
    }
    public MyBaseControl()
    {
        Type systemType = this.GetType();
        PropertyInfo propertyInfo = systemType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
        this.AutoScroll = true;

    }

}
继承此基本控件的控件在应用程序运行时都可以正常工作,但我无法在设计器中查看该控件。用户控件是

public partial class AddressControl : MyBaseControl
    {
....
}
我得到了错误

The service System.Windows.Forms.Design.IEventHandlerService already exists in the service container. Parameter name: serviceType
尝试在设计器中查看AddressControl时

在早期版本的VisualStudio中,这一点曾经奏效。有人有什么想法吗

  • 从VisualStudio退出
  • 打开文件资源管理器:导航到包含项目的文件夹
  • 删除“bin”和“obj”文件夹
  • 再次打开Visual Studio,然后打开并重新编译项目
      • 从VisualStudio退出
      • 打开文件资源管理器:导航到包含项目的文件夹
      • 删除“bin”和“obj”文件夹
      • 再次打开Visual Studio,然后打开并重新编译项目
      您可以尝试重新创建用户控件

      从项目中排除旧控件以将其保留在磁盘上

      将旧文件移到项目文件夹外(
      MyBaseControl.cs
      &
      MyBaseControl.Designer.cs

      使用
      项目>添加>用户控件
      向导

      在其中复制旧代码

      不要删除
      InitializeComponent()来自构造函数:在之后添加代码

      如果Visual Studio没有损坏,它可能会工作并解决您的问题,否则您可以尝试修复或卸载并重新安装它

      以下是我所尝试的:

      • 我添加了这个用户控件:

        public partial class UserControl1 : UserControl
        {
          public UserControl1()
          {
            InitializeComponent();
          }
        }
        
      • 我编译

      • 我添加了另一个usercontrol并更改了父控件:

        public partial class UserControl2 : UserControl1
        {
          public UserControl2()
          {
            InitializeComponent();
          }
        }
        
      它工作正常,设计者可以正确地显示这两种情况

      接下来,我添加了代码,同时保留了
      InitializeComponent()
      调用

      public partial class UserControl1 : UserControl
      {
        internal Int32 _caseID;
        internal object _objectID;
      
        public int CaseID { get => _caseID; set => _caseID = value; }
        public object ObjectID { get => _objectID; set => _objectID = value; }
      
        internal virtual void MakeScreenReadOnly()
        {
        }
        public UserControl1()
        {
          InitializeComponent();
          Type systemType = this.GetType();
          PropertyInfo propertyInfo = systemType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
          this.AutoScroll = true;
        }
      }
      
      我编译


      所有操作都正常。

      您可以尝试重新创建用户控件

      从项目中排除旧控件以将其保留在磁盘上

      将旧文件移到项目文件夹外(
      MyBaseControl.cs
      &
      MyBaseControl.Designer.cs

      使用
      项目>添加>用户控件
      向导

      在其中复制旧代码

      不要删除
      InitializeComponent()来自构造函数:在之后添加代码

      如果Visual Studio没有损坏,它可能会工作并解决您的问题,否则您可以尝试修复或卸载并重新安装它

      以下是我所尝试的:

      • 我添加了这个用户控件:

        public partial class UserControl1 : UserControl
        {
          public UserControl1()
          {
            InitializeComponent();
          }
        }
        
      • 我编译

      • 我添加了另一个usercontrol并更改了父控件:

        public partial class UserControl2 : UserControl1
        {
          public UserControl2()
          {
            InitializeComponent();
          }
        }
        
      它工作正常,设计者可以正确地显示这两种情况

      接下来,我添加了代码,同时保留了
      InitializeComponent()
      调用

      public partial class UserControl1 : UserControl
      {
        internal Int32 _caseID;
        internal object _objectID;
      
        public int CaseID { get => _caseID; set => _caseID = value; }
        public object ObjectID { get => _objectID; set => _objectID = value; }
      
        internal virtual void MakeScreenReadOnly()
        {
        }
        public UserControl1()
        {
          InitializeComponent();
          Type systemType = this.GetType();
          PropertyInfo propertyInfo = systemType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
          this.AutoScroll = true;
        }
      }
      
      我编译



      一切都很好。

      遗憾的是,这也不起作用。今晚我打算在我的家用电脑上试试,看看是否有同样的行为,但我尝试卸载/安装如果你创建一个新的用户控件而不做任何更改会发生什么:你能打开设计器并看到空的控件表面吗?是的,如果我将AddressControl更改为继承自UserControl,它也能正确显示。它对我不起作用。在这种情况下,我看不到UserControl2。我得到了一个与我的支持DLL有关的不同错误(请参阅我在原始帖子上的评论)。我开始认为支持DLL由于某种原因导致了问题。不知道为什么是唯一的问题。遗憾的是,这也不起作用。今晚我打算在我的家用电脑上试试,看看是否有同样的行为,但我尝试卸载/安装如果你创建一个新的用户控件而不做任何更改会发生什么:你能打开设计器并看到空的控件表面吗?是的,如果我将AddressControl更改为继承自UserControl,它也能正确显示。它对我不起作用。在这种情况下,我看不到UserControl2。我得到了一个与我的支持DLL有关的不同错误(请参阅我在原始帖子上的评论)。我开始认为支持DLL由于某种原因导致了问题。不知道为什么是唯一的问题。我发现了一些有趣的事情。该解决方案由3个项目组成,一个数据访问库(.Net Framework)、UI(包含详细控件的WinForms项目)和一个支持库(.Net Core)。如果我删除了支持库并引用了编译后的DLL,看起来一切都很好。如果我引用项目,那就是我得到项目的时候。UI项目引用数据访问库和支持库,支持库引用数据访问库用户控件构造函数不应包含InitializeComponent();?我已经添加了它,但它并没有解决问题。之后你是否进行了一次干净的重建?删除反射。在用户控件中,可以设置
      this.DoubleBuffered=true
      this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true)在其构造函数中。-请确保基类和派生类中没有重复的属性,例如,
      [Designer(GetType(…)]
      。在这种情况下,请从派生类中删除该属性。--不要执行基类中与设计时/设计模式相关的任何操作(选中
      if(DesignMode)(…)
      ),尤其是在
      Load
      事件中。如果需要设置某些内容,请重写
      OnHandleCreated()
      OnLayout()
      或两者。我发现了一些有趣的内容。解决方案包括3个项目,一个数据访问库(.Net Framework)、UI(包含详细控件的WinForms项目)和一个支持库(.NET Core)。如果我删除支持库并引用已编译的DLL,它似乎一切正常。如果我引用项目,那就是当我得到p