设计时编辑器支持控件集合

2023-12-13

我想向组件添加一个表示控件集合的属性,并有一个集合编辑器,通过它我可以轻松选择属于该集合的控件。 VS确实almost我想要的自动使用以下代码:

    Private _controls As New List(Of Control)
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    Public ReadOnly Property SelectedControls() As List(Of Control)
        Get
            Return _controls
        End Get
    End Property

我得到了默认的CollectionEditor,可以添加和删除控件,并且集合是序列化的。

问题是我不想添加new控件,我想从表单上的其他可用控件中选择多个控件。有没有任何简单/标准的方法可以做到这一点,或者我必须编写自己的集合编辑器并运行控件集合?

尽管有大量关于集合编辑器(UITypeEditors)和其他设计时主题的材料,但我无法找到任何演示这种确切行为的链接,因此感谢任何帮助。


好吧,与此同时我已经吃过午饭并自己编写了编辑器。并没有付出多大的努力。如果有帮助的话,我很乐意分享。

编辑:解决方案摘要

我编写了一个编辑器(参见屏幕截图),它递归地列出了树视图中表单上找到的所有控件。如果控件设置了文本或图像属性,则显示文本/图像。用户可以使用复选框选择多个控件,甚至可以过滤列表以仅显示某些类型的控件。

(不过,我必须承认,由于该编辑器仅供内部使用,因此我一般不会费心检查图像属性,我只处理几个众所周知的控件类型。)

alt text

编辑器表单中的代码实际上仅用于 UI,负责填充树、设置对预选控件列表的检查,并在用户单击“确定”关闭表单时返回所选控件的列表。

接下来,我们有一个实现 UITypeEditor 的类,我将其称为 FormControlSelectionEditor。这个类被分配给我们想要使用编辑器使用[Editor]属性的属性。它只不过是在需要时创建表单的新实例并将其显示为模式对话框。

然后是属性本身,其类型为 System.Collections.ObjectModel.ObservableCollection(Of Control)。我选择 ObservableCollection 是因为我也需要在运行时对列表的更改做出反应,但其他列表只需稍作调整即可完成。

我发现的一件事是我必须编写我的属性和编辑器,以便它们使用控件列表的副本。换句话说,UITypeEditor 代码复制存储在属性中的列表,并将其传递到编辑器表单(用于在打开表单时设置检查),当表单关闭时,我清除属性的支持列表并复制从编辑器返回的列表中的每个控件。我发现否则我在 .designer 文件中序列化时会遇到问题。我不认为事情必须是这样;我认为这更有可能是我的错误。

典型属性的代码:

    Private WithEvents _insertButtons As New System.Collections.ObjectModel.ObservableCollection(Of Control)
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
    <Editor(GetType(Design.FormControlSelectionEditor), GetType(UITypeEditor))> _
    Public Property InsertButtons() As System.Collections.ObjectModel.ObservableCollection(Of Control)
        Get
            Return _insertButtons
        End Get
        Set(ByVal value As System.Collections.ObjectModel.ObservableCollection(Of Control))
            If value Is Nothing Then
                RemoveInsertButtonEventHandlers(_insertButtons)
                _insertButtons.Clear()
            Else
                ' Copy the list items passed in into the internal list
                For i As Integer = _insertButtons.Count - 1 To 0 Step -1
                    If Not value.Contains(_insertButtons.Item(i)) Then _insertButtons.RemoveAt(i)
                Next
                For Each ctl As Control In value
                    If Not _insertButtons.Contains(ctl) Then _insertButtons.Add(ctl)
                Next
            End If
        End Set
    End Property
    Private Function ShouldSerializeInsertButtons() As Boolean
        Return _insertButtons.Count > 0
    End Function
    Private Sub ResetInsertButtons()
        InsertButtons = Nothing
    End Sub

我已将编辑器放入 zip 文件中;在这里下载.

正如我之前提到的,这只是一个快速而肮脏的解决方案,仅供内部使用。尽管如此,我还是很感激任何改进建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计时编辑器支持控件集合 的相关文章

  • Task.Delay 值得取消吗?

    我最近使用取消模式重新实现了一大堆异步 WCF 服务方法 我在很多地方都看到过这种模式的描述 您可以在其中等待Task WhenAny在已启动的任务和 Task Delay 上 当然 现有任务是不可取消的 但这有望在以后的版本中得到解决 就
  • 如何在自定义用户控件(.Net 4、Winforms)上使用项目集合编辑器?

    我创建了一个UserControl其中包含一个自定义ToolStrip Control 在使用时UserControl在整个应用程序中 ToolStrip控件不能直接访问 因为它逻辑上嵌入在UserControl 因此 要访问的项目Tool
  • 从 UIWebView 打开媒体播放器时收到通知吗?

    我有一个UIViewController在我的应用程序中UIWebView在里面 这UIWebView大小固定并配置为在新窗口中打开任何链接UIViewController 浏览器 这是可行的 但是当我尝试从 Web 视图中单击 YouTu
  • 如何将 Cookie 集合转换为通用列表?容易地

    任何人都知道我如何转换Request Cookies into a List
  • .NET - 用户控件拖放 - 子控件

    我有 FlowLayoutPanel 和用户控件 可以拖放重新排序 这种作品 但问题是子控件阻止拖动实际的父 UserControl 所以我的问题是如何启用包含子控件的 UserControl 的拖动 如果我理解正确的话 我遇到了与您相同的
  • 如何制作可修补/可更新的应用程序?

    我已经完成了一个学生项目 该项目从互联网上的 xml 文件中提取数据并将其保存到数据库并显示 我以几种不同的方式使用这些数据 例如在主页上显示在另一个选项卡中作为表格 并创建一些图表 我通过制作 5 个不同的类来完成这一切 每个类提取不同类
  • 在 .NET 中旋转 JPEG,质量损失最小

    我正在尝试支持从 ASP NET MVC 旋转 JPEG 图像 以 90 度增量 我正在尝试使用System Drawing GDI 但是我遇到了问题 我尝试使用Image RotateFlip http msdn microsoft co
  • & 运算符的含义是什么?

    在下面的代码中 Expression
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果
  • 如何使用 NHibernate 和 Fluent NHibernate 存储未截断的 varchar(max) 字符串

    我的数据库模式有一个 varchar max 字符串 我读过另一本问题 https stackoverflow com questions 2343105 override for fluent nhibernate for long te
  • 将 GUID 转换为整数并返回

    所以我有一个必须与之交互的第三方应用程序 该应用程序需要我的用户表中的用户ID 问题是我将我的 userID 存储为 GUID 而第 3 方应用程序仅接受整数 所以我想 如果有一种方法可以将 GUID 转换为整数 然后能够将其转换回来 当我
  • 我可以修改 [appname].exe.config 而无需手动读取/写入 XMl 吗?

    我使用 NET 3 5 和 Visual Studio 2008 Express 在 C 应用程序中创建了一些设置 我有许多应用程序范围的设置 我希望能够从应用程序内修改它们 我可以通过以下方式访问它们Properties Settings
  • 从不同的线程关闭启动屏幕?

    我在用着WindowsForms应用程序库 http msdn microsoft com en us library microsoft visualbasic applicationservices windowsformsapplic
  • 使用隐式转换运算符的 Nullable 行为的理由是什么

    我在人与人之间的互动中遇到了一些有趣的行为Nullable和隐式转换 我发现为引用类型提供从值类型的隐式转换它允许Nullable当我期望出现编译错误时 类型将传递给需要引用类型的函数 下面的代码演示了这一点 static void Mai
  • 计算某个数的某次幂的模(该次幂的数字相当大)

    我想自己计算RSA算法 我需要计算某个数的某个幂的模数 问题是 在一定的功率下 这个数字可能会变得相当大 这就是我想要的 x pow n p q 如何有效地确定 x 如果您使用 NET 4 我建议您查看BigInteger http msd
  • 读取 .ini 文件 vb.net?

    我有一个具有读取 ini 文件功能的项目 我无法显示我想要的 ini 文件的内容 我的代码读取 ini 文件 Public Function GetSettingItem ByVal File As String ByVal Identif
  • 从资源文件获取 DisplayName [重复]

    这个问题在这里已经有答案了 我在 App GlobalResources 文件夹中有特定于文化的资源文件 现在我需要从此资源文件中读取 DisplayName 属性的值 我在用 Display Name MerchantName Resou
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • vCard .vcf 文件下载浏览器支持 - godaddy [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我在网站上有一个下载 vCard vcf 链接 它可以在本地运行 但不能在线运行 只需在浏览器中打开文件而无需下载 我宁愿不用压缩它 仔细阅读后发现我需要这样写 AddType tex
  • 如何增加 ASP.NET 中的最大上传文件大小?

    我有一个接受 ASP NET 中文件上传的表单 我需要将最大上传大小增加到默认值 4 MB 以上 我发现在某些地方引用了以下代码msdn ConfigurationPropertyAttribute maxRequestLength Def
  • Powershell - 仅打印引号之间的文本?

    如何让以下文本的输出仅显示引号中的文本 不带引号 示例文本 this is an apple it is red this is an orange it is orange this is an blood orange it is re
  • 如何使用 LINQ 在集合中选择集合?

    我有以下结构 public class ToolSettings public string Extension get set public ObservableCollection
  • 如何检测 Latin1 编码列中的 UTF-8 字符 - MySQL

    我即将承担将数据库从 Latin1 转换为 UTF 8 的繁琐且充满陷阱的任务 此时 我只想检查表中存储的数据类型 因为这将确定我应该使用什么方法来转换数据 具体来说 我想检查 Latin1 列中是否有 UTF 8 字符 最好的方法是什么
  • this._callback.apply 不是一个函数! Node.js Mysql错误

    控制器代码 app post savedata function req res var cope req body console log On server side console log cope Client ID var que
  • 在java中以300dpi打印到硬打印机

    好吧 我刚刚开始编写一个应该打印出图形的程序 我的几乎与位于此处的 Oracle 受版权保护的一模一样http docs oracle com javase tutorial 2d printing examples HelloWorldP
  • WooCommerce 3 中的条件产品价格购物车问题

    我修改了一个函数来为我的一些会员创建自定义价格 即正常价格为 1 美元 但如果您是铜牌会员 则为 2 美元 银牌会员为 3 美元 依此类推 价格在商店和单品页面上发生变化 但是 当产品添加到购物车时 价格将恢复为原始金额 我是否应该添加额外
  • 以非 root 用户身份运行厨师客户端

    我想在我的 Linux 机器上以测试用户身份运行 Chef client 为此 我在 client rb 文件中添加了来自 etc chef client rb 的缓存路径 cache path chef cache 然后我从测试用户 非r
  • 如何使用 Laravel Sanctum 和 React 修复 401 Unauthorized 错误?

    我有以下设置 Laravel 与 Homestead 一起运行 Domain laravel api test指向我的 Homestead 环境 使用自定义主机在本地运行 React npx create react app app lar
  • 从顺序很重要的未排序的 2D 点数组中插值轨迹

    我需要一种从 Nx2 点数组获取 Lx2 轨迹的方法 即将这些点连接成单个轨迹的方法 例如 从 5x2 点数组创建 10000x2 点数组 我尝试过使用interp1 and interp2但要么我不完全理解他们 要么他们没有做我需要的事情
  • Pandas 重新索引以填充缺失的日期,还是更好的填充方法?

    我的数据是工厂的缺勤记录 有些日子没有缺勤 因此没有记录当天的数据或日期 然而 与所示的其他示例相比 这变得很棘手 在任何一天 都可能由于各种原因而出现多次缺勤 数据中的日期与记录的比率并不总是 1 1 我希望的结果是这样的 index S
  • iPhone 上的网络可达性

    也许有一个好方法来确定我是否有互联网连接 3G或无线网络 谢谢 以下是一个名为 Google 的新搜索引擎揭示的内容 iPhone SDK 测试网络可达性
  • 仅当匹配阈值字节时才填充映射中的字符串值

    我有一个tasks我正在迭代并将每个任务对象附加到的列表对象StringBuilder随后是新行 如下所示 现在 我将继续在同一字符串生成器中附加任务对象 直到其达到 60000 字节的大小限制 一旦达到限制 我将将此字符串填充为映射中的值
  • 使用 php 的简单水平条形图

    我见过一个 Facebook 应用程序 其中单击单选按钮会呈现一个图表 如下所示 我想知道是否有任何类似的图形库可以通过它在 php 中生成相同的图形 Thanks Pankaj 实际上 生成这种图非常简单 只需使用两个DIVs 一个是 1
  • 使用 PHP 将表单数据从一个网页传递到另一个网页

    我在这里发现了一些类似的问题 但从答案中我没有完全了解应该如何工作 我在页面中有一个订阅表格
  • 实施 30 天计时试验 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 独立 Mac 开发者的问题 如何以非邪恶的方式实施 30 天计时赛 在首选项中放
  • 如何在JAVA中将两个int合并为一个double?

    如果我有 int a 123 int b 456 如何得到 double c 123 456 这个怎么样 int a 123 int b 456 double c Double parseDouble a b
  • 使用具有固定页眉和页脚的 css 可变内容 div 高度

    我在使用 CSS 时遇到了一些问题 正在向这个精彩的社区寻求帮助 我正在尝试构建一个包含以下元素的布局 1 标题区 2 页脚区域 3 左侧窗格 4 内容区 我提出了以下 CSS 但我不认为这是完成我需要的操作的最佳方式 请在下面找到我正在寻
  • 设计时编辑器支持控件集合

    我想向组件添加一个表示控件集合的属性 并有一个集合编辑器 通过它我可以轻松选择属于该集合的控件 VS确实almost我想要的自动使用以下代码 Private controls As New List Of Control