我试图全面了解如何使用ICustomTypeDescriptor,TypeDescriptionProvider,TypeConverter和UITypeEditor来更改PropertyGrid显示和与对象接口的方式.
有人可以告诉我这是对的,还是我错过了任何重大概念或要点?我真的只是想了解为什么以及何时使用每个班级.
ICustomTypeDescriptor
TypeDescriptionProvider
类型转换器
UITypeEditor的
因此,ICustomTypeDescriptor和TypeDescription提供程序用于添加/更改/替换对象的整个属性.TypeConverter和UITypeEditor应用于各个属性,并控制这些特定属性的接口方式.
c# propertygrid uitypeeditor typeconverter customtypedescriptor
我有一个List <>(我的自定义类).我想在PropertyGrid控件的框中显示此列表中的特定项.在盒子的最后,我想要[...]按钮.单击时,它将打开一个表单,除其他外,它将允许他们从列表中选择一个项目.关闭时,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) 如何自定义类别的排序PropertyGrid
?
如果我设置以下任一项...
propertyGrid.PropertySort = PropertySort.Categorized;
propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical;
Run Code Online (Sandbox Code Playgroud)
...然后类别将按字母顺序排列.("按字母顺序"似乎适用于每个类别中的属性.)如果我使用PropertySort.NoSort
,我会失去分类.
我在我的填充PropertyGrid
用SelectObject
,这是很容易的:
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
?
我有一个课,我在一个PropertyGrid
.我发现通过设置CategoryAttribute
每个属性,它显然为每个项目创建了一个新类别.这将我的属性网格设置为每个项目都有一个[+],其中包含我的自定义名称,这不是我想要实现的行为.
在Visual Studio中,如果单击解决方案资源管理器中的项目(例如,程序集),它将具有零树节点和仅有完美命名属性的列表,即任何字符串都可以标识属性,而不仅仅是对象的名称.所以不要这样:
[+文件路径]
FilePath | propertyValue
[+ File Size]
FileSize | 0 KB
我在找这个:
[+文件]
文件路径| 值
文件大小| 0 KB
甚至上面没有初始的[+]节点.我已经通过System.ComponentModel命名空间寻找适用的属性,但我找不到.
我怎样才能达到这个效果?它必须是可能的,Visual Studio会这样做,我相信它们是相同的组件,而不是派生和扩展的组件.
在我的应用程序中,我有一个属性网格,允许用户更改设置.这适用于字符串和其他值属性,但我现在需要的是一个可由用户编辑的字符串列表.
问题是如果我MyPropertyGrid.SelectedObject = new { Test = new List<string>() };
在我的代码中并且用户尝试编辑该Test
属性,当他们单击"添加"按钮时,会发生以下错误:
Constructor on type 'System.String' not found
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为字符串是不可变的.但是,我仍然需要一些方法来在属性网格中存储多个字符串(或类似字符串的数据).
有没有人对如何实现这一点有任何想法?
请注意,这不是一个重复的问题.
如何在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的SelectedObject分配给设置文件,该文件显示并允许我编辑设置.但是其中一个设置是密码 - 我希望它在字段中显示星号而不是密码设置的纯文本值.
保存时该字段将被加密,但我希望它的行为类似于正常的密码输入框,当用户输入密码时会显示星号.
我想知道是否有一个属性可以应用于设置属性以将其标记为密码?
谢谢.
我想拿一个对象,让我们说这个对象:
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的其他文章,包括THIS和THIS,但它们比我想做的更复杂.
我经常处理服务器端的东西,并且不通过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) propertygrid ×10
c# ×9
winforms ×7
.net ×3
attributes ×1
passwords ×1
string ×1
uitypeeditor ×1