- PR -

カスタムコントロールのプロパティの保持について

1
投稿者投稿内容
まさや
会議室デビュー日: 2004/12/11
投稿数: 3
投稿日時: 2004-12-11 12:05
はじめまして。

TextBoxを継承したカスタムコントロール
・ReadOnlyがTrueの場合は背景色を青Falseの場合は白にする。
という物を作りたいと考えているのですが、
作成してみて、Web画面上でラジオボタンの選択切り替えのPostBack時に、
ラジオボタンの選択値で判断して、カスタムコントロールのReadOnlyを切り替えると、
背景色は切り替わるのですが、入力されていたテキストが消えてしまいます。
(overrideしたRenderメソッドの中でウォッチすると
 Textプロパティが空になってしまっています。
 逆にRenderメソッドをoverrideしないと入力文字は保持出来て、
 ReadOnlyもTrueになるのですが、背景色が切り替わりません。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−
(今、手元にソースが無いので、記述違いがあるかもしれません。)

private Color BACKCOLOR;

public override BackColor
{
  set
  {
    if(this.ReadOnly)
    {
      BACKCOLOR = Color.Blue;
    }
    else
    {
      BACKCOLOR = Color.White;
    }
    return BACKCOLOR;
  }
  get
  {
    BACKCOLOR = value;
  }
}

public override Text
{
  set
  {
    return (string) ViewState{"Text"};
  }
  get
  {
    ViewState{"Text"} = value;
  }
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−

入力されたテキストを保持したまま、
ReadOnlyの切り替えることによって、同時に背景色も切り替わる
コントロールを作成できるでしょうか。
どなたかご教授いただけませんでしょうか。
よろしくお願いいたします。


[ メッセージ編集済み 編集者: まさや 編集日時 2004-12-11 21:00 ]
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2004-12-11 14:34
ReadOnlyChangedイベントで背景色を変えるのは駄目ですか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-12-11 18:12
 Textプロパティをオーバーライドする必要はないのでは?また、BackgroundColorの取得でTextプロパティにセットされているであろう値を返すというのも変ですよね。ん?返してないやん。

 それから、ViewStateにセットするのは、それ専用のイベントハンドラか、メソッドがあったはず。

 あとはLoadイベントハンドラの「初期化するコードをここに書きます」という"嘘"に惑わされず、Initイベントハンドラで初期化するようにすればいいはず。
_________________
まさや
会議室デビュー日: 2004/12/11
投稿数: 3
投稿日時: 2004-12-11 21:14
> Textプロパティをオーバーライドする必要はないのでは?また、BackgroundColorの
> 取得でTextプロパティにセットされているであろう値を返すというのも変ですよね。
> ん?返してないやん。

大変失礼いたしました。
記述誤りでしたので、修正いたしました。

> それから、ViewStateにセットするのは、それ専用のイベントハンドラか、
> メソッドがあったはず。

SaveViewStateやLoadViewStateの事でしょうか。
それらも使う形で色々と書いてみたのですが、
どうしても上手く出来ませんでした。
(メソッドの記述の仕方が誤っていたのかも知れませんが。)

> あとはLoadイベントハンドラの「初期化するコードをここに書きます」という
> "嘘"に惑わされず、Initイベントハンドラで初期化するようにすればいいはず。

コントロールクラス内のInitイベントハンドラ内でという事でしょうか?
また、何について初期化すればよいのでしょうか。

初歩的な質問ばかりで申し訳ありませんが、
よろしくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-12-12 19:47
コード:

public override property BackColor {
set {
base.BackColor = (this.ReadOnly ? Color.Blue : Color.White);
}
}
public override property ReadOnly {
set {
base.ReadOnly = value;
base.BackColor = (this.ReadOnly ? Color.Blue : Color.White);
}
}


これだけでいけません?baseが、ちと不安。

あと、Color.Whiteではなく、システム設定のカラーを使うべきかと。

_________________
Microsoft MVP for Visual Developer - ASP/ASP.NET (Oct. 2004 - Sept. 2005)

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-12-12 19:51 ]
まさや
会議室デビュー日: 2004/12/11
投稿数: 3
投稿日時: 2004-12-13 14:15
Jitta様にお教え頂きました記述により、解決いたしました。
ありがとうございました。

> あと、Color.Whiteではなく、システム設定のカラーを使うべきかと。

ご指摘ありがとうございます。

以上で失礼致します。
本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)