C#WinForms基本用户控件
我在VS2019中遇到了一些用户控件问题 我有一个基本用户控件(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
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()
或两者。我发现了一些有趣的内容。解决方案包括3个项目,一个数据访问库(.Net Framework)、UI(包含详细控件的WinForms项目)和一个支持库(.NET Core)。如果我删除支持库并引用已编译的DLL,它似乎一切正常。如果我引用项目,那就是当我得到pOnLayout()