|
.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=" | ";
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=" | "
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ファイルの実行結果 |
メニュー背景色がベージュに変更されていることが確認できる。 |
表示されているメニューの文字部分は、それがリンクのため文字色の設定による変化はないが、背景色がベージュに変更されていることが確認できる。
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間