- ベストアンサー
ユーザーコントロール内の検証
いつもお世話になっております。 環境:ASP.NET、C#、Web Label+TextBoxのような.ascxを作った場合、こっちのUserControlでは文字数制限、あっちのUserControlでは半角制限をするやり方を教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
お世話になります。 Web カスタム コントロールを使われてみてはいかがでしょう。 Web カスタムコントロールについては 参考URL や、Web カスタム コントロール で検索すれば沢山情報が見つかると思います。 下の例は、ユーザーが文字を入力する度に サーバーへポストして文字のチェックを行い TextCheckMode で指定した文字でなければ ForeColor を変えるという TextBox を拡張したコントロールです。 参考URL に書いてありますが、ASP.NET のプロジェクトとは別に同一ソリューション内の別の クラスライブラリのプロジェクトに作成します。 クラスライブラリのプロジェクトをビルドすると ASP.NET 側での利用が可能になります。 いずれにせよ、使用される場合は参考 URL を参照して下さい。(これ以上の説明はかなりしんどいので) ご参考までに。 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 ClassLibrary1 { [ToolboxData("<{0}:MyWebTextBox runat=server></{0}:MyWebTextBox>")] public class MyWebTextBox : System.Web.UI.WebControls.TextBox { // コンストラクタ public MyWebTextBox() : base(){ base.AutoPostBack = true; } // チェックするモード protected CheckMode m_checkMode = CheckMode.NONE; public CheckMode TextCheckMode { get { return this.m_checkMode; } set { this.m_checkMode = value; } } protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); base.ForeColor = System.Drawing.Color.Black; switch (this.m_checkMode) { case CheckMode.ENGLISH: // 英字チェック System.Text.RegularExpressions.Regex regexEn = new System.Text.RegularExpressions.Regex(@"^[a-zA-Z]+$"); if (!regexEn.IsMatch(base.Text)) { base.ForeColor = System.Drawing.Color.Red; } break; case CheckMode.NUMERIC: // 数値チェック System.Text.RegularExpressions.Regex regexNu = new System.Text.RegularExpressions.Regex(@"^[0-9]+$"); if (!regexNu.IsMatch(base.Text)) { base.ForeColor = System.Drawing.Color.Green; } break; default: break; } } } // チェックするモードの列挙体 public enum CheckMode { NONE = 0, ENGLISH = 1, // 英字 NUMERIC = 2 // 数字 } }