C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: プロパティの表示非表示の切り替えについて


(過去ログ 117 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■68806 / inTopicNo.1)  プロパティの表示非表示の切り替えについて
  
□投稿者/ むぅ (4回)-(2013/11/18(Mon) 10:44:21)

分類:[.NET 全般] 

2013/11/18(Mon) 10:49:39 編集(投稿者)

VS2010 .NET3.5 C# Windows7

お世話になります。
PropertyGridにオブジェクトのプロパティを表示するとき、ある条件によって
特定項目のプロパティを表示したり非表示にしたり切り替えたいです。

以下のサイトに実現したいことが記載されているのですが、躓いています。

PropertyウィンドウまたはPropertyGridの表示内容の動的変更
http://social.msdn.microsoft.com/Forums/ja-JP/044671d1-bab3-40fe-8451-6d2f32dd88a8/propertypropertygrid?forum=vsgeneralja

<実装内容>
public class PropertyDisplayConverter : TypeConverter
{
public PropertyDisplayConverter()
{
}

public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object instance, Attribute[] filters)
{
PropertyDescriptorCollection properies = TypeDescriptor.GetProperties(instance, filters, false);
if(true) //←表示を切り替える為の条件。テストなのでtrueにしています。
{
PropertyDescriptorCollection nonBrowsableProperties = TypeDescriptor.GetProperties(instance, new Attribute[] { BrowsableAttribute.No });
PropertyDescriptor ds = nonBrowsableProperties.Find("viewrecordkeyname", false);
if(ds!=null)
properies.Add(ds); //←ここでNotSupportedException 例外がでます。
}
//プロパティ表示名称を日本語に変換する処理
PropertyDescriptorCollection collection = new PropertyDescriptorCollection(null);
foreach (PropertyDescriptor desc in properies)
{
collection.Add(new PropertyDisplayPropertyDescriptor(desc));
}
return collection;
}

public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}
}

参考サイトのほうでも
>coll.Add(pd) でbreakさせて、coll.readOnlyを確認するとtrueです。
>ILで確認しましたが readOnly が true だと NotSupportedException を発生します。
と記載されていますが、具体的にどうすればいいのかが分からず、困っています。
どちら様かご教示いただけないでしょうか。

よろしくお願いします。

引用返信 編集キー/
■68807 / inTopicNo.2)  Re[1]: プロパティの表示非表示の切り替えについて
□投稿者/ Hongliang (124回)-(2013/11/18(Mon) 10:54:33)
PropertyDescriptorCollectionは、必要な要素を全て含むPropertyDescriptorの配列をコンストラクタで渡す必要があります。

引用返信 編集キー/
■68808 / inTopicNo.3)  Re[2]: プロパティの表示非表示の切り替えについて
□投稿者/ むぅ (5回)-(2013/11/18(Mon) 11:40:24)
Hongliang さま
お世話になります。
> PropertyDescriptorCollectionは、必要な要素を全て含むPropertyDescriptorの配列をコンストラクタで渡す必要があります。
ヒント、ありがとうございます。

ReadOnly=falseにしたオブジェクトを用意して、こちらにコピーするようにしました。

PropertyDescriptorCollection properies2 = TypeDescriptor.GetProperties(instance, filters, false);
PropertyDescriptorCollection properies = new PropertyDescriptorCollection(null, false);
for (int i = 0; i < properies2.Count; i++)
{
properies.Add(properies2[i]);
}

ほかにもっとスマートな方法があるのかな、とも思うのですが。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -