DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33630 / inTopicNo.1)  ユーザーコントロールで自作のBackColorプロパティを使いたい
  
□投稿者/ masa 一般人(3回)-(2017/06/04(Sun) 15:31:30)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    2017/06/04(Sun) 16:00:42 編集(投稿者)

    お世話になっております。masaと申します。
    現在、C#にてWindowsFormアプリケーション開発を行っております。

    このアプリケーションではコントロールで使用する色をパレットからのみ選べるように、
    BackColorやForeColorはパレット番号(int)で設定し、オーナードローをする計画です。

    ラベルコントロールから継承したカスタムコントロールではこの手法はうまくいったのですが、
    ユーザーコントロールにてこれらのプロパティを実装
    →それを継承したユーザーコントロール
    にて、BackColorプロパティのみ、プロパティウィンドウの値部分に
    「オブジェクト参照がオブジェクト インスタンスに設定されていません。」が
    表示されてしまいます
    なお、ForeColorプロパティは意図したとおりに数字が表示されます。

    継承したユーザーコントロールのプロパティウィンドウにて
    自作のBackColorプロパティを編集する方法があればご教授いただけると幸いです。
    よろしくお願い致します。

    以下、すぐに状況を再現できるサンプルです。
    1. ユーザーコントロールを作成し、BackColorを実装
    private int _BackColor = 0x00;
    [Category("表示")]
    [Description("コンポーネントの背景色です。")]
    [DefaultValue(0x00)]
    public new int BackColor
    {
    get
    {
    return _BackColor;
    }
    set
    {
    _BackColor = value;
    }
    }
    2.上記を継承したユーザーコントロールを作成
    3.継承したユーザーコントロールのプロパティウィンドウに
     エラーメッセージが表示される
    ※フォームに配置すると正常に表示されますが、
     継承したユーザーコントロールの編集時に正常に表示されてほしいです。
引用返信 削除キー/
■33633 / inTopicNo.2)  Re[1]: ユーザーコントロールで自作のBackColorプロパティを使いたい
□投稿者/ masa 一般人(4回)-(2017/06/11(Sun) 09:12:14)
  • アイコン色々検証してみたのですが、やはり解決できていません。
    基本的に基底クラスのプロパティ等を隠ぺいするのはあまり
    いい実装ではないかと思いますが、今回の場合は直接BackColorを
    いじられたくないこと、パレット番号で指定するだけなので
    同じプロパティ名を使用したいので、解決できるのであればしたいのですが…

    BackColorをintからColorに変更した場合でも、overrideせずにnewした場合は
    デフォルト色がControlになってしまい、色を変更してもコンパイル後に
    Controlになってしまいます。

    引き続き、どなたか原因がわかる方いらっしゃいましたらよろしくお願い致します。

    以下、デザイナのプロパティでControl固定になってしまうサンプルです。
    private Color _BackColor = Color.Black;
    [Category("表示")]
    [Description("コンポーネントの背景色です。")]
    [DefaultValue(typeof(Color),"Black")]
    public new Color BackColor
    {
    get
    {
    return _BackColor;
    }
    set
    {
    _BackColor = value;
    this.Refresh();
    }
    }

    No33630に返信(masaさんの記事)
    > 2017/06/04(Sun) 16:00:42 編集(投稿者)
    >
    > お世話になっております。masaと申します。
    > 現在、C#にてWindowsFormアプリケーション開発を行っております。
    >
    > このアプリケーションではコントロールで使用する色をパレットからのみ選べるように、
    > BackColorやForeColorはパレット番号(int)で設定し、オーナードローをする計画です。
    >
    > ラベルコントロールから継承したカスタムコントロールではこの手法はうまくいったのですが、
    > ユーザーコントロールにてこれらのプロパティを実装
    > →それを継承したユーザーコントロール
    > にて、BackColorプロパティのみ、プロパティウィンドウの値部分に
    > 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」が
    > 表示されてしまいます
    > なお、ForeColorプロパティは意図したとおりに数字が表示されます。
    >
    > 継承したユーザーコントロールのプロパティウィンドウにて
    > 自作のBackColorプロパティを編集する方法があればご教授いただけると幸いです。
    > よろしくお願い致します。
    >
    > 以下、すぐに状況を再現できるサンプルです。
    > 1. ユーザーコントロールを作成し、BackColorを実装
    > private int _BackColor = 0x00;
    > [Category("表示")]
    > [Description("コンポーネントの背景色です。")]
    > [DefaultValue(0x00)]
    > public new int BackColor
    > {
    > get
    > {
    > return _BackColor;
    > }
    > set
    > {
    > _BackColor = value;
    > }
    > }
    > 2.上記を継承したユーザーコントロールを作成
    > 3.継承したユーザーコントロールのプロパティウィンドウに
    >  エラーメッセージが表示される
    > ※フォームに配置すると正常に表示されますが、
    >  継承したユーザーコントロールの編集時に正常に表示されてほしいです。
引用返信 削除キー/
■33634 / inTopicNo.3)  Re[1]: ユーザーコントロールで自作のBackColorプロパティを使いたい
□投稿者/ Azulean 大御所(484回)-(2017/06/11(Sun) 20:57:14)
  • アイコン最初に提起された時点で動きは見ていましたが、解決が難しそうだったので特にコメントしていませんでした。
    一週間継続されていると言うことなので、少しコメントさせてください。

    No33633に返信(masaさんの記事)
    > BackColorをintからColorに変更した場合でも、overrideせずにnewした場合は
    > デフォルト色がControlになってしまい、色を変更してもコンパイル後に
    > Controlになってしまいます。

    Color 型で妥協されるのなら override することが本筋かと思います。
    元の問題も、デザイナーがプロパティの型情報やメソッド情報の処理で整合性がとれずに例外を招いているようなので、同じ型なら override すれば問題を回避できるでしょう。


    No33630に返信(masaさんの記事)
    > にて、BackColorプロパティのみ、プロパティウィンドウの値部分に
    > 「オブジェクト参照がオブジェクト インスタンスに設定されていません。」が
    > 表示されてしまいます

    Visual Studio で Visual Studio をデバッグすると、どのタイミングで例外が出るのかを推測はできます。
    ただ、どのようにすれば回避できるのかまでは正直、つかみかねています。

    Visual Studio 自身のリバースエンジニアリング禁止条項に抵触するような道になりますので、どうしても解決したいのであれば、Microsoft の有償サポートを頼る部分になるかもしれません。


    > 基本的に基底クラスのプロパティ等を隠ぺいするのはあまり
    > いい実装ではないかと思いますが、今回の場合は直接BackColorを
    > いじられたくないこと、パレット番号で指定するだけなので
    > 同じプロパティ名を使用したいので、解決できるのであればしたいのですが…

    私がこの問題に遭遇したとすると、少し調べて解決の芽がないと見切って、回避に動きますね。

    1.元の BackColor プロパティをオーバーライドし、属性を使って「非表示」に設定する。
    2.新たに BackColorIndex プロパティを新規に追加して、そちらで設定させる。

    こうすれば、デザイナー上で誤って BackColor プロパティを操作することはなくせるなど、目的をある程度満たせるためです。
引用返信 削除キー/
■33640 / inTopicNo.4)  Re[2]: ユーザーコントロールで自作のBackColorプロパティを使いたい
□投稿者/ masa 一般人(5回)-(2017/06/19(Mon) 22:01:07)
  • アイコンAzuleanさんご回答ありがとうございます。

    やはりそのままBackColorの名前を使わずに、
    新しい名前を用いて、既存のBackColorプロパティを
    隠す手法がベストな方法なのですね…

    他に回答もないようなので、今回はこの方法で
    妥協したいと思います。ありがとうございました。

    No33634に返信(Azuleanさんの記事)
    > 最初に提起された時点で動きは見ていましたが、解決が難しそうだったので特にコメントしていませんでした。
    > 一週間継続されていると言うことなので、少しコメントさせてください。
解決み!
引用返信 削除キー/



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

このトピックに書きこむ

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

Mode/  Pass/


- Child Tree -