【问题标题】:Winforms Designer: How to disable my usercontrol from being a container?Winforms Designer:如何禁用我的用户控件成为容器?
【发布时间】:2012-08-09 20:31:00
【问题描述】:

我有一个相对简单的设置。我有一个自定义用户控件,上面有一堆组件、一些文本框和一个列表视图。

在设计器中,我可以将其他控件拖放到我的用户控件中,然后将它们添加到用户控件实例中。我不想要这个。

如何明确地说“不允许向此用户控件添加其他控件?”

【问题讨论】:

  • 只是一个问题:为什么你不希望你的容器控件充当容器?
  • 我不知道创建用户控件意味着我想要一个容器。我只是想制作一个包含其他几个控件的控件,我可以重复使用它们。但是,一旦放置,我不希望它们被添加到,我希望我的用户控件的所有实例都包含相同的项目。
  • 我无法复制该问题。默认情况下,您放置在表单上的 UserControl不会充当容器。在防止设计模式下的 UserControl 向其添加控件方面:为什么?这不就是您最初创建控件的方式吗?

标签: c# winforms drag-and-drop containers windows-forms-designer


【解决方案1】:

这不是它的工作方式。当您将用户控件放在表单上时,不支持向其添加控件。这需要一个特殊的设计师,this answer 显示了所需的内容。也许它看起来 像添加了控件,但它们只是重叠您的用户控件。它们的父级仍然是表单。

如果程序员自己在设计器中打开您的用户控件类,那么他当然可以随意添加控件。阻止这种情况的唯一方法是不发布源代码并使用 sealed 关键字来防止从中派生。

【讨论】:

  • 不幸的是,这似乎不是真的。我现在正在查看winforms设计师的大纲视图。我将一个控件拖到另一个控件中,然后它就嵌入其中了。大纲视图反映了这一点,显示第二个缩进到第一个中。实际上,我使用 tablelayoutpanel 对控件进行排序,并且不允许在同一个单元格中使用多个控件。
  • 我在主帖中添加了截图。
  • 我不知道如何从这样的屏幕截图中逆向工程代码。
  • 我很感激。我的控件确实实现了以下接口,但我正在挖掘代码,并且它没有继承除 UserControl 之外的任何接口。它确实实现了几个设计器和类型转换器,但我认为它们不能相关。我可能应该花时间制作一个小代码示例来重现。
【解决方案2】:

您可以创建一个布尔属性 MyContainer.DisableAddControls 或其他东西。

如果您的MyContainer.Controls.Add(..) 被覆盖,那么您可以在该Add() 方法中抛出一些自定义异常,如下所示:

if(DisableAddControls)
{
    throw new DisableAddControlsException();
}

如果您直接从ContainerControl 继承该方法,那么您可以处理ControlAdded 事件并在那里抛出异常。

myContainer.ControlAdded += myContainerControlAdded;

private void Control_Added(object sender, System.Windows.Forms.ControlEventArgs e)
{
    if(DisableAddControls)
    {
        throw new DisableAddControlsException();
    }
}

再想一想,这不会在设计时抛弃你的设计师......没关系。

【讨论】:

    猜你喜欢
    • 2021-07-09
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    相关资源
    最近更新 更多