问题标签 [iextenderprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1694 浏览

.net - UITypeEditor 和 IExtenderProvider

我有一个扩展器 (IExtenderProvider),它使用附加属性扩展了某些类型的控件。对于这些属性之一,我编写了一个 UITypeEditor。到目前为止,一切正常。

扩展器本身也有几个属性,我试图将它们用作 UITypeEditor 的一种默认值。我想要做的是能够在扩展器本身(而不是扩展控件)上设置一个属性,并且当我为扩展控件上的一个附加属性打开 UITypeEditor 时,我想在UITypeEditor 为扩展器上的属性值。

一个简单的例子:ExtenderProvider 有一个属性 DefaultExtendedValue。在表单上,​​我将此属性的值设置为“我的值”。扩展控件通过提供程序具有带有 UITypeEditor 的属性 ExtendedValue。当我打开属性 ExtendedValue 的编辑器时,默认(初始)值应设置为“我的值”。

在我看来,执行此操作的最佳位置是 UITypeEditor.EditValue,就在调用 IWindowsFormsEditorService.DropDownControl 或 .ShowDialog 之前。

唯一的问题是我不能(或者我还没有发现如何)在 EditValue 中获取扩展器提供程序本身,以读取相关属性的值并将其设置在 UITypeEditor 中。上下文为我提供了扩展控制,但在这种情况下,这对我没有用。

有什么办法可以实现我正在尝试的吗?任何帮助表示赞赏!

谢谢汤姆


@samjudson:这不是一个坏主意,但不幸的是它并没有完全让我到达那里。我真的希望能够为扩展器提供程序的每个实例单独设置此默认值。(对于不同的扩展控件组,我可能在一个表单上有多个不同的值。)

0 投票
1 回答
1530 浏览

c# - .NET IExtenderProvider (C#)

我正在尝试扩展TextBox,ComboBoxPanel控件使用IExtenderProvider,但我无法让它正常工作。我开始相信我还没有完全理解这个概念。

有没有人知道网络上有什么好的资源(带有例子)如何IExtenderProvider使用?

0 投票
3 回答
990 浏览

c# - 为什么 IExtenderProvider 属性在 C# 窗口应用程序的设计器中丢失?

我已经为控件创建了一个 IExtenderProvider(扩展器)。使用扩展器,我正在迭代控件集合并对其进行验证。它工作正常。但是,有时在更改某些设计时,或者当设计师刷新时(同时从代码中删除一些事件) ,扩展器提供的属性(验证顺序和组,在我的例子中)从设计器中丢失,并且控件本身没有添加到扩展器集合中。所以,应用程序完成的验证崩溃了(当然,应用程序本身) .我在IExtenderProvider中也有ShouldSerialize和Reset方法。但没有任何帮助。请指导我如何使所有控件始终对扩展器可见。

谢谢, 马蒂

0 投票
1 回答
1310 浏览

propertygrid - 如何将 PropertyDescriptors 添加到类而不是覆盖它们?

如果我有一个实现ICustomTypeDescriptor的类,我可以重写GetProperties()方法,用我的自定义PropertyDescriptors完全替换该类的所有属性。

但是,如果我想保留类的现有属性并将其他属性附加到类怎么办?有没有办法返回一组添加到现有类属性的自定义属性描述符?

例如,我希望用户能够在我的程序中定义将显示在属性网格中的自定义属性。自定义属性的值将存储在Dictionary(string key, object value)集合中,我想附加PropertyDescriptors,它们也将根据键值从该集合中读取和写入值。

我不认为IExtenderProvider会起作用,因为它只会将一个类的属性添加到另一个类。但我需要能够在运行时动态添加和删除属性。我可以拥有一个也实现ICustomTypeDescriptor的IExtenderProvider类,以便可以在运行时计算出它添加的属性吗?

0 投票
1 回答
1014 浏览

c# - 如何扩展控制事件 IExtenderProvider?

有没有办法向控件添加事件,例如使用 IExtenderProvider 向控件添加属性?

我尝试用 errorpovider 编写自己的验证器。使用 IExtenderProvider 我将 errorprovider 和 errortext 添加到控件中。现在我需要从我的扩展程序类中触发一个事件。

片段:

0 投票
1 回答
3656 浏览

c# - 在 winforms 中获取控件的父级

Panel1在这个里面Panel2和这个里面Panel3......所以想象一下

那么如何获得像这样的路径字符串

如果我想得到button1的所有父母。
我可以通过定义一个实现 IExtenderProvider 的类来做到这一点,那么是否可以在设计时实现它。

0 投票
0 回答
287 浏览

c# - VS2013 WinForms 设计器的 IExtenderProvider 问题

简短的

我正在实现 IExtenderProvider 以向 winforms 控件提供一个属性,以存储每个控件的权限集合,必须授予这些权限才能使控件可用。

问题

一切都按预期工作,问题仅在设计时,并且仅在以下情况下:

  1. 我打开表单设计器。
  2. 编辑表单上某些控件的权限(扩展属性)。
  3. 在表单设计器打开时编译我的项目。

然后,编译后,如果我再次尝试编辑控件的权限,权限就会消失,尽管它们仍然存在于表单的 desiger.cs 文件中。

此外,如果我在这种状态下执行任何导致设计器文件重新生成的设计器操作,例如移动按钮,则表单的设计器文件中的权限将丢失。

所以,只要我在设计器打开时不编译,一切都很好,我可以编辑权限,保存并再次重新编辑。

从此状态恢复:( 即从designer.cs文件再次加载权限)

  • 关闭表单设计器并重新打开它。
  • 或切换到designer.cs 文件(当设计器仍然打开时),编辑任何内容然后撤消它,然后再次返回到表单设计器。它被刷新并再次加载权限。

更新 1

感谢@Hans Passant 的提示,嗯,我正在调试设计器而不检查 CLR 异常,因此,异常被静默抑制。

问题在于序列化程序的 Serialize 方法(稍微改进):

更具体地说,在这一行:

value属性属于同一类型,PermissionExtenderProvider但来自不同的来源(程序集),因此引发以下异常:

由于问题仅在编译后出现,我认为它是从现在开始的。

我不太确定设计器的过程,但我的解释是该值是从先前编译的程序集中传递的,然后我尝试转换为与设计器使用的“活动”程序集中相同的类型,因此转换不能完成,因为类型来自两个不同的程序集。

为什么它从不同的程序集发送值?有没有办法在不手动将对象映射/序列化到活动程序集的类型的情况下解决这个问题?


编码

我已经尝试在设计模式下调试它(在编译后的状态下,即问题发生时),但我能想到的只是PermissionExtenderProvider.GetPermissions(...)我的扩展器提供程序中的方法返回null,这意味着PermissionExtenderProvider.SetPermission(...)尚未调用,因此我的PermissionCollectionEditor.EditValue(...)自定义 UITypeEditor 中的 接收空值并将其传递给PermissionCollectionEditorForm,这就是权限不存在的原因。

我提供了一个演示该问题的小型示例项目,它包括:

  • Permissions(包含示例权限的文件夹)。
  • PermissionCollection
  • PermissionCollectionEditor(UITypeEditor 实现)。
  • PermissionCollectionEditorForm(编辑权限集合属性的表单)。
  • PermissionExtenderProviderPermission(提供属性的 IExtenderProvider 实现)。
  • PermissionExtenderProviderSerializer(将扩展属性序列化为设计器文件的序列化程序。
  • Form1(项目的主要形式,带有一些具有测试权限的按钮)。

您可以使用具有一些按钮和一个PermissionExtenderProvider实例的 Form1 来测试扩展器。

下载示例项目

以下是该项目的一些关键代码:

权限集合编辑器

PermissionExtenderProvider

PermissionExtenderProviderSerializer


初始帖子的背景信息

我有一个 winforms 应用程序,具有与数据库交互的中间服务层。

在数据库中,我有定义和映射权限到用户和用户角色的表。这些权限在我的应用程序的类中表示,并实现IPermission.

在我的应用程序中,我有一个PermissionProvider类调用服务并检查用户的权限以禁用/隐藏用户不必访问的任何控件(当然,我不依赖它来确保安全)。

我想做的是,通过添加Permissions属性来扩展 Winforms 控件,这是一个权限集合,所以我使用了IExtenderProvider.

我已经实现了我的自定义UITypeEditor来编辑属性,并自定义CodeDomSerializer以在设计器文件中正确序列化权限集合。

我还在Host扩展器提供程序中添加了一个名为的属性,该属性存储托管提供程序的表单/用户控件,并且它由我的自定义序列化程序与权限一起在设计器文件中序列化。

然后在我的提供程序中,当设置Host属性时,我订阅Load主机表单/用户控件的事件,并在运行时加载主机时验证控件的权限,并放置一个小指示器,以便用户知道由于权限不足,控制已被禁用。

我正在运行带有更新 4、Win 8.1 64 位并在 x86 中编译的 VS2013 社区。

0 投票
0 回答
446 浏览

c# - 使用 IExtenderProvider 提供 Type 属性

我正在尝试将 Type 属性添加到我的 WinForms 设计器中的某些控件。理想情况下,我希望它们使用 typeof(MyCompany.TheTypeIUsed) 进行序列化(类似于 BindingSource.DataSource 可以序列化的方式)。

撇开我没有为该类型指定设计器这一事实不谈,如果我添加一个使用“Type”的 IExtenderProvider,则该属性将不会出现在属性网格中。如果我使用 int 或 string 或任何其他类型,它工作正常。

这是 IExtenderProvider 实现中的错误还是需要额外的属性等?

0 投票
1 回答
637 浏览

vb.net - VB.Net 扩展对象 IExtenderProvider

好的,我已经为此奋斗了几天,但我束手无策......我正在尝试通过扩展控件来添加一个在运行时在 PropertyGrid 中可见的可浏览属性。无论我做什么, iExtenderProvider 似乎都没有实际运行。

iExtenderProvider 位于第二个项目中,并在主项目中添加了一个引用。(代码如下)

然后我构建第二个项目,回到第一个项目,在我的属性窗口中什么都没有,我在代码中实例化一个控件,然后尝试找到我的“计数”属性,但那里什么也没有。关于可能是什么问题的任何建议?

0 投票
0 回答
62 浏览

c# - 如何更改扩展属性名称

我已经创建了一个组件并使用 IExtenderProvider 为默认控件扩展了一些属性,它工作正常。

但属性名称显示在属性网格中,如

myComponent1 上的 PropertyName

有什么方法可以更改属性名称,以便我可以单独显示扩展的属性名称?