読者です 読者をやめる 読者になる 読者になる

kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

透かし文字付きテキストボックス

Webアプリだと、jQueryなどを使用して、未入力状態のテキストボックスに対して、薄い文字でヘルプを表示させていたりしますね。その機能を、Visual C# でも使いたくなりました。で、ユーザコントロールを作成してみました。


WaterMarkTextBox.cs

using System;

namespace UserControlApp
{
    /// <summary>
    /// 透かし文字付きテキストボックス
    /// </summary>
    public class WaterMarkTextBox : System.Windows.Forms.TextBox
    {
        private String _helpText;
        private System.Drawing.Color _helpColor;

        private String _inputText;
        private System.Drawing.Color _inputColor;

        /// <summary>
        /// HelpTextプロパティ
        /// </summary>
        public String HelpText
        {
            get { return _helpText; }
            set
            {
                _helpText = value;
                UpdateText(Focused);
            }
        }

        /// <summary>
        /// HelpColorプロパティ
        /// </summary>
        public System.Drawing.Color HelpColor
        {
            get { return _helpColor; }
            set
            {
                _helpColor = value;
                UpdateText(Focused);
            }
        }

        /// <summary>
        /// InputTextプロパティ
        /// </summary>
        public String InputText
        {
            get { return _inputText; }
            set
            {
                _inputText = value;
                UpdateText(Focused);
            }
        }

        /// <summary>
        /// InputColorプロパティ
        /// </summary>
        public System.Drawing.Color InputColor
        {
            get { return _inputColor; }
            set
            {
                _inputColor = value;
                UpdateText(Focused);
            }
        }

        /// <summary>
        /// コントロール作成イベント
        /// </summary>
        protected override void OnCreateControl()
        {
            base.OnCreateControl();
            _helpColor = System.Drawing.Color.LightGray;
            _inputColor = System.Drawing.SystemColors.WindowText;
            UpdateText(Focused);
        }

        /// <summary>
        /// フォーカスインイベント
        /// </summary>
        /// <param name="e"></param>
        protected override void OnEnter(EventArgs e)
        {
            //System.Console.WriteLine("--- OnEnter() ---");
            base.OnEnter(e);
            Text = _inputText;
            UpdateText(true);
        }

        /// <summary>
        /// フォーカスアウトイベント
        /// </summary>
        /// <param name="e"></param>
        protected override void OnLeave(EventArgs e)
        {
            //System.Console.WriteLine("--- OnLeave() ---");
            base.OnLeave(e);
            _inputText = Text;
            UpdateText(false);
        }

        /// <summary>
        /// テキスト内容更新
        /// </summary>
        /// <param name="focused">フォーカス状態</param>
        private void UpdateText(bool focused)
        {
            //System.Console.WriteLine("--- UpdateText() ---");

            if (!focused && string.IsNullOrEmpty(_inputText))
            {
                Text = HelpText;
                ForeColor = HelpColor;
            }
            else
            {
                Text = InputText;
                ForeColor = InputColor;
            }

            //System.Console.WriteLine(Text);
            //System.Console.WriteLine(ForeColor);
        }
    }
}

環境