- PR -

C# ユーザーコントロールのデフォルト値の設定方法

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-12-18 17:34
質問
ユーザーコントロールをFormに初配置した時のとりあえずのデフォルト値をユーザーコントロール内に定義する方法が分かりません。一般的な回答でもかまいませんが、質問の意味が分からない場合は下記の例を参考にしてください。

例(参考)
ボタンをClickするたびにStart/Stopと表示を切り替えるボタン(SwitchButton)を作成しました。このボタンはClickするたびに下記の3つの状態を切り替えます。
(1)Textプロパティの表示を交互に切り替える (例 Stop/Start)
(2)BackColorプロパティの色を交互に切り替える (例 LightBlue/LightPink)
(3)IsStartプロパティの値(true/false)を交互に切り替える (例 false/true)

さて、上記の機能を追加したSwitchButton.csクラスを作成しました。SwitchButtonクラスははSystem.Windows.Forms.Buttonを継承しています。これをコンパイルし、ToolBoxに登録しました。これをSystem.Windows.Forms.Formにドラッグすると現状では何も定義されていないので、null値が自動的に定義されてしまいます。
this.switchButton1.IsStart = false;
this.switchButton1.StartBackColor = System.Drawing.Color.Empty;
this.switchButton1.StartText = null;
this.switchButton1.StopBackColor = System.Drawing.Color.Empty;
this.switchButton1.StopText = null;
これをnull値では無くとりあえずのデフォルト値が自動的に定義されるようにしたいと考えています。
勿論、現状のままでもSwitchButtonをFormに配置するたびに上記のプロパティに適切な値を毎回設定すればSwitchButtonは正しく機能します。設計者のわたしはSwitchButtonの構造をしっているので、毎回正しくプロパティのデフォルト値を設定できますが、他人に提供するには問題があります。
this.switchButton1.IsStart = false;
this.switchButton1.StartBackColor = System.Drawing.Color.LightBlue;
this.switchButton1.StartText = "Stop";
this.switchButton1.StopBackColor = System.Drawing.Color.LightPink;
this.switchButton1.StopText = "Start";
そうかといってプロパティの値を固定するのも問題があります。なぜなら、Start/Stopでは無くON/OFFボタンとしても使いたいこともあるからです。
this.switchButton1.IsStart = true;
this.switchButton1.StartBackColor = System.Drawing.Color.LightGreen;
this.switchButton1.StartText = "OFF";
this.switchButton1.StopBackColor = System.Drawing.Color.LightYellow;
this.switchButton1.StopText = "ON";
デザイナで表示されるとりあえずのデフォルト値をSwitchButton.csクラスに組み込む方法を知りたいです。




// ***** SwitchButtonのソースコード *****
// ソースコード中のInit()メソッドをデザイナのとりあえずのデフォルト値に反映したい
// Init()メソッドを適切な場所で実行できるようにすればよいのでしょうか?
// あるいは、適切なイベントを定義すればよいのでしょうか?

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace Lib
{
namespace UserControl
{
/// <summary>
/// SwitchButton の概要の説明です。
/// </summary>
public class SwitchButton : System.Windows.Forms.Button
{
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = null;

public SwitchButton()
{
// この呼び出しは、Windows.Forms フォーム デザイナで必要です。
InitializeComponent();

// TODO: InitializeComponent 呼び出しの後に初期化処理を追加します。
}

/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region コンポーネント デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
//
// SwitchButton
//
this.Click += new System.EventHandler(this.Switch);

}
#endregion

private bool isStart;
/// <summary>
/// Start状態 = true Stop状態 = false
/// </summary>
public bool IsStart
{
get
{
return isStart;
}
set
{
isStart = value;
}
}
private System.Drawing.Color startBackColor;
public System.Drawing.Color StartBackColor
{
get
{
return startBackColor;
}
set
{
startBackColor = value;
}
}
private System.Drawing.Color stopBackColor;
public System.Drawing.Color StopBackColor
{
get
{
return stopBackColor;
}
set
{
stopBackColor = value;
}
}
private string startText = "Stop";
/// <summary>
/// Start状態に表示するText
/// </summary>
public string StartText
{
get
{
return startText;
}
set
{
startText = value;
}
}
private string stopText = "Start";
/// <summary>
/// Stop状態に表示するText
/// </summary>
public string StopText
{
get
{
return stopText;
}
set
{
stopText = value;
}
}
public override string Text
{
get
{
return isStart ? startText : stopText;
}
}
public override Color BackColor
{
get
{
return isStart ? startBackColor : stopBackColor;
}
}

/// <summary>
/// ボタンを切り替える
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Switch(object sender, System.EventArgs e)
{
isStart = isStart ? false : true;
this.Refresh();
}

/// <summary>
/// デフォルト値
/// </summary>
private void Init()
{
this.startText = "Stop";
this.stopText = "Start";
this.startBackColor = Color.LightBlue;
this.stopBackColor = Color.LightPink;
this.isStart = false;
}


}
}
}
Hasumi
ベテラン
会議室デビュー日: 2002/07/23
投稿数: 78
お住まい・勤務地: 神奈川・東京
投稿日時: 2004-12-18 18:02
DefaultValueAttribute クラスを調べてみてください。

あと、カスタムコンポーネントについてとか
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2004-12-18 19:25
Hasumiさんご回答ありがとうございます。

[DefaultValue(false)]属性を追加することで問題が解決しました。
コンパイルしてみるとバッチリデフォルト値が設定できていました。

ところで、C#の本ばかり見ていると「属性」を見落としてしまいます。
わたしは、いつまでも「属性」初心者のままです。
みなさんは、どうやって便利な属性を探し出しているのですか?
(わたしのMSDNライブラリの探し方がへたくそなのかも知れませんが)
たくボン
会議室デビュー日: 2005/01/26
投稿数: 2
投稿日時: 2005-01-26 04:43
System.Attributeからの派生クラスを表示すれば全ての属性が表示されると思いますよ。
全ての属性はAttributeから継承されているので、MSDNライブラリで必要なクラスを検索することができれば、その継承元のクラスについても調べてみるのが一番いい方法だと思います。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2005-01-31 21:09
ご回答ありがとうございます。
確認できました。
1

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