.NET TIPS

[ASP.NET]ユーザー・コントロールで属性を設定するには?

山田 祥寛
2004/10/29

 「TIPS:[ASP.NET]サイト共通のレイアウト部分を部品化するには?」では、共通のレイアウト部品を定義するユーザー・コントロールについて紹介した。このTIPSでは、タグ名のみを持つ、ごく単純なユーザー・コントロールを作成してみたが、これではあらかじめ決められた処理を実行する、旧来のインクルード・ファイルとさほど変わらないので、ユーザー・コントロールを採用するメリットが見えにくかったかもしれない。

 ユーザー・コントロールを採用することの意義はいくつか存在するが、その大きな1つに、属性値を引き渡すことでその挙動を簡単に制御できる、という点が挙げられる。状況によって挙動を切り替えたい、将来的に設定値を変更したい、などの可能性がある場合には、属性としてパラメータ化しておくことで、より部品としての汎用性を向上させることができるだろう。

 本稿では、前述のTIPSで扱ったユーザー・コントロールheader_cs.ascx(もしくはheader_vb.ascx)に、BgColor属性、ForeColor属性を追加してみよう。BgColor属性、ForeColor属性を介することで、ユーザー・コントロールに含まれるナビゲート・バー(Panelコントロール)の背景色、文字色を「.aspx」ファイルの側から自由に変更できるようになる。

<%@ Control Language="C#" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">

// BgColor属性の値を格納するプライベート変数
private Color _bgcolor;

// ForeColor属性の値を格納するプライベート変数
private Color _forecolor;

// BgColorプロパティの定義
public String BgColor {
  set {
    _bgcolor=Color.FromName(value);
  }
}

// ForeColorプロパティの定義
public String ForeColor {
  set {
    _forecolor=Color.FromName(value);
  }
}

void Page_Load(Object sender, EventArgs e){
  // PanelコントロールのBackColor属性、ForeColor属性に
  // 対応するプライベート変数の値をセット
  pnl.BackColor=_bgcolor;
  pnl.ForeColor=_forecolor;
  SqlConnection db=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
  SqlCommand objCom=new SqlCommand("SELECT url,title,target FROM menu ORDER BY indexNumber ASC",db);
  db.Open();
  SqlDataReader objDr=objCom.ExecuteReader();
  while(objDr.Read()){
    HyperLink ctrl=new HyperLink();
    ctrl.NavigateUrl=objDr.GetString(0);
    ctrl.Text=objDr.GetString(1);
    ctrl.Target=objDr.GetString(2);
    LiteralControl ctrl2=new LiteralControl();
    ctrl2.Text="&nbsp;&nbsp;|&nbsp;&nbsp;";
    pnl.Controls.Add(ctrl);
    pnl.Controls.Add(ctrl2);
  }
}
</script>
<asp:Image id="img" runat="Server" Height="90" Width="150"
  ImageUrl="http://www.wings.msn.to/image/wings.jpg" AlternateText="Wings" />
<br />
<asp:Panel id="pnl" runat="Server"
  BorderStyle="Outset" BackColor="#FFFFFF" ForeColor="#000000"
  Wrap="False" width="500" Height="20" />
header_cs.ascxにBgColor属性、ForeColor属性を追加したもの(C#:header_prp_cs.ascx)
 
<%@ Control Language="VB" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">

' BgColor属性の値を格納するプライベート変数

Private _bgcolor As Color

' ForeColor属性の値を格納するプライベート変数

Private _forecolor As Color

' BgColorプロパティの定義
Public WriteOnly Property BgColor As String
  Set
    _bgcolor=Color.FromName(Value)
  End Set
End Property

' ForeColorプロパティの定義
Public WriteOnly Property ForeColor As String
  Set
    _forecolor=Color.FromName(Value)
  End Set
End Property

Sub Page_Load(sender As Object, e As EventArgs)
  ' PanelコントロールのBackColor属性、ForeColor属性に
  ' 対応するプライベート変数の値をセット
  pnl.BackColor=_bgcolor
  pnl.ForeColor=_forecolor
  Dim db As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
  Dim objCom As New SqlCommand("SELECT url,title,target FROM menu ORDER BY indexNumber ASC",db)
  db.Open()
  Dim objDr As SqlDataReader=objCom.ExecuteReader()
  Do While objDr.Read()
    Dim ctrl As New HyperLink()
    ctrl.NavigateUrl=objDr.GetString(0)
    ctrl.Text=objDr.GetString(1)
    ctrl.Target=objDr.GetString(2)
    Dim ctrl2 As New LiteralControl()
    ctrl2.Text="&nbsp;&nbsp;|&nbsp;&nbsp;"
    pnl.Controls.Add(ctrl)
    pnl.Controls.Add(ctrl2)
  Loop
End Sub
</script>
<asp:Image id="img" runat="Server" Height="90" Width="150"
  ImageUrl="http://www.wings.msn.to/image/wings.jpg" AlternateText="Wings" />
<br />
<asp:Panel id="pnl" runat="Server"
  BorderStyle="Outset" BackColor="#FFFFFF" ForeColor="#000000"
  Wrap="False" width="500" Height="20" />
header_vb.ascxにBgColor属性、ForeColor属性を追加したもの(VB.NET:header_prp_vb.ascx)

 ユーザー・コントロールに対して属性を定義するには、単にそのページでプロパティを定義しておけばよい。前述のTIPSからの追記部分であるコード太字部分に注目していただきたい。

 C#およびVB.NETのプロパティの基本的な構文は、以下のとおりだ。

private データ型 プライベート変数名;

public データ型 プロパティ名 {
  get {
    return プロパティ値を返す任意の式;
  }
  set {
    プライベート変数名=変数にセットする任意の値;
  }
}
プロパティの基本的な構文(C#の場合)
 
Private プライベート変数名 As データ型

Public Property プロパティ名 As データ型
  Get
    Return プロパティ値を返す任意の式
  End Get
  Set
    プライベート変数名=変数にセットする任意の値
  End Set
End Property
プロパティの基本的な構文(VB.NETの場合)

 value(C#の場合。VB.NETではValue)は、プロパティに対して渡された値を表す暗黙に定義される変数だ。そのままプライベート変数に渡してもよいし、サンプルのように値を加工したうえで格納することもできる。

 また本稿のサンプル・プログラムのように、作成した属性に対して値の設定だけを行う場合には、プロパティを書き込み専用とすることもできる。

 書き込み専用のプロパティの定義は、C#の場合は、単純にgetアクセサを省略すればよいが、VB.NETの場合にはGetブロックを削除したうえで、WriteOnlyキーワードを付加する必要があるので注意すること。

 これで、ユーザー・コントロールの属性を公開する準備は整った。.aspxファイル側は何も修正することなく、BgColor属性、ForeColor属性を付加することができる。

<%@ Page Language="VB" ContentType="text/html" %>
<%@ Register Tagprefix="win" Tagname="NaviHeader" Src="header_prp_cs.ascx" %>
<html>
<head>
<title>ユーザー・コントロール</title>
</head>
<body>
<form runat="Server">
 <win:NaviHeader id="navi" runat="Server"
    BgColor="Beige" ForeColor="Black" />
  ……以下にコンテンツが入ります……
</form>
</body>
</html>
BgColor属性、ForeColor属性に対応した.aspxファイル(usrCtrl.aspx)

 作成したユーザー・コントロールを示す要素が<win:NaviHeader>である。この要素の属性に対する設定は、コードではプロパティへの設定に置き換えられるというわけである。

 上記の.aspxファイルを実行したのが、次の画面である。

BgColor属性、ForeColor属性に対応した.aspxファイルの実行結果
メニュー背景色がベージュに変更されていることが確認できる。

 表示されているメニューの文字部分は、それがリンクのため文字色の設定による変化はないが、背景色がベージュに変更されていることが確認できる。End of Article

カテゴリ:Webフォーム 処理対象:ユーザー・コントロール
関連TIPS:[ASP.NET]サイト共通のレイアウト部分を部品化するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]サイト共通のレイアウト部分を部品化するには?
[ASP.NET]Webフォーム・ページの一部分を断片的にキャッシングするには?
[ASP.NET]ユーザー・コントロールでパーソナライズ可能なWebパーツを作成するには?
[ASP.NET]PropertyGridEditorPartコントロールでカスタム・プロパティを編集するには?
ファイルやディレクトリの読み取り専用属性を確認/設定/解除するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間