Back to Top

プログラムの覚書

C# RadioGroup継承以外での作成

継承ができない場合の RadioGroupの作成例です。

 機能追加したラジオボタン

ラジオボタンにインデックスをオブジェクト値を追加したオブジェクトを作成

/// <summary>
/// 機能追加したラジオボタン
/// </summary>
class RadioButtonUp
{
    public RadioButtonUp(RadioButton rbtn)
    {
        _RadioButton = rbtn;

        this.Index = -1;
        this.Value = null;
    }

    public RadioButton Button
    {
        get
        {
            return _RadioButton;
        }
    }
    RadioButton _RadioButton = null;

    public int Index
    {
        set
        {
            _Index = value;
        }
        get
        {
            return _Index;
        }
    }
    private int _Index;

    public object Value
    {
        set
        {
            _Value = value;
        }
        get
        {
            return _Value;
        }
    }
    private object _Value;
}

RadioGroupの作成

namespace RadioGroupSample
{
    delegate void RadioGroup_onClick_Delegate(EventArgs e);

    class RadioGroup
    {
        Hashtable _ht = new Hashtable();
        GroupBox _GroupBox = null;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="sender">グループボックス</param>
        public RadioGroup(GroupBox sender)
        {
            System.Collections.ArrayList al = new System.Collections.ArrayList();

            _GroupBox = sender;

            //ラジオボタンの名前を取得し並び替える
            foreach (RadioButton rbtn in sender.Controls)
            {
                al.Add(rbtn.Name);
                rbtn.Click += new EventHandler(this._onClick);
            }
            al.Sort();

            //ラジオボタン設定
            int index = 0;
            foreach (string name in al)
            {
                RadioButton rb = (RadioButton)_GroupBox.Controls[name];
                RadioButtonUp rbup = new RadioButtonUp(rb);
                rbup.Index = index;

                _ht.Add(name, rbup);
                index++;
            }
        }

        /// <summary>
        /// インデックスの取得及び設定をします。
        /// </summary>
        public int ItemIndex
        {
            set
            {
                foreach (DictionaryEntry de in _ht)
                {
                    RadioButtonUp rb = (RadioButtonUp)de.Value;
                    if (rb.Index == value)
                    {
                        rb.Button.Checked = true;
                    }
                }
            }

            get
            {
                int index = -1;

                foreach (DictionaryEntry de in _ht)
                {
                    RadioButtonUp rb = (RadioButtonUp)de.Value;
                    if (rb.Button.Checked)
                    {
                        index = rb.Index;
                        break;
                    }
                }
                return index;
            }
        }

        /// <summary>
        /// 現在のインデックス位置の値を取得する。
        /// </summary>
        public object ItemValue
        {
            get
            {
                object val = null;

                foreach (DictionaryEntry de in _ht)
                {
                    RadioButtonUp rb = (RadioButtonUp)de.Value;
                    if (rb.Button.Checked)
                    {
                        val = rb.Value;
                        break;
                    }
                }
                return val;
            }
        }

        /// <summary>
        /// ボタン名毎に値を設定します。
        /// </summary>
        /// <param name="name"></param>
        /// <param name="val"></param>
        /// <returns></returns>
        public bool setValue(string name, object val)
        {
            bool bc = false;

            if (_ht.ContainsKey(name))
            {
                RadioButtonUp rb = (RadioButtonUp)_ht[name];
                rb.Value = val;
                bc = true;
            }

            return bc;
        }

        /// <summary>
        /// クリックイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void _onClick(object sender, EventArgs e)
        {
            RadioButton rb = (RadioButton)sender;

            if (rb.Checked)
            {
                onClick(e);
            }
        }

        public event RadioGroup_onClick_Delegate onClick = delegate (EventArgs e) { };

    }
}

呼び出し側

private void Form1_Load(object sender, EventArgs e)
{
    _radioGroup1 = new RadioGroup(groupBox1);
    _radioGroup1.onClick += RadioGroup1_onClick;

    _radioGroup1.setValue("radioButton1", 10);
    _radioGroup1.setValue("radioButton2", 20);
    _radioGroup1.setValue("radioButton3", 30);
}

RadioGroup _radioGroup1 = null;

private void button1_Click(object sender, EventArgs e)
{
    int no = _radioGroup1.ItemIndex;
    int v = (int)_radioGroup1.ItemValue;
}

public void RadioGroup1_onClick(EventArgs e)
{
    int no = _radioGroup1.ItemIndex;
}

 

C# テキストボックス(TextBox)入力制御

Visual Studio等でC#を使用してGUIアプリケーションを作成する場合に使用するTextBoxの説明です。

TextBoxで入力文字(数値・実数・カタカナ・ひらがな・全角文字・半角文字 など)制御をする際の例を記載します。

 

文字列制御関数

入力文字の制御を行いたい文字列の列挙体 InputTextType を作成します。以下の列挙体は例ですので、制御した文字列項目を追加作成して下さい。(列挙体を作成するのは汎用性をもたせるためです)

//入力文字列種別列挙体
public enum InputTextType : short
{
    // 文字(チェックなし)
    String,

    // 整数値
    Digit,

    // 全角カタカナ
    Katakana,
}

特定の文字列に含まれる文字(整数文字・全角カタカナ・TELなど)を判断する関数CheckChar()

特定の文字列を判断する関数CheckString()

を作成します。(文字チェック関数・文字列チェック関数を作成するのは、汎用性を持たせるためです)

//文字のチェックをします。
static public bool CheckChar(char c, InputTextType mode)
{
    bool bc = false;

    switch (mode)
    {
        case InputTextType.Digit:
            bc = IsHalfDigit(c);
            break;
        case InputTextType.Katakana:
            bc = IsDblKatakana(c);
            break;
        default:
            break;
    }

    return (bc);
}

//文字列のチェックをします。
static public bool CheckString(string s, InputTextType mode)
{
    bool bc = false;

    switch (mode)
    {
        case InputTextType.Digit:
            bc = IsHalfDigitStr(s);
            break;
        case InputTextType.Katakana:
            bc = IsDblKatakanaStr(s);
            break;
        default:
            break;
    }

    return (bc);
}

※文字と文字列を判断する関数等の例(IsHalfDigitIsHalfDigitStr関数等は特定文字の判断をご覧ください)

 

半角数値入力制御の例

TextBoxの入力制御は、Enter・Leave・KeyPress・KeyDownイベントで制御します。

EnterとLeaveではおもに、[ENTER]キーではなく、マウスでフォーカス移動された時のために処理しています。

KeyPressでは、特定文字列に含まれる文字以外は、入力出来ないようにしています。

KeyDownでは、[ENTER]キーを押された場合と、特殊キー(ESC・↑・↓)の処理をしています。

private void textBox1_Enter(object sender, EventArgs e)
{
    ((TextBox)sender).ClearUndo();
    ((TextBox)sender).SelectAll();
}

private void textBox1_Leave(object sender, EventArgs e)
{
    ((TextBox)sender).Undo();
}

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\b')
    {
        return;
    }

    if (!CheckChar(e.KeyChar, InputTextType.Digit))
    {
        e.Handled = true;
    }
}

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Up:
            this.ProcessTabKey(false);
            break;
        case Keys.Down:
            this.ProcessTabKey(true);
            break;
        case Keys.Tab:
            e.Handled = false;
            break;
        case Keys.Escape:
            ((TextBox)sender).Undo();
            ((TextBox)sender).ClearUndo();
            break;
        case Keys.Enter:
            bool bc = CheckString(((TextBox)sender).Text, InputTextType.Digit);
            if (bc)
            {
                ((TextBox)sender).ClearUndo();
                this.ProcessTabKey(true);
                e.Handled = false;
            }
            break;
        default:
            break;
    }
}

CheckChar()・とCheckString()のInputTextType列挙体の値を変えることにより入力文字列を制御できます。

以上TextBoxでの入力制御の方法の例です。

※ちなみに以上の制御では、クリップボードによるコピーは避けられません。