标签: propertygrid

ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor

我试图全面了解如何使用ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor来更改PropertyGrid显示和与对象接口的方式.

有人可以告诉我这是对的,还是我错过了任何重大概念或要点?我真的只是想了解为什么以及何时使用每个班级.

ICustomTypeDescriptor

  • 在类中实现此接口会完全覆盖类的本机属性,并将其替换为ICustomTypeDescriptor.GetProperties()返回的PropertyDescriptors.

TypeDescriptionProvider

  • 用于扩展类的现有属性
  • TypeDescriptionProvider通过TypeDescriptionProvider属性附加到类
  • TypeDescriptionProvider的GetTypeDescriptor()方法返回要附加到该类型的现有属性的ICustomTypeDescriptor .
  • PropertyGrid将显示通过Reflection找到的类的属性,以及通过TypeDescriptionProvider添加到类的属性

类型转换器

  • 在类型之间转换
  • 在使用PropetyGrid方面,用于在可以在属性网格中显示/编辑的复杂类型和基元类型之间进行转换.
  • TypeConverter的GetStandard值方法还可用于显示propertygrid中可能值的列表

UITypeEditor的

  • 定义用于操作复杂类型属性的自定义编辑器.
  • 通过属性与属性相关联.

因此,ICustomTypeDescriptor和TypeDescription提供程序用于添加/更改/替换对象的整个属性.TypeConverter和UITypeEditor应用于各个属性,并控制这些特定属性的接口方式.

c# propertygrid uitypeeditor typeconverter customtypedescriptor

38
推荐指数
1
解决办法
9468
查看次数

如何创建打开表单的自定义PropertyGrid编辑器项?

我有一个List <>(我的自定义类).我想在PropertyGrid控件的框中显示此列表中的特定项.在盒子的最后,我想要[...]按钮.单击时,它将打开一个表单,除其他外,它将允许他们从列表中选择一个项目.关闭时,PropertyGrid将更新以反映所选值.

任何帮助赞赏.

c# propertygrid winforms

33
推荐指数
1
解决办法
3万
查看次数

PropertyGrid中的多行字符串

是否有一个内置的多行字符串编辑器PropertyGrid.

.net c# propertygrid winforms

31
推荐指数
1
解决办法
2万
查看次数

如何在运行时修改PropertyGrid(添加/删除属性和动态类型/枚举)

如何在运行时以各种方式修改propertygrid?我希望能够添加和删除属性并添加"动态类型",我的意思是使用TypeConverter导致在propertygrid中生成运行时生成的下拉列表.

我实际上已经能够做这两件事(添加/删除属性和添加动态类型)但不能同时单独使用.

为了实现在运行时添加和删除属性的支持,我使用了这个代码项目文章稍微修改了代码以支持不同的类型(不仅仅是字符串).

private System.Windows.Forms.PropertyGrid propertyGrid1;
private CustomClass myProperties = new CustomClass();

public Form1()
{
    InitializeComponent();

    myProperties.Add(new CustomProperty("Name", "Sven", typeof(string), false, true));
    myProperties.Add(new CustomProperty("MyBool", "True", typeof(bool), false, true));
    myProperties.Add(new CustomProperty("CaptionPosition", "Top", typeof(CaptionPosition), false, true));
    myProperties.Add(new CustomProperty("Custom", "", typeof(StatesList), false, true)); //<-- doesn't work
}

/// <summary>
/// CustomClass (Which is binding to property grid)
/// </summary>
public class CustomClass: CollectionBase,ICustomTypeDescriptor
{
    /// <summary>
    /// Add CustomProperty to Collectionbase List
    /// </summary>
    /// <param name="Value"></param> …
Run Code Online (Sandbox Code Playgroud)

.net c# propertygrid winforms

24
推荐指数
3
解决办法
3万
查看次数

如何在PropertyGrid上自定义类别排序?

如何自定义类别的排序PropertyGrid

如果我设置以下任一项...

propertyGrid.PropertySort = PropertySort.Categorized;
propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical;
Run Code Online (Sandbox Code Playgroud)

...然后类别将按字母顺序排列.("按字母顺序"似乎适用于每个类别中的属性.)如果我使用PropertySort.NoSort,我会失去分类.

我在我的填充PropertyGridSelectObject,这是很容易的:

this.propertyGrid1.SelectedObject = options;
Run Code Online (Sandbox Code Playgroud)

options 是具有适当装饰属性的类的实例:

    [CategoryAttribute("Category Title"),
    DisplayName("Property Name"),
    Browsable(true),
    ReadOnly(false),
    BindableAttribute(true),
    DesignOnly(false),
    DescriptionAttribute("...")]
    public bool PropertyName {
        get {
            // ...
        }

        set {
            // ...
            this.OnPropertyChanged("PropertyName");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我在六个类别中有几十个属性.

有没有什么方法可以调整类别排序顺序,同时保持我的易用性SelectedObject

.net propertygrid winforms

20
推荐指数
3
解决办法
2万
查看次数

PropertyGrid中的自定义属性名称?

我有一个课,我在一个PropertyGrid.我发现通过设置CategoryAttribute每个属性,它显然为每个项目创建了一个新类别.这将我的属性网格设置为每个项目都有一个[+],其中包含我的自定义名称,这不是我想要实现的行为.

在Visual Studio中,如果单击解决方案资源管理器中的项目(例如,程序集),它将具有零树节点和仅有完美命名属性的列表,即任何字符串都可以标识属性,而不仅仅是对象的名称.所以不要这样:

[+文件路径]
    FilePath | propertyValue
[+ File Size]
    FileSize | 0 KB

我在找这个:

[+文件]
    文件路径| 值
    文件大小| 0 KB

甚至上面没有初始的[+]节点.我已经通过System.ComponentModel命名空间寻找适用的属性,但我找不到.

我怎样才能达到这个效果?它必须是可能的,Visual Studio会这样做,我相信它们是相同的组件,而不是派生和扩展的组件.

c# propertygrid winforms

20
推荐指数
2
解决办法
1万
查看次数

如何使用WinForms PropertyGrid编辑字符串列表?

在我的应用程序中,我有一个属性网格,允许用户更改设置.这适用于字符串和其他值属性,但我现在需要的是一个可由用户编辑的字符串列表.

问题是如果我MyPropertyGrid.SelectedObject = new { Test = new List<string>() };在我的代码中并且用户尝试编辑该Test属性,当他们单击"添加"按钮时,会发生以下错误:

 Constructor on type 'System.String' not found
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为字符串是不可变的.但是,我仍然需要一些方法来在属性网格中存储多个字符串(或类似字符串的数据).

有没有人对如何实现这一点有任何想法?

c# string propertygrid winforms

20
推荐指数
2
解决办法
2万
查看次数

从PropertyGrid显示详细的文件夹浏览器

请注意,这不是一个重复的问题.

如何在PropertyGrid中显示详细的FolderBrowser,如下图所示(来自具有省略号的字段/属性...) 详细文件夹浏览器

运用

[EditorAttribute(typeof(System.Windows.Forms.Design.FileNameEditor), typeof(System.Drawing.Design.UITypeEditor))]

[EditorAttribute(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))]
Run Code Online (Sandbox Code Playgroud)

我们得到了minimalistic文件夹浏览器

简约文件夹浏览器

c# propertygrid folderbrowserdialog

17
推荐指数
1
解决办法
8535
查看次数

是否可以将属性网格中显示的属性标记为密码字段

我正在使用C#并且有一个包含属性网格控件的窗体.

我已将propertygrid的SelectedObject分配给设置文件,该文件显示并允许我编辑设置.但是其中一个设置是密码 - 我希望它在字段中显示星号而不是密码设置的纯文本值.

保存时该字段将被加密,但我希望它的行为类似于正常的密码输入框,当用户输入密码时会显示星号.

我想知道是否有一个属性可以应用于设置属性以将其标记为密码?

谢谢.

c# passwords propertygrid attributes

16
推荐指数
1
解决办法
6878
查看次数

将自定义对象列表显示为PropertiesGrid中的下拉列表

我想拿一个对象,让我们说这个对象:

public class BenchmarkList
{
    public string ListName { get; set; }
    public IList<Benchmark> Benchmarks { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并让该对象将其ListName显示为PropertiesGrid的"name"部分("Benchmark"将是好的),并且对于PropertyGrid的"value"部分,要有一个IList <> of Benchmarks的下拉列表:

这是Benchmark对象

public class Benchmark
{
    public int ID {get; set;}
    public string Name { get; set; }
    public Type Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我希望下拉列表显示基准的Name属性,以便用户可以看到.这是一个视觉示例:

在此输入图像描述

所以,基本上,我正在尝试将Benchmark对象的集合放入下拉列表中,并且这些对象应该将其Name属性显示为下拉列表中的值.

我已经阅读了有关使用PropertiesGrid的其他文章,包括THISTHIS,但它们比我想做的更复杂.

我经常处理服务器端的东西,并且不通过WebForms或WinForms处理UI,所以这个PropertiesGrid真的带我去旅行......

我知道我的解决方案在于实现"ICustomTypeDescriptor",这将允许我告诉PropertiesGrid它应该显示哪些值,而不管我想要绑定到下拉列表中的对象的属性,但我是只是不确定如何或在何处实施它.

任何指针/帮助将非常感激.

谢谢,迈克

更新:

好的,所以我正在改变一些细节.我之前想过应该参与的对象,所以这是我的新方法.

我有一个名为Analytic的对象.这是应该绑定到PropertiesGrid的对象.现在,如果我公开一个枚举类型的属性,PropertiesGrid将为我处理下拉列表,这是非常好的.如果我公开一个属于自定义类型集合的属性,那么PropertiesGrid就不那么好......

以下是Analytic的代码,我想要绑定到PropertiesGrid的对象:

public class Analytic
{ 
    public enum Period { Daily, Monthly, Quarterly, Yearly };
    public Analytic()
    { …
Run Code Online (Sandbox Code Playgroud)

c# propertygrid winforms

16
推荐指数
1
解决办法
2万
查看次数