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

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

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

Re[1]: カスタムプロパティがデザイナのコードが自動生成されない


(過去ログ 41 を表示中)

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

■21728 / inTopicNo.1)  カスタムプロパティがデザイナのコードが自動生成されない
  
□投稿者/ 小春 (60回)-(2008/07/08(Tue) 16:42:57)

分類:[C#] 

2008/07/08(Tue) 16:44:33 編集(投稿者)
お世話になっております。

ノード形式のカスタムプロパティを以下の方法にて実装しておりますが、
デザイナのコード自動生成で、反映されずに頭を抱えております。

デザイナでは、プロパティグリッドで指定はできるのですが、
*.Designer.csへは反映されません。。

以下、構成です。

    //★継承元フォームクラス
    public partial class Form1 : Form
    {
        private hogeclass _hoge = new hogeclass();

        [Browsable(true), Description("説明")]
        [DesignOnly(false), DefaultValue("")]
        public hogeclass HOGE
        {
            get { return _hoge; }
            set { _hoge= value; }
        }
    }

    //★派生先クラス(このフォームでプロパティを指定するが、*.Designer.csに反映されず)
    public partial class Form2 : Form1 を継承★★
    {
          …略
    }

    //★hogeclass
    [TypeConverter(typeof(ExpandableObjectConverter))]
    public class hogeclass
    {
        //プロパティ変数
        private string _s = string.Empty;

        [Browsable(true), Description("説明")]
        [DesignOnly(false), DefaultValue("")]
        public string S
        {
            get { return _s; }
            set { _s= value; }
        }
    }

お手数ですが、お知恵を拝借頂けますでしょうか?

引用返信 編集キー/
■21732 / inTopicNo.2)  Re[1]: カスタムプロパティがデザイナのコードが自動生成されない
□投稿者/ シャノン (527回)-(2008/07/08(Tue) 17:31:33)
No21728 (小春 さん) に返信

独自クラスに TypeConverter を関連付ける場合は、TypeConverter から派生した独自の TypeConverter を作るんだと思います。

ExpandableTypeConverter を使っているということは、PropertyGrid 中で、例えば Form.Size のように展開できるプロパティなのでしょうか?
hogeclass にはプロパティが1つしかありませんので、展開しても無意味な気がしますが…

まぁそれはそれとして、ExpandableTypeConverter は、PropertyGrid から HOGE プロパティに設定された文字列を、hogeclass.S に代入するんだという知識を持っていませんので、独自の TypeConveter を作って、ConvertFrom/To で文字列と hogeclass の相互変換を実装してやらないといけないんだと思います。
引用返信 編集キー/
■21743 / inTopicNo.3)  Re[2]: カスタムプロパティがデザイナのコードが自動生成されない
□投稿者/ 小春 (61回)-(2008/07/08(Tue) 21:38:37)
2008/07/08(Tue) 21:38:49 編集(投稿者)
ご返信ありがとうございます。

■No21732 (シャノン さん) に返信
> ■No21728 (小春 さん) に返信
> ExpandableTypeConverter を使っているということは、PropertyGrid 中で、例えば Form.Size のように展開できるプロパティなのでしょうか?
そうです。
> hogeclass にはプロパティが1つしかありませんので、展開しても無意味な気がしますが…
もちろん1つではありません、投稿用に1つとしてます。
> まぁそれはそれとして、ExpandableTypeConverter は、PropertyGrid から HOGE プロパティに設定された文字列を、hogeclass.S に代入するんだという知識を持っていませんので、独自の TypeConveter を作って、ConvertFrom/To で文字列と hogeclass の相互変換を実装してやらないといけないんだと思います。
実装はしてみたものの、特に変わりませんでした(T_T)

        型コンバータ実装部を
        [TypeConverter(typeof(ExpandableObjectConverter))]
                             ↓
        [TypeConverter(typeof(hogeclassConverter))]
        に変更。

        //★ExpandableObjectConverterを継承したカスタムConverterの実装
        public class hogeclassConverter : ExpandableObjectConverter
        {

            public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
            {
                if (destinationType == typeof(hogeclass))
                {
                    Console.WriteLine("CanConvertTo:True");
                    return true;
                }

                Console.WriteLine("CanConvertTo:False");
                return base.CanConvertTo(context, destinationType);
            }

            public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
            {
                if (destinationType == typeof(string) && value is hogeclass)
                {
                    Console.WriteLine("ConvertTo:string");
                    hogeclass cc = (hogeclass)value;
                    return cc.S;
                }

                Console.WriteLine("ConvertTo:not string");
                return base.ConvertTo(context, culture, value, destinationType);
            }

            public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
            {
                if (sourceType == typeof(string))
                {
                    Console.WriteLine("CanConvertFrom:string");
                    return true;
                }

                Console.WriteLine("CanConvertFrom:not string");
                return base.CanConvertFrom(context, sourceType);
            }

            public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
            {
                if (value is string)
                {
                    Console.WriteLine("ConvertFrom:hogeclass");

                    string[] ss = value.ToString().Split(new char[] { ',' }, 0);
                    hogeclass cc = new hogeclass();
                    cc.S = ss[0];

                    return cc;
                }

                Console.WriteLine("ConvertFrom:not hogeclass");
                return base.ConvertFrom(context, culture, value);
            }
        }

Console.WriteLineが出力されないのが不明なんですが、
実装ロジックがまずいのか、なにか根本的なものがまずいのか…。
もう少し調べてみます…。

引用返信 編集キー/
■21745 / inTopicNo.4)  Re[1]: カスタムプロパティがデザイナのコードが自動生成されない
□投稿者/ 魔界の仮面弁士 (780回)-(2008/07/08(Tue) 22:36:41)
No21728 (小春 さん) に返信
> デザイナのコード自動生成で、反映されずに頭を抱えております。

DesignerSerializationVisibility 属性で Content を指定するだけで OK かと。
引用返信 編集キー/
■21746 / inTopicNo.5)  Re[2]: カスタムプロパティがデザイナのコードが自動生成されない
□投稿者/ Azulean (163回)-(2008/07/08(Tue) 22:42:19)
2008/07/08(Tue) 22:42:58 編集(投稿者)

No21732 (シャノン さん) に返信
> 独自クラスに TypeConverter を関連付ける場合は、TypeConverter から派生した独自の TypeConverter を作るんだと思います。
Form1にあるHOGEプロパティに次の属性つけるだけじゃだめなんですっけ?

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]

追記。
被ったorz
引用返信 編集キー/
■21761 / inTopicNo.6)  Re[3]: カスタムプロパティがデザイナのコードが自動生成されない
□投稿者/ 小春 (62回)-(2008/07/09(Wed) 10:30:37)
2008/07/09(Wed) 10:30:48 編集(投稿者)
No21745 (魔界の仮面弁士 さん) に返信
■No21746 (Azulean さん) に返信

ご返信ありがとうございます。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
の属性をセットするだけで実現できました。
こういった属性があるんですねぇ…。勉強になります。

動作確認のため、無駄につけていた属性を排除して、以下のロジックにて解決致しました。

    //★継承元フォームクラス
    public partial class Form1 : Form
    {
        private hogeclass _hoge = new hogeclass();

        [Description("説明")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public hogeclass HOGE
        {
            get { return _hoge; }
            set { _hoge= value; }
        }
    }

大変助かりました、ありがとうございました。

解決済み
引用返信 編集キー/
■21775 / inTopicNo.7)  Re[4]: カスタムプロパティがデザイナのコードが自動生成されない
□投稿者/ シャノン (528回)-(2008/07/09(Wed) 12:36:42)
No21761 (小春 さん) に返信
> 2008/07/09(Wed) 10:30:48 編集(投稿者)
>
> ■No21745 (魔界の仮面弁士 さん) に返信
> ■No21746 (Azulean さん) に返信
>
> ご返信ありがとうございます。
> [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
> の属性をセットするだけで実現できました。
> こういった属性があるんですねぇ…。勉強になります。

勉強させていただきます…orz
# この界隈は全然知らないのに口出すんじゃなかったかも
引用返信 編集キー/
■21808 / inTopicNo.8)  Re[5]: カスタムプロパティがデザイナのコードが自動生成されない
□投稿者/ 小春 (63回)-(2008/07/10(Thu) 09:59:15)
2008/07/10(Thu) 09:59:23 編集(投稿者)
No21775 (シャノン さん) に返信
> ■No21761 (小春 さん) に返信
>>2008/07/09(Wed) 10:30:48 編集(投稿者)
>>
>>■No21745 (魔界の仮面弁士 さん) に返信
>>■No21746 (Azulean さん) に返信
>>
>>ご返信ありがとうございます。
>>[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
>>の属性をセットするだけで実現できました。
>>こういった属性があるんですねぇ…。勉強になります。
>
> 勉強させていただきます…orz
> # この界隈は全然知らないのに口出すんじゃなかったかも

いえ、ご返信頂いただけで大変ありがたいです。
ありがとうございます(^^)
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -