ExpandableObjectConverterに基づいて独自のTypeConverterを実装すれば、おそらくこのケースを処理できると思います。たとえば。Data2のデータを取得できないため、Data2はNullになると想定しています。独自のコンバーターを使用してグリッドにプロパティを表示できますが、その前に「エラー」というテキストをどのように表示するのでしょうか。基本的に、Expandableオブジェクトの場合、クラスのToString()を使用して、グループ内のオブジェクトに対してテキストを表示します。
私はあなたが使用できるハックを持っています、最もエレガントな解決策ではないかもしれませんが、それがうまくいくことを願っています...あなたができることはあなたのクラスに表示されますあなたのクラスがこのようなものになるように別のプロパティを追加します...
public class DisplayedData
{
[TypeConverter(typeof(ExpandableObjectConverter))]
[ReadOnly(true)]
public DataType1 Data1 { get; }
[TypeConverter(typeof(ExpandableObjectConverter))]
[ReadOnly(true)]
[DisplayName("Data2")]
[Browsable(true)]
public DataType2 Data2 { get; } //We have Browsable set to true for this
[DisplayName("Data2")]
[Browsable(false)]
public string Data2Error { get; } //An additional property with Browsable set to false
}
(上記のクラスにはセッターがありませんが、どのようにそれらを設定するのか疑問に思っていましたが、それは部分的なコードである可能性があります)
ここで、このクラスのオブジェクトにデータを入力し、Data2の値を読み取ることができないため、Data2がNullであることがわかります。次に、これを書きます...
if (data.Data2 == null)//data is an object of DisplayedData class that we are showing in PropertyGrid
{
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(data.GetType())["Data2"];
BrowsableAttribute attribute = (BrowsableAttribute)descriptor.Attributes[typeof(BrowsableAttribute)];
FieldInfo fieldToChange = attribute.GetType().GetField("Browsable",
BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.Public |
BindingFlags.Instance);
fieldToChange.SetValue(attribute, false);
data.Data2Error = "Error";
descriptor = TypeDescriptor.GetProperties(data.GetType())["Data2Error"];
attribute = (BrowsableAttribute)descriptor.Attributes[typeof(BrowsableAttribute)];
fieldToChange = attribute.GetType().GetField("Browsable",
BindingFlags.NonPublic | BindingFlags.IgnoreCase | BindingFlags.Public |
BindingFlags.Instance);
fieldToChange.SetValue(attribute, true);
}
propertyGrid1.SelectedObject = data; //Reassign object to PropertyGrid
基本的に、実行時にプロパティData2を非表示にしてプロパティData2Errorを表示しようとしています。これらのプロパティは両方とも同じ表示名を持っているため、同じ名前がpropertygridに表示されます。これを行うには、リフレクションを使用して属性「Browsable」を取得し、そのプロパティを設定します。