动态选项对话框(使用反射)

2024-01-17

有谁知道一个好的组件(C# WinForms),它允许创建一个选项(设置)表单,给定一个带有一堆属性的自定义类?我并不是在寻找闪亮的东西,而是仅仅比属性网格更好的东西。我可以轻松处理视觉部分,但我只是不想浪费时间进行反射来添加和绑定控件(如果它已经存在)。

我很确定我之前在某处见过类似 Visual Studio 选项的表单,它是动态创建的(一些属性附加到类的属性上,以允许分组和附加信息)。

[Edit]例如,我可能有一个选项类:

public class Options : SerializableOptions<Options>
{
     [Category("General")]
     [Name("User name")]
     [Description("Some text")]
     public string Username { get; set; }

     [Category("General")]
     [Name("Log in automatically")]
     public bool LogInAutomatically { get; set; }

     [Category("Advanced")]
     // ConnectionType is enum
     public ConnectionType ConnectionType { get; set; }

     // ...
}

将其传递给此表单后,它将创建两个面板(“常规”和“高级”),第一个面板上有一个复选框和一个文本框,第二个面板上有一个组合框(包含所有可用的枚举)。

如果没有这样的控件,你们用什么?为每个选项手动添加、填充、格式化和绑定控件?


我不知道有任何控件可以让您执行此操作,但您自己执行此操作并不困难。最简单的方法是创建对话框外壳、一个充当选项“面板”基类的用户控件、一个(或多个)控制名称和分组信息的属性以及一个接口(用户控件实现的) 。

每个自定义选项面板都派生自用户控件并覆盖某种类型Initialize() and Save()方法(由用户控件提供)。它还提供确定名称/分组信息的属性(或多个属性)。

在对话框 shell 中,反思性地检查程序集(或所有加载的程序集)中的所有公共类型,以查找实现接口的类型。当您找到类型时,获取属性以确定将其放置在分组中的位置(这里最简单的事情是使用树视图),调用Activator.CreateInstance创建用户控件的实例并将其存储在Tag财产。当用户单击分组中的条目(树节点)时,获取Tag并将包含用户控件的面板设置为Tag财产。最后,当用户单击对话框中的“确定”时,循环遍历树节点,得到Tag属性并调用Save method.

Update:另一种选择是使用属性网格控件。它没有“漂亮”的 UI 外观,但功能非常强大,已经支持按类别属性分组,并且具有很大的灵活性。您可以使用显示所有选项的单个属性网格,或者使用具有树视图的“混合”方法,该树视图按主要功能(插件、功能等)(可能基于类型)进行分组。当用户单击该节点时,为属性网格提供对象实例。这种方法的唯一缺点是,当对属性网格值进行更改时,它们是“实时”的,因为基础属性会立即更改,这意味着除了保存每个值的副本之外,不存在“取消”的概念。可以自己更改并执行某种类型的“重置”。

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

动态选项对话框(使用反射) 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 向首次访客显示欢迎信息

    寻找一种简单的方法来向我的网站的首次访问者显示欢迎消息 最好的方法是什么 使用cookie if empty COOKIE first time show welcome message setcookie first time 1 tim
  • 通过 ssh 启动包含 nohup 的远程脚本

    我想通过 ssh 远程启动一个脚本 如下所示 ssh email protected cdn cgi l email protection t cd my dir myscript data email protected cdn cgi
  • 如何在 Zend Framework 2 中配置学说扩展?

    我已将此行添加到我的composer json中 gedmo doctrine extensions dev master 这是在我的模块的 module config php 中 doctrine gt array driver gt a
  • 将从文件读取的值作为输入传递给 Oracle 中的 SQL 查询

    cat file txt 12354 13456 13498 bin bash for i in cat file txt do sqlplus XXXXX XXXXX DB NAME lt lt EOF select from TABLE
  • Cognos 8 查询查找所有报表和列名称

    我想查询 Cognos 8 中的元数据以查找所有报告和列名称 如果可能的话 我想包含列定义 我可以使用 Cognos 报告来执行此操作还是需要查询某个存储库 Thanks 您可以使用以下查询从内容存储中选择报告列表 SELECT CMOBJ
  • 如何刷新recyclerview的上一个项目行视图的视图

    大家好 希望你们一切都好 我正在开发一个 Android 应用程序 它将播放不同的动物声音 我正在使用回收视图 如下面的屏幕截图所示 现在我面临一个问题 我的行中有一个播放按钮 每当我从项目 0 或在视图内显示暂停选项的任何位置播放声音时
  • 如何使用 PySide2 连接 Python 和 QML?

    我想在 Ubuntu 上编写一个简单的桌面应用程序 我认为一个简单的方法是使用 Qt 和 QML 作为 GUI 使用 Python 作为逻辑语言 因为我对 Python 有点熟悉 现在我花了几个小时尝试以某种方式连接 GUI 和逻辑 但它不
  • 如何加快Spacy的nlp调用速度?

    我必须处理数十万条文本 我发现以下内容中花费时间最长的事情 nlp English ruler EntityRuler nlp patterns ruler add patterns patterns nlp add pipe ruler
  • 物理/逻辑/虚拟内存地址之间的差异

    我对操作系统中的术语物理 逻辑 虚拟地址有点困惑 我使用 Linux open SU SE 这是我的理解 物理地址 当处理器处于系统模式时 处理器使用的地址是物理地址 逻辑地址 当处理器处于用户模式时 使用的地址是逻辑地址 无论如何 通过添
  • 如何重新启动应用程序(React Native 和 Expo)

    我使用 expo 所以我无法访问 android 文件夹 我想第一次重新启动我的应用程序 我怎样才能做到这一点 I use 反应本机重启 https github com avishayil react native restart 但不起
  • 范围规则如何与类一起使用?

    考虑以下 python 代码片段 x 1 class Foo x 2 def foo x 3 class Foo print x prints 3 Foo foo 正如预期的那样 这会打印 3 但是 如果我们在上面的代码片段中添加一行 行为
  • ARM TrustZone 开发

    我想知道是否有人有关于可以使用 ARM TrustZone 的开发板的信息 我有 BeagleBoard XM 它使用 TI 的 OMAP3530 和支持信任区的 Cortex A8 处理器 但是 TI 确认他们已禁用板上的功能 因为它是通
  • 由内而外构建管道代理

    是否可以创建一个函数 以便Proxy from pipes http hackage haskell org package pipes可以从里到外建造吗 由内而外 我的意思是从连接上游和下游连接的函数创建一个代理 最理想 但不可能 的签名
  • 创建适配器以用对象填充 Spinner [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个 Android 应用程序Spinner并想用我自己的对象动态填充它 这些对象确实已经存在List
  • 如何在python中导入sikuli模块?

    我在使 sikuli python 单元测试正常工作时遇到问题 并且很高兴获得一些帮助 我在互联网上进行了广泛的搜索 但没有任何有效的方法 我的Python知识非常有限 我想这没有帮助 我用的是win7 32位 西库里 1 0 rc3 r9
  • 通过 MailChimp API v2.0 将用户添加到兴趣组

    我想通过 MailChimp API 将订阅者添加到兴趣组 这是我的 merge vars array merge vars array GROUPINGS gt array 0 gt array id gt 17385 The group
  • 如何覆盖编辑器服务

    我正在尝试采用自定义方式来实现转到定义 这需要覆盖编辑器服务 尤其是openEditor and findModel 方法 据我所见 我尝试遵循此评论 https github com microsoft monaco editor iss
  • 我不想显示来自 ParsleyJS 的错误消息

    我正在使用 ParsleyJS 库来验证我的表单 但如果字段无效 我只想应用错误类 但不想显示错误消息 如果我使用该房产data show errors false 那么类或错误都不会显示 我用的是这个方法display none在CSS中
  • 如果没有 global.asax,ASP.NET 网页的路由如何工作

    安装了 ASP Net 4 0 的 Web 服务器 部署了 Web Pages 2 0 DLL bin 用 cshtml razor 编写的页面 但路由不起作用 当仅使用网页而不是完整的 MVC 我在 global asax 中定义路由 时
  • 动态选项对话框(使用反射)

    有谁知道一个好的组件 C WinForms 它允许创建一个选项 设置 表单 给定一个带有一堆属性的自定义类 我并不是在寻找闪亮的东西 而是仅仅比属性网格更好的东西 我可以轻松处理视觉部分 但我只是不想浪费时间进行反射来添加和绑定控件 如果它