2009年5月23日土曜日

asp.netのカスタムコントロールをVisual Stuidoのデザイナで編集する方法


流れとしては、
1.ASP.NETサーバーコントロールを含むアセンブリ(exe,dll)を作成する
2.Visual Studioのツールボックスで、右クリック→アイテムの選択で、参照ボタンを押して1.で作成したアセンブリを選択。
→ツールボックスに歯車アイコンでカスタムコントロールが表示される。
3.上の(2.の)操作によって出てきた、歯車アイコンをaspxやascxに張り付ける。

ふつうは、コントロール用のアセンブリと利用するWebプロジェクトはアセンブリを分けますが、一緒でもちょっとは動くみたい。
でも、Webプロジェクトとカスタムコントロールのアセンブリが一緒だと、デザイン時のレンダーとか、プロパティセットが正しく表示できないみたい。
(コントロールの描画エラー-Label4 ハンドルされていない例外が発生しました。'SANITIZE'をプロパティ'DisplayMode'で設定できませんでした。みたいな表示となる。)
アセンブリを分けてれば、こんなエラーは出ないんだけど。。。しょうがないのかなぁ。



ま、しょうがないとして、
今回は、カスタムのLabelコントロールを元にカスタムコントロールを作成します。Labelコントロールに2個プロパティを追加します。
1個は、表示方法(そのまま表示/サニタイズ表示/タグ抜き表示)もう1個は、改行文字変換(改行文字をBR変換するかどうか)です。


カスタムラベルのソースはこんな感じ。
各メタデータの意味は、以下のURLを参考になります。
http://msdn.microsoft.com/ja-jp/library/ms178658(VS.80).aspx


----ここからMyCustomControl.cs------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebControlTest.WebParts
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:Label runat=server></{0}:Label>")]
public class Label : System.Web.UI.WebControls.Label
{
/// <summary>
/// 文字列の変換指定列挙子
/// </summary>
public enum TranslateString
{
NONE,
SANITIZE,
DELETE_TAG
}

/// <summary>
/// 改行変換の列挙子
/// </summary>
public enum TranslateNewLine
{
NONE,
BR_TRANSLATION
}

private TranslateString displayMode=TranslateString.NONE;
private TranslateNewLine newLineMode=TranslateNewLine.NONE;

[Bindable(true)]
[Category("Appearance")]
[Description("文字変換")]
[DefaultValue("NONE")]
[Localizable(true)]
public TranslateString DisplayMode
{
get { return displayMode; }
set { displayMode = value; }
}

[Bindable(true)]
[Category("Appearance")]
[Description("改行モード変換")]
[DefaultValue("NONE")]
[Localizable(true)]
public TranslateNewLine NewLineMode
{
get { return newLineMode; }
set { newLineMode = value; }
}

protected override void RenderContents(HtmlTextWriter output)
{
string outputText = Text;
switch (displayMode)
{
case TranslateString.SANITIZE:
outputText = System.Web.HttpUtility.HtmlEncode(outputText);
break;
case TranslateString.DELETE_TAG:
outputText = System.Text.RegularExpressions.Regex.Replace(outputText, "<[^>]*>", "");
break;
default:
break;
}
switch (newLineMode)
{
case TranslateNewLine.BR_TRANSLATION:
outputText = outputText.Replace("\r\n", "<br>").Replace("\r", "<br>").Replace("\n", "<br>");
break;
}
output.Write(outputText);
}
}
}
----ここまでMyCustomControl.cs------

0 件のコメント: