Possible Duplicate:
Conditional “Browsable” Attribute
我定义了具有一些属性的 AppSettings
类。在我的表单中,当我单击Button1
时,我想显示属性1和2(1,2是显示,其他属性隐藏或不显示),当单击Button2
时,我想显示属性 2 和 3(1 是隐藏,2,3 是显示,其他属性是隐藏或不显示),我该怎么做?
public class AppSettings
{
[BrowsableAttribute(true), CategoryAttribute("Document Settings"), DefaultValueAttribute(true)]
public bool SaveOnClose{ get; set; }
[BrowsableAttribute(true), CategoryAttribute("Global Settings"), ReadOnlyAttribute(true), DefaultValueAttribute("Welcome to AppDev!")]
public string GreetingText { get; set; }
[BrowsableAttribute(true), DescriptionAttribute("The rate in milliseconds that the text will repeat."), CategoryAttribute("Global Settings"), DefaultValueAttribute(10)]
public int MaxRepeatRate { get; set; }
[BrowsableAttribute(true), CategoryAttribute("Global Settings"), DefaultValueAttribute(4)]
public int ItemsInMRUList { get; set; }
[BrowsableAttribute(true), DefaultValueAttribute(false)]
public bool SettingsChanged { get; set; }
[BrowsableAttribute(true), CategoryAttribute("Version"), DefaultValueAttribute("1.0"), ReadOnlyAttribute(true)]
public string AppVersion { get; set; }
}
我想动态地将 BrowseAttribute
更改为 true 或 false。我该怎么做?
表单代码是:
AppSettings AppSet = new AppSettings();
AppSet.AppVersion = "2.3";
AppSet.SaveOnClose = true;
AppSet.GreetingText = "Welcome to Dar!";
AppSet.ItemsInMRUList = 4;
AppSet.MaxRepeatRate = 10;
AppSet.SettingsChanged = false;
...
propertyGrid1.SelectedObject = AppSet;
此更改有错误:
public static bool state = true;
BrowsableAttribute(state)
错误:
An attribute argument must be a constant expression, typeof expression
or array creation expression of an attribute parameter type
对于过滤,我只需更改 PropertyGrid
的 BrowsableAttributes
。在下面,我:
- 定义一个自定义属性,
[DisplayMode(...)]
,它描述了什么时候应该可见
- 使用属性装饰您的类型
AppSettings
上的一些设置
- 更改网格上的
BrowsableAttributes
,指定特定的DisplayModeAttribute
,并显示
- 启用不同的设置重复
代码如下:
using System.ComponentModel;
using System;
using System.Windows.Forms;
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class DisplayModeAttribute : Attribute
{
private readonly string mode;
public DisplayModeAttribute(string mode)
{
this.mode = mode ?? "";
}
public override bool Match(object obj)
{
var other = obj as DisplayModeAttribute;
if (other == null) return false;
if (other.mode == mode) return true;
// allow for a comma-separated match, in either direction
if (mode.IndexOf(',') >= 0)
{
string[] tokens = mode.Split(',');
if (Array.IndexOf(tokens, other.mode) >= 0) return true;
}
else if (other.mode.IndexOf(',') >= 0)
{
string[] tokens = other.mode.Split(',');
if (Array.IndexOf(tokens, mode) >= 0) return true;
}
return false;
}
}
public class AppSettings
{
[DisplayMode("A"), CategoryAttribute("Document Settings"), DefaultValueAttribute(true)]
public bool SaveOnClose { get; set; }
[DisplayMode("A,B")]
[CategoryAttribute("Global Settings"), ReadOnlyAttribute(true), DefaultValueAttribute("Welcome to AppDev!")]
public string GreetingText { get; set; }
[DisplayMode("B"), BrowsableAttribute(true), DescriptionAttribute("The rate in milliseconds that the text will repeat."), CategoryAttribute("Global Settings"), DefaultValueAttribute(10)]
public int MaxRepeatRate { get; set; }
[BrowsableAttribute(true), CategoryAttribute("Global Settings"), DefaultValueAttribute(4)]
public int ItemsInMRUList { get; set; }
[BrowsableAttribute(true), DefaultValueAttribute(false)]
public bool SettingsChanged { get; set; }
[BrowsableAttribute(true), CategoryAttribute("Version"), DefaultValueAttribute("1.0"), ReadOnlyAttribute(true)]
public string AppVersion { get; set; }
}
static class Program
{
[STAThread]
static void Main()
{
using (var form = new Form())
using (var grid = new PropertyGrid())
{
grid.Dock = DockStyle.Fill;
grid.SelectedObject = new AppSettings();
grid.BrowsableAttributes = new AttributeCollection(
new DisplayModeAttribute("A"));
form.Controls.Add(grid);
form.ShowDialog();
grid.BrowsableAttributes = new AttributeCollection(
new DisplayModeAttribute("B"));
form.ShowDialog();
}
}
}