除非第二级嵌套组件具有事件,否则“属性窗口”不会显示三级嵌套组件的事件 - c#

我有两个System.ComponentModel类,ComponentAComponentB

public class ComponentA : Component
{
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ComponentB ComponentB { get; } = new ComponentB();

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public Timer TimerA { get; } = new Timer();
}

public class ComponentB : Component
{
    //[Browsable(false)]
    public event EventHandler ComponentBEvent;

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public Timer TimerB { get; } = new Timer();
}

请注意,ComponentA类的属性如何为ComponentB类型,而ComponentB类的属性如何为Timer(System.Windows.Forms.Timer)类型。 ComponentA还具有类型为Timer的属性,尽管目前尚不相关。 ComponentB也有一个事件(ComponentBEvent),这个事实是我发现的关键。

照原样,这些类将产生我想要的内容,即通过使用“属性窗口”将事件处理程序分配给嵌套组件中的事件的能力。 “属性”窗口的“事件”选项卡的以下屏幕截图显示了如何为ComponentB中的TimerB属性的Tick事件分配事件处理程序。

上面ComponentB的源代码具有注释掉ComponentBEvent事件的Browsable属性。取消注释属性,如下所示:

public class ComponentB : Component
{
    [Browsable(false)]
    public event EventHandler ComponentBEvent;

    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public Timer TimerB { get; } = new Timer();
}

不幸的是,ComponentB完全从“属性”窗口的“事件”选项卡中消失了,从而无法将事件处理程序分配给ComponentB的TimerB属性。

综上所述,我发现能够使用“属性”窗口中的“属性”选项卡将事件处理程序分配给具有第三层嵌套(TimerB)的组件,这对于包含组件(ComponentB)来说是必需的。有一个事件(在示例中为ComponentBEvent)。这仅对于具有第三层嵌套(或更高级)的组件是一个问题。 ComponentA类没有任何事件,但这并不排除一个将事件处理程序分配给其TimerA属性的事件,如第一个屏幕截图所示。

我遇到的问题仅影响“属性”窗口的“事件”选项卡。 “属性”选项卡按预期显示所有组件的属性。

我的问题是,如何使用“属性”窗口的“属性”选项卡将事件处理程序分配给具有第三层嵌套的组件,而不会被迫在其包含的组件中发生事件?

我的测试是使用.NET Framework 4.7.2项目中的Windows Forms应用程序完成的。

参考方案

如果您要自己设置PropertyGrid.SelectedObject,那么我建议您还是实现CustomTypeDescription(example),以便较早地设置使用自己的属性扩展它的功能(这非常有用)。

但是,由于它是Winforms Designer的属性窗口,因此我不知道如何处理它。

尽管您可以通过在更高级别上显示缺少的事件来使用解决方法:

public class ComponentA : Component
{
    public event EventHandler ComponentBTimerBTick
    {
        add => ComponentB.TimerB.Tick += value;
        remove => ComponentB.TimerB.Tick -= value;
    }

    ...
}

从JAVA调用方法C#.NET - java

我有一个C#.NET项目中创建的dll,我想从Java程序中调用方法。我想知道是否存在实现此目标的机会,然后遇到了JNA和JNI。我应该使用哪一个?有什么建议么?我只需要在使用C#.NET编写的类中调用方法并处理Java程序的结果即可。 参考方案 这取决于您的应用程序,但是您可以将C#DLL放在服务中,例如WCF并以这种方式将功能公开给Java代码。使用ws…

SQLite。修复sqlite-net-wp8项目依赖项 - c#

为什么SQLGet在NuGet上不可用?为什么它是Visual Studio的一部分,您必须在“工具”->“扩展和更新”中查找更新?在过去的几个月中,我开始对Windows 8和Windows Phone 8进行编码,我希望对此有所了解。对我来说,在Windows 8项目上使用SQLite会创建VS级依赖关系。假设我使用Visual Studio ID…

从ASP.NET 1.1转换为ASP.Net 3.5后,单选按钮停止工作 - javascript

[我在下面以FYI的形式发布我们的问题和解决方案。如果您有Microsoft或代表机构对此问题的正式声明,我会将其标记为答案。否则,我下面的帖子将作为答案]。问题:我们采用了ASP.Net 1.1程序,并将其转换为ASP.Net 3.5。该页面最初正确显示,默认情况下选中一个单选按钮,并显示一个项目列表(“列表A”)。当我们单击另一个单选按钮时,它将正确显示…

在硬件级别模拟按键-Windows - java

我正在寻找一种语言或库,以使我可以尽可能地模拟按键,而无需实际按下按键。(我对按键级别的具体衡量标准是,当我的计算机已经在运行按键侦听器(例如MouseKey和StickyKeys)时,它是否会产生与物理按键相同的输出。)我已经尝试了许多模拟按键的方法。Java AWT库,Java win32api,python win32com sendKeys,pyth…

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……