GUIフォーム画面で業務用のプログラムを作成する際に注意する点は「できないことをさせない」、「間違えないように配慮する」と考えています。
よくあるのが、区分系を入力するのにテキストボックスで区分を入力させて、区分の名称をラベルに表示するようなことがある。
入力者側に視点では区分はあまり重要視していないものは「入力させないで欲しい」そうな。
そんな時はコンボボックスコントロールで「選択できるものだけを選択させる」、「入力」ではなく「選択」が重要。
こんなコンボボックス(ComboBox)の小技を記録しておく。
■■■ ComboBoxの内容を編集できないようにする ■■■
ComboBoxの「DropDownStyleプロパティ」を「DropDownList」にする。
こうすると選択対象になっているデータをユーザーがGUIから編集できません。
「DropDown」の場合はクリックすると文字色が反転して編集ができます。
■■■ ComboBoxに区分と区分名を格納して運用する ■■■
よくあることですが、
区分:0 区分名:~しない
区分:1 区分名:~する
と言ったスイッチ式の場合は無理にComboBoxを使用するより、CheckBoxのほうが有用であると思いますが、
区分:0 区分名:Aをしない、Bもしない
区分:1 区分名:Aはする、Bはしない
区分:2 区分名:Aはしない、Bはする
区分:3 区分名:Aはする、Bはする
のように要素が2つあったり、選択項目そのものが複数(3以上)ある場合等はいろいろ考える必要がある。
無論、CombpBoxで表現できます。
選択アイテムに [区分]:[区分名] の形式で格納する。
このように3項を選択する場合なんかで使用するようにしてます。
利点は選択結果の文言に区分の数値が含まれているのでデータベース等にセットする場合には区分部分を抜き出してそのまま格納すればいいということです。
区分:0 区分名:新規
区分:1 区分名:編集
区分:9 区分名:削除
のように区分が連番ではなく飛んでしまっている場合ではComboBoxのインデックスを取得しても最後の区分とインデックス値が異なってしまい、いろいろと小細工が必要になってしまいます。
選択アイテムに [区分]:[区分名] の形式で格納することにより、「途中で区分内容の増減や区分値自体が数値以外の値を取るような場合」でも容易に対応が可能です。
▲1点注意事項は
区分と区分名の間に区切り文字を統一的に設けることです。
ロジックを組み上げる場合に統一したほうが処理や理解が非常に楽になります。
私の場合は「:」を利用しています。
★取り出す場合は
Mid(CType(ComboBox1.Text, String), 1, CType(ComboBox1.Text, String).ToString.IndexOf(“:”))
で区切り文字までの文字位置を求めてMid関数で取り出します。
★データベース等から読み出す場合はComboBoxの選択する位置がわかりませんが、
ComboBox1.SelectedIndex = ComboBox1.FindString([区分値] & “:”)
で選択アイテムに「区分値:」を含むものを選択するようにできます。
このテクニックの注意点は
区分値に重複が無いことが前提になります。
重複してしまうと、「データベース等から読み出す」場合に最初に発見された条件しか拾ってくることができないということになります。