はじめてのWebカスタムコントロールの作成
前述のような場合に有用なのが「ユーザコントロール」です。では、改行をbrに変換する機能を持ったラベルを作ってみましょう。
まず新しいプロジェクトを作成します。
そうするとサンプルのコントロールのソースが表示されるので、これを変更する形で実装してみましょう。
もともとのサンプルクラスは、WebControlというクラスを継承して直接新しいコントロールを作成しています。ただし、このようにWebControlを継承して、一からコントロールを作成する機会はそう多くありません。
今回もLabelコントロールの動きを制御したいというだけですので、Labelを継承元にし、クラスの名前は「BRLabel」とします。
namespace controlcs { [ToolboxData("<{0}:BRLabelCS runat=server></{0}:BRLabelCS>")] public class BRLabelCS : Label { } }
<ToolboxData("<{0}:BRLabelVB runat=server></{0}:BRLabelVB>")> _ Public Class BRLabelVB Inherits Label End Class
枠組みを作るには、これだけでOKです。ToolBoxData属性は、.aspxのファイルをドラッグ&ドロップ編集する際に表示される名称、属性のデフォルトになるので、必ず指定するようにします。
ここで、実際に.aspxファイルにコントロールを貼り付けて、Labelと同じ動きをしているかを確認してみたいと思います。
.aspxファイルを開いてツールボックスを確認すると、先ほど作成したBRLabelCS(C#の場合)とBRLabelVB(VB.NETの場合)が表示されていると思います。同じソリューションにプロジェクトを設定していれば、後はこれをドラッグ&ドロップするだけです。

これで設定は完了です。データがすべてのコントロールに設定されるように変更して、実行してみましょう。
this.Label1.Text = DBからのデータ; this.BRLabelCS1.Text = DBからのデータ; this.BRLabelVB1.Text = DBからのデータ;
Me.Label1.Text = DBからのデータ Me.BRLabelCS1.Text = DBからのデータ Me.BRLabelVB1.Text = DBからのデータ

どちらのユーザーコントロールとも、Labelと同じ動きをしていることが確認できました。さて、それでは本題のBR変換を行います。
WebControlでは、自分のもっている情報の出力をRenderContentsというメソッドで行います。今回はそれをオーバーライドして表現を変更します。以下のようなコードを追加します。
protected override void RenderContents(HtmlTextWriter writer) { writer.Write(this.Text.Replace("\r\n", "<br />")); }
Protected Overrides Sub RenderContents( _ ByVal writer As System.Web.UI.HtmlTextWriter) writer.Write(Me.Text.Replace(vbNewLine, "<br />")) End Sub
改行マークを置き換える部分は先ほどと同じです。HtmlTextWriterはファイルの出力で利用するStreamWriterなどと同じように、HTMLへの出力を行うライターです。そのライターに、文字を置き換えたものを出力しています。
それでは実行してみましょう。

このように無事改行されるようになりました。
手動でコントロールのDLLを関連付ける方法
今回は、Visual StudioのIDEを利用して、コントロールをドラッグ&ドロップで設定しました。それでは手動で行うにはどうしたらよいのでしょうか?
「bin」フォルダを作成し、コントロールを含むDLLを格納します。

格納したDLLファイルをRegisterディレクティブとして、記述します。
<%@ Register Assembly="controlcs" Namespace="controlcs" TagPrefix="cc1" %> <%@ Register Assembly="controlvb" Namespace="controlvb" TagPrefix="cc2" %>
次に、ラベルの代わりに利用する箇所にコントロールを配置します。
<cc1:BRLabelCS ID="BRLabelCS1" runat="server" /> <cc2:BRLabelVB ID="BRLabelVB1" runat="server" />
これで完了です。

今回ここで設定した内容は、以下の図のような関係になっています。

アセンブリ名の指定と同時に行ったTagPrefixという指定を、BRLabelCSなどの利用時に使っています。標準のLabelコントロールなどは<asp:Label>などのプレフィックスを持っているので、これを暗黙のうちに行っていると考えてください。

![C#の場合:[Visual C#]→[Windows]→[Webコントロールライブラリ] C#の場合:[Visual C#]→[Windows]→[Webコントロールライブラリ]](http://cz-cdn.shoeisha.jp/static/images/article/402/03_s.jpg)
![VB.NETの場合:[Visual Basic]→[Windows]→[Webコントロールライブラリ] VB.NETの場合:[Visual Basic]→[Windows]→[Webコントロールライブラリ]](http://cz-cdn.shoeisha.jp/static/images/article/402/04_s.jpg)

