SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

改行やリンクをタグに自動置換するコントロール作成

簡単なWebカスタムコントロールの作成方法

さらに一歩進んだLabelコントロール

 BR以外にも、例えば「http://codezine.jp/」というURLが文章中に入っている場合に、自動的にリンクに変換したいといった要望があるかと思います。この場合は、以下のようなコードでURLをリンクに変換することができます。

URL文字列を<a>タグ文字列に変換する(C#)
public static string UrlToLink(string val)
{
    Regex regex = new Regex( _
        @"http:\/\/[a-zA-Z0-9\.\$\,\;\:\&\=\?\!\*\~\@\#_\(\)\-\%\/\+]+");
    string tempstring = regex.Replace(val, delegate(Match match)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("<a href=\"");
        sb.Append(match.Value);
        sb.Append("\">");
        sb.Append(match.Value);
        sb.Append("</a>");
        return sb.ToString();
    });
    return tempstring;
}
URL文字列を<a>タグ文字列に変換する(VB.NET)
Public Shared Function UrlToLink(ByVal val As String) As String
    Dim regex As New Regex( _
        "http:\/\/[a-zA-Z0-9\.\$\,\;\:\&\=\?\!\*\~\@\#_\(\)\-\%\/\+]+")
    Dim tempstring As String = regex.Replace(val, _
        New MatchEvaluator(AddressOf HttpLinktoAnchor))
    Return tempstring
End Function

Public Shared Function HttpLinktoAnchor(ByVal match As Match) As String
    Dim sb As New StringBuilder()
    sb.Append("<a href=""")
    sb.Append(match.Value)
    sb.Append(""">")
    sb.Append(match.Value)
    sb.Append("</a>")
    Return sb.ToString()
End Function

 このメソッドも利用して、リンク変換とBR変換を同時に行うユーザコントロールSpecialLabelを作ってみましょう。

 BR変換と、Link変換を行うかどうかの判断用にプロパティを作成します。

BR変換、Link変換を行うかどうかのプロパティ(C#)
private bool BR変換_ = false;

[DefaultValue(false)]
public bool BR変換
{
    get { return BR変換_; }
    set { BR変換_ = value; }
}

private bool Link変換_ = false;
[DefaultValue(false)]
public bool Link変換
{
    get { return Link変換_; }
    set { Link変換_ = value; }
}
BR変換、Link変換を行うかどうかのプロパティ(VB.NET)
Private BR変換_ As Boolean
<DefaultValue(False)> _
Public Property BR変換() As Boolean
    Get
        Return Me.BR変換_
    End Get
    Set(ByVal value As Boolean)
        Me.BR変換_ = value
    End Set
End Property

Private Link変換_ As Boolean
<DefaultValue(False)> _
Public Property Link変換() As Boolean
    Get
        Return Me.Link変換_
    End Get
    Set(ByVal value As Boolean)
        Me.Link変換_ = value
    End Set
End Property

 判断用のプロパティを見ながら変換を行っていくRenderContentsを作成します。

変換を行うRenderContents(C#)
protected override void RenderContents(HtmlTextWriter writer)
{
    //変換元stringを取り出す
    string temp = this.Text;
    //link変換する場合には変換ロジックを呼び出す
    if (this.Link変換 == true)
    {
        temp = UrlToLink(temp);
    }
    //BR変換する場合にはReplaceする
    if (this.BR変換 == true)
    {
        temp = temp.Replace("\r\n", "<br />");
    }
    writer.Write(temp);
}
変換を行うRenderContents(VB.NET)
Protected Overrides Sub RenderContents(ByVal output As HtmlTextWriter)
    '変換元stringを取り出す
    Dim temp As String = Me.Text
    'link変換する場合には変換ロジックを呼び出す
    If (Me.Link変換 = True) Then

        temp = UrlToLink(temp)
    End If
    'BR変換する場合にはReplaceする
    If (Me.BR変換 = True) Then

        temp = temp.Replace(vbNewLine, "<br />")
    End If
    output.Write(temp)
End Sub

 .aspxファイルにテスト用のコードを記述します。

SpecialLabelを利用する.aspxコード
SpecialLabelCS:
<cc1:SpecialLabelCS ID="SpecialLabelCS1" runat="server" BR変換="True"
    Link変換="True" Text="http://codezine.jp/
http://www.wankuma.com"></cc1:SpecialLabelCS><br />
SpecialLabelVB:
<cc2:speciallabelvb id="SpecialLabelVB1" runat="server" br変換="True"
 link変換="True" Text= "http://codezine.jp/
http://www.wankuma.com"></cc2:speciallabelvb>

 実行結果は次のようになります。リンクの生成と、改行の設定が同時に行われていることを確認できました。

 プロパティを変更することで、変換の有無を制御できるので、かなり使い勝手のよいラベルコントロールが出来上がりました。

おわりに

 Webコントロールを一から自作しようとすると、かなり難しく高い壁のように思ってしまいます。しかし今回のように、既存のコントロールの挙動を変更する形での作成は、非常に簡単にできることが分かっていただけたのではないでしょうか。

 ASP.NETの良さはそのコーディング量の少なさにあります。今回のコントロールを使ってデータバインディングを行うことにより、コーディング0を実現できます。ぜひ皆さんも、いろいろなWebカスタムコントロールを作成して、ASP.NETでのプログラミングをより便利にしてください。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

中 博俊(ナカ ヒロトシ)

大阪でフリーのソフトウェアエンジニア兼テクニカルライターとして日々新技術で楽しんでいる。MSMVP for C# ブログ:http://blogs.wankuma.com/naka/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/402 2006/06/01 00:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー